JaCoCO Maven Pluginでテストケースのカバレッジもとる

JaCoCoというJavaのカバレッジライブラリを調べています。

テストコードを書いて確認。EclipseのプラグインであるEclEMMAは内部でJaCoCoを使っています。
とりあえずオールグリーンです。


カバレッジが100%ではないですが、ここでは問題にしません。#ほんとはこれを調べてたんですが。
ちゃんとテストコードのカバレッジもとれてます。


次にMaven Pluginです。使ったバージョンは、0.6.3-SNAPSHOT。
HTML、XML、CSVでレポートが出力されます。HTMLのレポートを開いたものです。テストコードのカバレッジが無いです。


調べていくと、prepare-agentゴールでデータを作って、reportゴールでレポート化しています。
prepare-agentゴールでは、JavaAgentを使ってデータを取っています。この辺はたぶんEclEMMAも一緒のはず。
実際、HTMLレポートのSessionsのリンクをたどると、実行時のデータがすべて出てます。


ここを見るとちゃんとテストコードも通ってます。ということは、データは取れているけどレポートできてない、EclEMMAで出てるという事は、Maven Pluginで出ていないですね。


で、いろいろとpomをいじってみましたが駄目だったのでソースをみることに。
https://github.com/two-pack/jacoco/blob/master/jacoco-maven-plugin/src/org/jacoco/maven/BundleCreator.java
 public IBundleCoverage createBundle(
   final ExecutionDataStore executionDataStore) throws IOException {
  final CoverageBuilder builder = new CoverageBuilder();
  final Analyzer analyzer = new Analyzer(executionDataStore, builder);
  final File classesDir = new File(this.project.getBuild()
    .getOutputDirectory());

  @SuppressWarnings("unchecked")
  final List<File> filesToAnalyze = FileUtils.getFiles(classesDir,
    fileFilter.getIncludes(), fileFilter.getExcludes());

  for (final File file : filesToAnalyze) {
   analyzer.analyzeAll(file);
  }

  return builder.getBundle(this.project.getName());
 }

classesDirがgetOutputDirectory()になってます。target/classesだけみたい。。。
ということは、target/test-classesも入れれば良いってことかな?
 @SuppressWarnings("unchecked")
 public IBundleCoverage createBundle(
   final ExecutionDataStore executionDataStore) throws IOException {
  final CoverageBuilder builder = new CoverageBuilder();
  final Analyzer analyzer = new Analyzer(executionDataStore, builder);
  final File classesDir = new File(this.project.getBuild()
    .getOutputDirectory());
  final File testClassesDir = new File(this.project.getBuild()
    .getTestOutputDirectory());

  final List filesToAnalyze = FileUtils.getFiles(classesDir,
    fileFilter.getIncludes(), fileFilter.getExcludes());
  filesToAnalyze.addAll(FileUtils.getFiles(testClassesDir,
    fileFilter.getIncludes(), fileFilter.getExcludes()));

  for (final File file : filesToAnalyze) {
   analyzer.analyzeAll(file);
  }

  return builder.getBundle(this.project.getName());
 }

ということでビルドして入れてレポート出した見た結果がこちら。ちゃんと出ました。


テストコードのカバレッジってデフォルトで出た方が、テストが思いがけず通ってない場合が見れていいと思うんですが、どうですかね?
フラグとテスト作ってリクエストしてみようかな。

コメント