JaCoCo不会执行你的测试,它只是记录有关执行情况的信息。因此,测试的执行,包括单个测试的情况,完全取决于您用于执行测试的工具,而这些工具在您的问题中不幸没有提及。
如果您使用Maven作为构建工具,则测试的执行通常由maven-surefire-plugin
完成和控制,该插件具有选项test
以运行单个测试。以下是示例:
src/main/java/Example.java
:
public class Example {
public void doSomething(int p) {
if (p == 1) {
a();
} else {
b();
}
}
private void a() {
System.out.println("a");
}
private void b() {
System.out.println("b");
}
}
src/test/java/ExampleTest.java
:
import org.junit.Test;
public class ExampleTest {
@Test
public void test1() {
new Example().doSomething(1);
}
@Test
public void test2() {
new Example().doSomething(2);
}
}
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>1.0-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.20.1</version>
</plugin>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.7.9</version>
<executions>
<execution>
<id>default-prepare-agent</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>default-report</id>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
执行命令
mvn clean verify -Dtest=ExampleTest#test1
将在目录
target/site/jacoco
生成以下报告:
![coverage of test1](https://istack.dev59.com/3IImF.webp)
执行mvn clean verify -Dtest=ExampleTest#test2
将产生以下结果:
![coverage of test2](https://istack.dev59.com/7kzJr.webp)
这段内容涉及编程,展示了关于test1
和test2
的覆盖率。
相比之下,执行mvn clean verify
命令会运行所有测试,并产生以下结果:
![coverage of all tests](https://istack.dev59.com/hnOG0.webp)
关于使用
clean
的说明:文件
target/jacoco.exec
包含执行信息,并用于生成报告(参见
代理选项destfile
和
相应的jacoco-maven-plugin
参数)。默认情况下,JaCoCo代理会将数据追加到这些文件中(参见
代理选项append
和
相应的jacoco-maven-plugin
参数),因此在此示例中使用
clean
以防止在此文件中积累有关先前执行的数据。
如果您使用
Gradle,则其也
具有类似的功能-给定相同的源代码和
build.gradle
:
apply plugin: 'java'
apply plugin: 'jacoco'
repositories {
mavenCentral()
}
dependencies {
testCompile 'junit:junit:4.12'
}
执行
gradle clean test --tests ExampleTest.test1 jacocoTestReport
将生成报告,其中包含
test1
的覆盖情况,与Maven的情况相同。
与Maven的示例类似,此示例中使用
clean
来防止在文件
build/jacoco/test.exec
中累积有关先前执行的数据 -
请参阅JaCoCo Gradle Plugin
的append
属性。
如果您使用
Eclipse IDE,则有
EclEmma Eclipse插件将JaCoCo集成到Eclipse IDE中,并从Oxygen(4.7)版本开始默认包含在“Java开发人员的Eclipse IDE”中。使用它,您还可以在Eclipse IDE中获得单个测试的覆盖范围 - 在编辑器中,右键单击测试名称以获取上下文菜单,然后选择“Coverage As -> JUnit Test”。
mvn clean verify -Dtest=MyTestClassName#MyTestMethodName
没有在target
目录中创建任何测试报告或site
文件夹。没有错误,构建成功完成,该目录中创建了其他文件夹。有什么想法吗? - Jack