web-dev-qa-db-ja.com

Jacocoは、単一のテストクラスのみのカバレッジレポートを生成します

だから私はテストがあるとしましょう

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

そして、それがメソッドdoSomething()をカバーしているとしましょう。私のプロジェクトでは、1,000万のテストがあり、このテストはそのうちの1つにすぎません。小さなテストではあまり効果がありません。

ここで、私のdoSomethingメソッドが次のようになっているとしましょう。-

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

ご覧のとおり、メソッドには多くのブランチがあり、その結果、さらに多くのブランチを持つ他のメソッドが呼び出されます。 testAを実行すると、実行されたコードでどのブランチを見逃したかを確認したいのですが、すべての単体テストを実行せずに、気になるテストだけを実行せずに、これを実現するにはどうすればよいですか。

質問に答えるときは、これらの魔法の言葉を覚えておいてくださいすべてのユニットテストを実行する必要はなく、私が気にかけているテストのみを実行する必要はありません

6
Bhargav

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

mvn clean verify -Dtest=ExampleTest#test2を実行すると、次のようになります。

coverage of test2

それぞれtest1test2のカバレッジを示しています。

比較のために-mvn clean verifyによるすべてのテストの実行は以下を生成します:

coverage of all tests

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 Pluginappendプロパティを参照 での以前の実行に関するデータの蓄積を防ぎます。

Eclipse IDEを使用する場合、JaCoCoをEclipseに統合する EclEmma Eclipseプラグイン がありますIDEおよびOxygen(4.7)バージョン以降、「Eclipse IDE for JavaDevelopers」にデフォルトで含まれています。これを使用すると、Eclipseで単一のテストのカバレッジを取得することもできますIDE-エディターでテスト名を右クリックしてコンテキストメニューを取得し、[Coverage As-> JUnitTest]を選択します。

4
Godin