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

时间:2017-12-13 10:01:51

标签: java android unit-testing gradle jacoco

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

@Test
public void testA(){
    new A().doSomthing();
}

让我们说它涵盖了一个方法doSomething(),现在在我的项目中,我有1000万个测试,而这个测试只是其中之一。小测试没什么用。

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

public void doSomething() {
    if (var1)
        killMylSelf();
    else if (var2)
        killMyMother();
    else
        killMySelfAndMyMother();
}

因为你可以看到方法中有很多分支,因此调用其他具有更多分支的方法。当我运行testA时,我想知道在执行的代码中我错过了哪些分支,如何在没有运行所有单元测试的情况下实现这一点,而且只进行我关注的测试,

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

1 个答案:

答案 0 :(得分:3)

JaCoCo不执行您的测试,它只是记录有关执行内容的信息。因此,测试的执行(包括单个测试的情况)完全取决于您用于执行测试的工具,遗憾的是,您的问题未提及。

如果您使用 Maven 作为构建工具,则执行测试通常由maven-surefire-plugin完成并由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

执行mvn clean verify -Dtest=ExampleTest#test2将在目录test1中生成以下报告:

option test

并执行test2将产生:

coverage of test1

分别显示mvn clean verifyclean的覆盖范围。

为了进行比较 - target/jacoco.exec执行所有测试会产生:

coverage of test2

关于clean的使用情况的说明:文件build.gradle包含执行信息并用于生成报告(请参阅coverage of all testsagent option destfile)。默认情况下,JaCoCo代理会附加到此文件(请参阅corresponding parameter of jacoco-maven-pluginagent option append),以便在此示例中使用apply plugin: 'java' apply plugin: 'jacoco' repositories { mavenCentral() } dependencies { testCompile 'junit:junit:4.12' } 来防止此文件中有关先前执行的数据累积。

如果您使用 Gradle ,那么它也corresponding parameter of jacoco-maven-plugin - 给定相同的来源和gradle clean test --tests ExampleTest.test1 jacocoTestReport

test1

执行clean将生成包含build/jacoco/test.exec覆盖率的报告,这与Maven的情况相同。

与Maven的示例类似,此示例中使用//The code below write on the Application node only with TEventLogger.Create('JarvisAgent') do begin try try LogMessage(Msg, EVENTLOG_INFORMATION_TYPE, 0, 2); finally Free; end; except end; end; 来防止在文件 var CurrPage = 4; $('#pagination-long').materializePagination({ align: 'center', lastPage: 10, firstPage: 1, currentPage:CurrPage, useUrlParameter: false, onClickCallback: function(requestedPage) { console.log('Requested page from #pagination-long: ' + requestedPage); } }); - has similar ability中累积有关先前执行的数据。

如果你使用 Eclipse IDE ,那么有see append property of JaCoCo Gradle Plugin在Eclipse IDE中集成了JaCoCo,默认包含在“Eclipse IDE for Java Developers”中,从Oxygen(4.7)版本开始。有了它,您还可以在Eclipse IDE中获得单个测试的内容 - 在编辑器中右键单击测试名称以获取上下文菜单,然后选择“Coverage As - &gt; JUnit Test”。