2017-02-17 31 views
1

多かれ少なかれマルチモジュールのMavenプロジェクトがあります。私はJacocoによって処理されている各モジュールの単体テストを持っています。私は "マージ"と "レポート集約"を行う別の子モジュールを持っており、これはデータを生成するように見えます。私はSonarQubeで生成されたデータを使っています。私のテストのほとんどはPowerMockを使用しており、私はオフライン計測を使用しています。jacocoは同じモジュール内のクラスのカバレッジしか表示しません

しかし、カバレッジデータを調べたところ、テスト中に実行されていることがわかっているクラスとメソッドのカバレッジデータが残っていることがわかりました。すべてのモジュールで見られるパターンは、実際に現在のモジュールにあるクラスである各モジュールの単一クラスのカバレッジのみを報告するということです。ほとんどすべてのテストは、ビルド中の他のモジュールの他のクラスにも呼び出され、それらのクラスのカバレッジは決して報告されません。

次のプラグインの設定は、それぞれの子モジュールで使用する親のポンポンである:私はモジュールごとに生成されたHTML結果を検査する場合

<plugin> 
    <groupId>org.jacoco</groupId> 
    <artifactId>jacoco-maven-plugin</artifactId> 
    <version>0.7.8</version> 
    <executions> 
     <execution> 
      <id>default-instrument</id> 
      <goals> 
       <goal>instrument</goal> 
      </goals> 
     </execution> 
     <execution> 
      <id>default-restore-instrumented-classes</id> 
      <goals> 
       <goal>restore-instrumented-classes</goal> 
      </goals> 
     </execution> 
     <execution> 
      <id>default-report</id> 
      <phase>prepare-package</phase> 
      <goals> 
       <goal>report</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 
<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-surefire-plugin</artifactId> 
    <version>2.19.1</version> 
    <configuration> 
     <argLine>-Xmx1024m</argLine> 
     <includes> 
      <include>**/*Test.java</include> 
     </includes> 
     <systemPropertyVariables> 
      <jacoco-agent.destfile>${project.build.directory}/jacoco.exec</jacoco-agent.destfile> 
      <running-unit-test>true</running-unit-test> 
     </systemPropertyVariables> 
    </configuration> 
</plugin> 

、私はそれだけで一つのクラスの結果を報告することを見つけます現在のモジュールであり、他のモジュールのクラスのデータではありません。これから、別の子モジュールで "マージ"と "レポート集約"を行う方法はおそらくこの問題とは無関係であると思います。

生成された "jacoco.exec"ファイルはバイナリですが、どのモジュールが表示されているのかを見てみると、ファイル名のように見えるものは1つしか表示されませんでした。そのモジュールのHTMLカバレッジレポートで報告された唯一のファイル名でした。

報告できるその他の情報はわかりません。

更新

私は確実な実行ユニットテストは、それが現在のモジュールからのインストルメントクラスを使用するとき、私は今、かなりはっきりと見ることができ思いますが、Mavenの成果物からインストルクラス。このため、現在のモジュールのクラスのカバレッジしか表示されません。

したがって、現在のモジュールが依存する各モジュールの "target/generated-classes/jacoco"フォルダを確実に使用するクラスパスの前に追加するように指定する必要があるようです。私はそれをする方法を見ていない。

また、 "instrument"ゴールには "includes"設定要素があることがわかります。現在のモジュールが依存する各モジュールのすべての "target/classes"ディレクトリへのパスを指定する必要がありますか?

答えて

0

一部のクラスのコードカバレッジを記録するには、その計測が必要です。目標instrumentは、現在のモジュールのクラスの計測を実行します。

すべてのテストは、他のモジュール

で他のクラスに計測されていないので、ものを呼び出します。そして、私が正しく理解していれば、あなたがカバーしていないものを正確に理解してください。

PowerMockを他のモジュールに由来するクラスに対して使用するのではなく、現在のモジュールのクラスに対してのみ使用する場合は、オフライン計測をオンザフライでエージェントを使用して組み合わせることができます。しかし、この場合、オフラインでインストルメントされたクラスは、エージェントによってインストルメンテーションから明示的に除外されていることを確認してください。そうでなければ、エージェントはIllegalStateException: Class ... is already instrumentedを投げます。

他のモジュールから来たクラスに対してPowerMockを使用すると、クラスパスと依存関係の操作に関してMavenの厳密さのために複雑になります。そして、私は、これは簡単に1つのmvn COMANDを使用して達成することができる、しかし、より多くのを使用して可能と思われることを疑う:

  1. 楽器とテストを実行しますが、restore-instrumented-classes
  2. (複数可)のクラスを復元​​し、レポートを生成
  3. を使用していません

残念ながら、完全な例(https://stackoverflow.com/help/mcve)を提供していないため、このアプローチを今すぐテストするための完全な例を準備する時間がありません。

補足として、単純にエージェントを使用できないのは、PowerMockがエージェントをバイパスし、クラスファイルをディスクから読み込むという事実に起因します。

+0

私はこれをいくつかの中期戦略で扱います:1.オフライン計測でPowerMockを使用している間、モジュール "foo"のユニットテストを受け入れると、そのモジュールのカバレッジのみが表示されます。2.書き込みユニット3. PowerMockの使用を強制してFactoryを使用する1つのメカニズムを置き換え、Mockitoとオンライン計測を使用するようにこれらのテストを変更します。 –

関連する問題