Cobertura、Ant、Jenkinsでコードカバレッジを取得する方法
JenkinsでAntを使用してビルドする際に、Coberturaを使用してコードカバレッジを取得しようというお話。
GradleやらMavenが主流みたいで、日本語ドキュメントがあまりみつからなかったので書いてみます。*1
前提
- Jenkinsは既に動作している
- Jenkins上でAntを使用してビルドが行われている
- AntでJunitを実行している
coberturaのモジュール取得
公式ページからモジュールを取得。
私は「cobertura-1.9.4.1-bin.zip (binary)」を使用しました。
必要モジュールの取得
取得したモジュールを解凍し以下のモジュールをプロジェクトに設定。
今回は「/build/cobertura」内に設定しました。*2
尚、「cobertura.jar」はカレントから、他のモジュールはlibフォルダにあります。
/ ├build │└cobertura │ ├asm-3.0.jar │ ├asm-tree-3.0.jar │ ├cobertura.jar │ ├jakarta-oro-2.0.8.jar │ └log4j-1.2.9.jar └build.xml
build.xmlの編集
coberturaの依存jarを定義指定
<path id="cobertura.classpath"> <fileset dir="build/cobertura"> <include name="*.jar" /> </fileset> </path>
タスクの追加
<taskdef classpathref="cobertura.classpath" resource="tasks.properties" />
カバレッジデータファイルの削除
私が行った際には弊害はなかったのですが、ビルド毎に削除した方がよいそうです。初期処理などで実行しておきましょう。
<delete file="${project_home}/cobertura.ser" />
コンパイルされたclassファイルにログ出力用のコードを追加
<target name="cobertura_instrument" description="classファイルにログ出力用コード追加"> <cobertura-instrument todir="build/cobertura/classes"> <fileset dir="build/classe"> <include name="**/*.class" /> </fileset> </cobertura-instrument> </target>
上記の設定では「build/classe」にあるコンパイルされたclassを指定し、
「build/cobertura/classes」にログ出力用のコードを埋め込んだclassファイルを出力します。
Junitタスクの編集
<junit fork="true"> <sysproperty key="net.sourceforge.cobertura.datafile" file="${basedir}/cobertura.ser" /> <formatter type="xml" /> <classpath> <!-- coverage測定用 --> <path refid="cobertura.classpath" /> <path path="${tmp_dir}/coverage-classes" /> <!-- junit用 --> <path refid="test.classpath" /> </classpath> <batchtest todir="${reports_junit_dir}"> <fileset dir="${testsrc_dir}"> <include name="**/**Test.java" /> </fileset> </batchtest> </junit>
JUnitのタスクなので色々ごちゃごちゃしていますが編集点はこんな感じです。
JUnit実行時には測定用に作成したCLASSを使用して欲しいので、classpathの先頭にしなければいけません。
<sysproperty key="net.sourceforge.cobertura.datafile" file="${basedir}/cobertura.ser" />
<classpath> <path refid="cobertura.classpath" /> <path path="build/cobertura/classes" /> </classpath>
coverageレポートを出力
<target name="coverage_report" description="coverageレポート出力"> <cobertura-report srcdir="${src_dir}" destdir="build/reports/coverage" format="xml" encoding="shift_jis" /> </target>
カバレッジの測定結果のレポートを出力します。
その際にソースコードと紐付けるのでソースコードのディレクトリを指定します。
jenkinsでカバレッジ測定結果を表示するためにformatはxmlと指定していますが、htmlと指定することで結果をその場で確認することが可能です。*3
また、encodingが異なっているとレポート観覧時にソースコードを見た際に正しく表示されません。
開発環境で実行
指定した箇所に「coverage.xml」というレポートが出力されればOKです。
内容の確認をしたい場合にはformatをhtmlにして出力して確認して下さい。
jenkinsの設定
プラグインの導入
特に問題はないと思いますが一応。。。
Jenkinsの管理 → プラグインの管理 → 利用可能 → フィルターに「Cobertura」と入力 → 「Cobertura Plugin」にチェック → 再起動せずにインストール
ジョブの設定
ハマった所とか
JUnitの実行が遅い場合
私の環境ではそれほど遅くなかったので対処しませんでしたが、実行がかなり遅くなる場合があるようです。
kennyjのブログ(仮): coberturaが猛烈に遅い!...けど解決した
まとめ
デメリット
- 数値に現れることで100%を目指してしまう。
参考URL
↑2005年の記事です。かなり古いので参考程度に。。。