ant testでemmaによるカバレッジ計測を実行する
このサイトを参考にしました。
http://prepro.wordpress.com/2009/05/03/emmaant%E3%82%92offline%E3%83%A2%E3%83%BC%E3%83%89%E3%81%A7%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B/
seam-genのbuild.xmlに組み込むとこんな感じ。
まず、以下を追加。
<property name="emma.dir" value="${basedir}/lib" /> <path id="emma.lib" > <pathelement location="${emma.dir}/emma.jar" /> <pathelement location="${emma.dir}/emma_ant.jar" /> </path> <!-- 新規タスク(つまり<emma>)を有効化 --> <taskdef resource="emma_ant.properties" classpathref="emma.lib" /> <!-- emmaを用いて実行する時のプロパティ --> <property name="emma.enable" value="true"/> <!-- dir設定 --> <property name="convert.output" value="${basedir}/.emma/convert" descript ion="emma組み込み後のclassファイル"/> <property name="emma.output" value="${basedir}/.emma/emma" description=". emmaメタデータの出力先"/> <target name="emma" depends="compile"> <delete dir="${convert.output}" failonerror="no"/> <delete dir="${emma.output}" failonerror="no"/> <mkdir dir="${emma.output}"/> <mkdir dir="${convert.output}"/> <emma enabled="${emma.enable}"> <instr instrpath="${jar.dir}" destdir="${convert.output}" metadatafile="${emma.output}/metadata.emma" merge="yes" mode="fullcopy"> </instr> </emma> </target> <target name="test" depends="runtest"> <!-- 計測結果のレポートの出力 --> <emma enabled="true"> <report> <sourcepath> <pathelement location="${src.model.dir}" /> <pathelement location="${src.action.dir}" /> </sourcepath> <fileset dir="${emma.output}"> <include name="*.emma" /> </fileset> <html encoding="UTF-8" outfile="${basedir}/test-report/covera ge.html" /> </report> </emma> </target>
もともとのtarget name="test"を以下のように書き換えます。
<!--changed for coverage start <target name="test" depends="buildtest" description="Run the tests"> --> <target name="runtest" depends="clean,emma,buildtest" description="Run the tests"> <!--changed for coverage end--> <fail message="Cannot run tests because path to project contains space s."> <condition> <contains string="${basedir}" substring=" "/> </condition> </fail> <condition property="incompatible.jdk" value="true"> <and> <equals arg1="${ant.java.version}" arg2="1.6"/> <not><available classname="javax.xml.bind.JAXB"/></not> </and> </condition> <fail if="incompatible.jdk">You are using an incompatible JDK 6. Pleas e use Sun JDK 6 Update 4 (1.6.0_04) or newer or use Open JDK 6.</fail> <taskdef resource="testngtasks" classpath="${testng.jar}"/> <path id="test.path"> <pathelement location="${convert.output}/classes"/> <path path="${test.dir}"/> <fileset dir="${lib.dir}/test"> <include name="*.jar"/> </fileset> <path path="${bootstrap.dir}"/> <path refid="build.classpath"/> <!--add for coverage start--> <path refid="emma.lib" /> <!--add for coverage end--> </path> <testng outputdir="${basedir}/test-report"> <jvmarg line="-Dsun.lang.ClassLoader.allowArraySyntax=true"/> <!--if you need proxy <jvmarg line="-Dhttp.proxyHost=proxy server address" /> <jvmarg line="-Dhttp.proxyPort=proxy server port" /> --> <!--add for coverage start --> <jvmarg value="-Demma.coverage.out.file=${emma.output}/coverage.em ma" /> <jvmarg value="-Demma.coverage.out.merge=true" /> <jvmarg value="-Demma.verbosity.level=quiet" /> <jvmarg value="-Dcoverage.enabled=true" /> <!--add for coverage end --> <classpath refid="test.path"/> <xmlfileset dir="${test.dir}" includes="*Test.xml"/> </testng> </target>
結果レポートHTMLで、ソースの各行に色を付けて表示してくれるのですが、ソースファイルがプラットフォームデフォルトのエンコーディングでないと文字化けしてしまいます。(Win環境で開発するなら、JavaのソースファイルがSJISでないと、ということです。)
antタスクによってはJVM引数を指定できたりするのですが、emmaは未対応。設定項目を増やすのは面倒なので、ソースファイルは結果レポートHTMLと同じエンコーディングとして動作するようにemmaのソースにちょこっと手を入れてbuildします。これで、ソースコードがUTF-8の場合、結果レポートをUTF-8で出力すれば文字化けしないようになります。
(emma-2.0.5312-srcを使用しました)
修正箇所は下記のメソッド内。
core\java12\com\vladium\emma\report\html\ReportGenerator.javaのembedSrcFile()
変更前:
in = new BufferedReader (new FileReader (srcFile), IO_BUF_SIZE);
変更後:
java.io.InputStreamReader isr = new java.io.InputStreamReader(new java.io.FileInputStream(srcFile), m_settings.getOutEncoding ()); in = new BufferedReader (isr, IO_BUF_SIZE);