2017-02-24 46 views
0

對於針對代理運行測試並將Jacoco代理安裝到此目標代理的場景。 jacoco會報告目標代理的預充方法的代碼覆蓋率嗎?jacoco代理是否報告另一個代理預定義的代碼覆蓋範圍

+1

不清楚是什麼的問題。 – RamPrakash

+0

@RamPrakash每個javaagent都有一個'premain'方法,JVM加載代理。我問,如果我提供兩個代理商,第一個是Jacoco,第二個是代理商。第二個代理的'premain'方法是否考慮到了代碼覆蓋率,由jacoco代理 –

回答

1

Javaagents按照它們在命令行中指定的順序進行應用。如果首先指定了JaCoCo代理,則它的檢測適用於所有後續代理。

因此,如果您想要涵蓋Java代理更改或添加的任何代碼的覆蓋範圍,則應該在JaCoCo之後放置這些代碼。

+0

感謝這個答案,我明白如果我想讓代碼覆蓋另一個代理,我需要首先在命令行中指定jacoco代理。但我的問題是,問第二個代理的'premain'方法是否由代碼覆蓋率的jacoco代理報告?我在本地嘗試了一個實驗,我發現jacoco的報告不包括第二個代理的代碼覆蓋範圍。因此,試着弄清楚jacoco代理是否會報告這個部分? –

+1

@ Y.Feng是的,它會 - 我已經添加了答案,包含示例:http://stackoverflow.com/a/42480303/244993 – Godin

1

JaCoCo代理工具和記錄在其後加載的類的執行情況。 Java代理按照它們在命令行中指定的順序加載。因此,如果第二個代理商是在JaCoCo代理商之後指定的,那麼JaCoCo將對其進行監管並記錄其執行情況。下面是例如:

src/main/java/Premain.java

import java.lang.instrument.Instrumentation; 

public class Premain { 
    public static void premain(String args, Instrumentation inst) { 
    System.out.println("Hello world"); 
    } 
} 

空測試src/test/java/Test.java只是爲了能夠用它來執行代理,不執行直接的藥劑的代碼:

import org.junit.Test 

public class Test { 
    @Test 
    public void test() { 
    } 
} 

pom.xml

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>org.example</groupId> 
    <artifactId>example</artifactId> 
    <version>0.1-SNAPSHOT</version> 

    <dependencies> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>4.12</version> 
    </dependency> 
    </dependencies> 

    <properties> 
    <argLine>-javaagent:target/${project.build.finalName}.jar</argLine> 
    </properties> 

    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-jar-plugin</artifactId> 
     <version>3.0.2</version> 
     <configuration> 
      <archive> 
      <manifestEntries> 
       <Premain-Class>Premain</Premain-Class> 
      </manifestEntries> 
      </archive> 
     </configuration> 
     </plugin> 

     <plugin> 
     <groupId>org.jacoco</groupId> 
     <artifactId>jacoco-maven-plugin</artifactId> 
     <version>0.7.9</version> 
     </plugin> 

     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-surefire-plugin</artifactId> 
     <version>2.19.1</version> 
     <executions> 
      <execution> 
      <!-- to be able to use agent that was built --> 
      <id>default-test</id> 
      <phase>verify</phase> 
      </execution> 
     </executions> 
     </plugin> 
    </plugins> 
    </build> 

</project> 

執行mvn clean jacoco:prepare-agent verify jacoco:report將在目錄target/site/jacoco生產報告:

report

+0

感謝您的詳細的答案和簡短的演示!很有幫助! –