簡體   English   中英

Jacoco僅針對單個測試類生成覆蓋率報告

[英]Jacoco generate coverage report for only a single test class

那么讓我們說我有一個測試

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

讓我們說它涵蓋了一個方法doSomething() ,現在在我的項目中,我有1000萬個測試,而這個測試只是其中之一。 一個小小的測試做得不多。

現在讓我們說我的doSomething方法如下: -

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

因此,您可以看到方法中有很多分支,因此調用其他具有更多分支的方法。 當我運行testA我希望看到我在執行的代碼中錯過了哪些分支,如何在不運行所有單元測試的情況下實現這一點,而且只關注我關注的測試,

記住這些神奇的詞匯,當你回答這個問題而沒有運行所有的單位測試時,只記得我關心的測試

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生成以下報告:

test1的覆蓋范圍

並執行mvn clean verify -Dtest=ExampleTest#test2將產生:

test2的覆蓋范圍

它分別顯示了test1test2覆蓋范圍。

為了比較 - 通過mvn clean verify執行所有測試會產生:

覆蓋所有測試

關於clean用法的注意事項:文件target/jacoco.exec包含執行信息並用於生成報告(請參閱代理選項destfilejacoco-maven-plugin相應參數 )。 默認情況下,JaCoCo代理會附加到此文件(請參閱代理選項appendjacoco-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插件 ,它在Eclipse IDE中集成了JaCoCo,默認包含在“Eclipse IDE for Java Developers”中,從Oxygen(4.7)版本開始。 有了它,您還可以在Eclipse IDE中獲得單個測試的覆蓋率 - 在編輯器中右鍵單擊測試名稱以獲取上下文菜單並選擇“Coverage As - > JUnit Test”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM