Jacoco仅针对单个测试类生成覆盖率报告

Bha*_*gav 6 java android unit-testing gradle jacoco

那么让我们说我有一个测试

@Test
public void testA(){
    new A().doSomthing();
}
Run Code Online (Sandbox Code Playgroud)

让我们说它涵盖了一个方法doSomething(),现在在我的项目中,我有1000万个测试,而这个测试只是其中之一.一个小小的测试做得不多.

现在让我们说我的doSomething方法如下: -

public void doSomething() {
    if (var1)
        killMylSelf();
    else if (var2)
        killMyMother();
    else
        killMySelfAndMyMother();
}
Run Code Online (Sandbox Code Playgroud)

因此,您可以看到方法中有很多分支,因此调用其他具有更多分支的方法.当我跑步时,testA我希望看到我在执行的代码中错过了哪些分支,如何在不运行所有单元测试的情况下实现这一点,而且只关注我关注的测试,

当你回答这个问题而没有运行所有的单位测试时,请记住这些神奇的单词,而且只关注我关心的测试

God*_*din 7

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");
  }
}
Run Code Online (Sandbox Code Playgroud)

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);
  }
}
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

执行mvn clean verify -Dtest=ExampleTest#test1将在目录中产生以下报告target/site/jacoco

test1的覆盖范围

和执行mvn clean verify -Dtest=ExampleTest#test2将产生:

test2的覆盖范围

分别显示test1和 的覆盖范围test2

为了比较 - 由mvn clean verify产品执行所有测试:

覆盖所有测试

使用注意事项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'
}
Run Code Online (Sandbox Code Playgroud)

执行gradle clean test --tests ExampleTest.test1 jacocoTestReport将产生包含 覆盖范围的报告test1,这与 Maven 的情况相同。

类似于例如对Maven,clean在本例中使用,以防止有关文件先前执行数据的积累build/jacoco/test.exec-append的财产JaCoCo Gradle Plugin

如果您使用Eclipse IDE,那么EclEmma Eclipse 插件将 JaCoCo 集成到 Eclipse IDE 中,默认情况下包含在“Eclipse IDE for Java Developers”中,从 Oxygen (4.7) 版本开始。有了它,您还可以在 Eclipse IDE 中获得单个测试的覆盖率 - 在编辑器中右键单击测试名称以获取上下文菜单并选择“Coverage As -> JUnit Test”。