Jtestのアプリケーションカバレッジ計測では、実行中のJavaアプリケーションをGUI操作などでテストした時にソースコードのどこが実行されたのかをカバレッジとして計測することができます。そのため、計測したカバレッジを確認することでテストで網羅できなかったソースコードを特定することができ、テストの抜け漏れを防止することができます。
Javaの開発において、複数のプロジェクトによりアプリケーションが構成されることは珍しくありません。例えば、UIとロジックでプロジェクトを分けるなどです。今回は、Jtestで複数のプロジェクトで構成されたアプリケーションにおいて、カバレッジをまとめて計測する方法を紹介します。
複数プロジェクトのカバレッジを計測する方法
次のような2つのプロジェクトで構成されたJavaのコンソールアプリケーションを例に説明します。
これは、簡単な電卓アプリケーションでcalculatorプロジェクトはUI部分でコンソールからユーザーの入力を受け付けます。入力されるとcalculator-logicプロジェクトのライブラリを呼び出して四則演算がおこなわれるという仕組みです。
>java -cp lib\calculator-logic-0.0.1.jar;target\calculator-0.0.1.jar examples.calculator.Main
[Input1]:1
[Input2]:1
[Operator]:+
2
1. プロジェクトをビルドしてカバレッジ計測に必要なパッケージを生成
まず、ビルドツールからJtestのプラグインを利用して、各プロジェクトでカバレッジ計測に必要なパッケージを生成します。次のコマンドはMavenで実行する場合の例です。(GradleやAntでもパッケージの生成は可能です)
mvn package jtest:monitor
コマンドを実行すると、各プロジェクトに monitor.zipが生成されます。
- calculator\target\jtest\monitor\monitor.zip
- calculator-logic\target\jtest\monitor\monitor.zip
monitor.zipをそれぞれ解凍します。以下のファイルが含まれています。
- static_coverage.xml:静的カバレッジ情報(ソースコードのメタデータ)
- agent.jar:カバレッジエージェント
- agent.properties:カバレッジエージェントの設定ファイル
- agent.sh/agent.bat:カバレッジエージェントをJVMにアタッチするために必要なVM引数を生成するスクリプト
2. カバレッジの計測対象の設定
ポイントになるのは、agent.propertiesに含まれる jtest.agent.includeオプションです。このオプションにはアプリケーションカバレッジの計測対象になるクラスが定義されています。各プロジェクトで生成した agent.propertiesの jtest.agent.includeオプションを比較すると、計測対象のクラスが異なることが確認できます。つまり、各 agent.propertiesを利用すると片方のプロジェクトのカバレッジしか計測できない、各プロジェクトのカバレッジを計測しようとすると agent.propertiesを入れ替えて実行する必要があるため同じテストをプロジェクトの数だけ繰り返す必要があります。
jtest.agent.serverEnabled=true
jtest.agent.enableJacoco=false
jtest.agent.autostart=true
jtest.agent.associateTestsWithCoverage=false
jtest.agent.includes=examples/calculator/* #異なる
jtest.agent.serverEnabled=true
jtest.agent.enableJacoco=false
jtest.agent.autostart=true
jtest.agent.associateTestsWithCoverage=false
jtest.agent.includes=examples/calculator/logic/* #異なる
まとめて各プロジェクトのカバレッジを計測するために jtest.agent.includeオプションを編集します。calculatorプロジェクトで生成した agent.propertiesの jtest.agent.includeオプションにcalculator-logicプロジェクトの jtest.agent.includeオプションの値をカンマ区切りで追加します。これにより、カバレッジエージェントがcalculatorプロジェクトとcalculator-logicプロジェクトのクラスをどちらも計測します。また、カバレッジを識別するために jtest.agent.testidオプションに任意のテストIDを設定します。
jtest.agent.serverEnabled=true
jtest.agent.enableJacoco=false
jtest.agent.autostart=true
jtest.agent.associateTestsWithCoverage=false
jtest.agent.includes=examples/calculator/*,examples/calculator/logic/* #編集
jtest.agent.testid=<任意のテストID> #追加
3. アプリケーションを実行してカバレッジデータを収集
編集した agent.propertiesと同じ階層にある agent.shまたは、agent.batを実行してJVMに渡す -javaagentフラグを出力します。出力した -javaagentフラグをアプリケーションの実行引数に渡して実行します。
java <出力した -javaagentフラグ> -cp lib\calculator-logic-0.0.1.jar;target\calculator-0.0.1.jar examples.calculator.Main
アプリケーションをテストしたら、monitor\runtime_coverageフォルダに計測されたカバレッジデータが出力されます。
4. カバレッジデータからレポートファイルを生成
出力されたカバレッジデータ runtime_coverageフォルダを利用して、calculatorプロジェクトとcalculator-logicプロジェクトでそれぞれカバレッジレポートファイルを生成します。
# calculatorプロジェクト
jtestcli -staticcoverage <calculatorプロジェクトで生成した static_coverage.xml> -runtimecoverage runtime_coverage -config "builtin://Calculate Application Coverage" -report report
# calculator-logicプロジェクト
jtestcli -staticcoverage <calculator-logicプロジェクトで生成した static_coverage.xml> -runtimecoverage runtime_coverage -config "builtin://Calculate Application Coverage" -report report
生成されたカバレッジレポートファイルから各プロジェクトのカバレッジが計測できていることを確認したら終了です。
まとめ
複数のプロジェクトで構成されるアプリケーションのカバレッジをプロジェクト毎に計測するのは、同じテストをプロジェクトの数だけ繰り返すことになるため手間となります。今回紹介した方法で複数のプロジェクトのカバレッジをまとめて計測して、テストの効率化を図ってみてはいかがでしょうか。