2017-02-24 19 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

感谢您的详细的答案和简短的演示!很有帮助! –