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());
}
ということでビルドして入れてレポート出した見た結果がこちら。ちゃんと出ました。
テストコードのカバレッジってデフォルトで出た方が、テストが思いがけず通ってない場合が見れていいと思うんですが、どうですかね?
フラグとテスト作ってリクエストしてみようかな。