对于针对代理运行测试的方案,并且Jacoco代理已检测到此目标代理。 jacoco会报告目标代理的premain方法的代码覆盖率吗?
答案 0 :(得分:1)
Javaagents按照在命令行中指定的顺序应用。如果首先指定了JaCoCo代理,则其检测将应用于之后的所有代理。
因此,如果要包含Java代理更改或添加的任何代码的覆盖范围,则应将这些代码放在JaCoCo之后。
答案 1 :(得分: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
中生成报告: