2017-01-27 8 views
0

私は統合テストに別のモジュールを使用する標準Mavenパターンに従っています。このモジュールには、主要な依存jarプロジェクトを実行するラッパークラスがあります。jacoco簡単な統合テストソリューション

jarプロジェクトには独自のテストケースがありますが、これらの実行には興味がありません。私は、統合テストで実行されたときにjarプロジェクトのコードカバレッジを見たいと思っています。シンプルで、レポートの集計はありません。

答えて

1

私はその名前が「集約」のようなものが含まれている場合でもhttp://www.jacoco.org/jacoco/trunk/doc/report-aggregate-mojo.htmlを引用してみましょう:

これはまた、テストは、テスト対象のコードよりも、別のプロジェクトにあるときの場合には、たとえば、カバレッジレポートを作成することができます統合テスト。

jar/src/main/java/example/Example.javaを考える:

package example; 
public class Example { 
    // to be covered by unit test 
    public void a() { 
    System.out.println("a"); 
    } 

    // to be covered by integration test  
    public void b() { 
    System.out.println("b"); 
    } 
} 

ユニットテストjar/src/test/java/example/ExampleTest.java

package example; 
public class ExampleTest { 
    @org.junit.Test 
    public void test() { 
    new Example().a(); 
    } 
} 

統合テストit/src/test/java/example/ExampleITTest.java

package example; 
public class ExampleITTest { 
    @org.junit.Test 
    public void test() { 
    new Example().b(); 
    } 
} 

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> 
    <packaging>pom</packaging> 

    <properties> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    </properties> 

    <modules> 
    <module>jar</module> 
    <module>it</module> 
    </modules> 

    <dependencies> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>4.8.2</version> 
     <scope>test</scope> 
    </dependency> 
    </dependencies> 

    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.jacoco</groupId> 
     <artifactId>jacoco-maven-plugin</artifactId> 
     <version>0.7.8</version> 
     <executions> 
      <execution> 
      <goals> 
       <goal>prepare-agent</goal> 
       <goal>report</goal> 
      </goals> 
      </execution> 
     </executions> 
     </plugin> 
    </plugins> 
    </build> 

</project> 

jar/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/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <parent> 
    <groupId>org.example</groupId> 
    <artifactId>example</artifactId> 
    <version>1.0-SNAPSHOT</version> 
    </parent> 

    <artifactId>jar</artifactId> 

</project> 

し、最終的に最も重要な部分it/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/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <parent> 
    <groupId>org.example</groupId> 
    <artifactId>example</artifactId> 
    <version>1.0-SNAPSHOT</version> 
    </parent> 

    <artifactId>it</artifactId> 

    <dependencies> 
    <dependency> 
     <groupId>org.example</groupId> 
     <artifactId>jar</artifactId> 
     <version>${project.version}</version> 
    </dependency> 
    </dependencies> 

    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.jacoco</groupId> 
     <artifactId>jacoco-maven-plugin</artifactId> 
     <executions> 
      <!-- 
      "report" goal can't cross boundaries of modules, 
      while "report-aggregate" can, so let's use it, however 
      by default it will load "jacoco.exec" from this module and from module "jar", 
      so let's also change file name for this module to avoid intersection 
      --> 
      <execution> 
      <configuration> 
       <destFile>${project.build.directory}/jacoco-it.exec</destFile> 
      </configuration> 
      </execution> 
      <execution> 
      <id>it-report</id> 
      <phase>verify</phase> 
      <goals> 
       <goal>report-aggregate</goal> 
      </goals> 
      <configuration> 
       <dataFileIncludes>**/jacoco-it.exec</dataFileIncludes> 
       <outputDirectory>${project.reporting.outputDirectory}/jacoco</outputDirectory> 
      </configuration> 
      </execution> 
     </executions> 
     </plugin> 
    </plugins> 
    </build> 
</project> 

mvn clean verifyは、2つのレポートが生成されます - 方法a()が覆われており、かつit/target/site/jacocoがあることを示すことを示すjar/target/site/jacocoをメソッドb()が対象です。

私は以下の行を追加することで、アプリケーション・サーバーのstandalone.sh(起動スクリプト)へのJavaエージェントを添付している
1

:私はジェンキンスジョブのワークスペースに配置される先のファイルを指定している

JAVA_OPTS="$JAVA_OPTS -javaagent:/home/jboss/.m2/repository/org/jacoco/org.jacoco.agent/0.7.6.201602180812/org.jacoco.agent-0.7.6.201602180812 -runtime.jar=destfile=/var/lib/jenkins/workspace/HDAP_JaCoCo/jacocoSoapui.exec,includes=*,append=false,output=file" 

ユニットテストのためにJaCocoコードカバレッジを実行します(これにより、クラスは自分のカバレッジを比較することができます)。

次に、私は2つのexecファイルのパスを指定しました(ユニットテストからのものと、上記のJenkinsジョブの記録カバレッジレポートセクションでの統合テスト用に作成したもの)。それから、すべてのテストの対象となります。

注:

  • アプリケーションサーバが実行ファイルにカバレッジをダンプするために停止する必要があります。これ以上質問があれば教えてください。

  • 特定のテストセットのカバレッジを取得する場合は、アプリケーションに実行されているすべての呼び出しに対してカバレッジを与えるため、実行中のものがないことを確認してください。

関連する問題