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);