読者です 読者をやめる 読者になる 読者になる

emmaでカバレッジ出力

カバレッジツールのemmaを利用して
antで実行するJUnitカバレッジを出力できないかな(hudson用)
ということで調べたら無事できたので書きます。


emmaには直接カバレッジを取得する「on the fly」モードと
計測したいクラスにコードを埋め込んで計測する「offline」モード
があるみたいですが、今回は「offline」モードで行います。
(そもそもant+junit+emmaだと「offline」モードでしかできない?)


実際記載するantはこんな感じ

<!-- emmaのパス定義 -->
<path id="emma.classpath">
    <pathelement location="${emma.dir}/emma.jar" />
    <pathelement location="${emma.dir}/emma_ant.jar" />
</path>

<!-- emmaタスク読み込み -->
<taskdef resource="emma_ant.properties" classpathref="emma.classpath" />

<!-- emma実行ターゲット -->
<target name="exec_emma">

    <!-- まずはemmaコードを埋め込んだテストクラスを生成 -->
    <emma enabled="true">
        <instr metadatafile="${coverage.dir}/metadata.emma"
               destdir="${coverage.class.dir}"
               merge="true"
               mode="fullcopy">
            <instrpath>
                <pathelement location="${class.dir}" />
            </instrpath>
        </instr>
    </emma>

    <!-- JUnitの実施 -->
    <junit printsummary="yes" fork="true">
        <jvmarg value="-Demma.coverage.out.file=${coverage.dir}/coverage.emma" />
        <jvmarg value="-Demma.coverage.out.merge=true" />
        <jvmarg value="-Demma.verbosity.level=quiet" />
        <jvmarg value="-Dcoverage.enabled=true" />
        <formatter type="xml" />
        <classpath>
            <pathelement location="${coverage.class.dir}/classes" />
            <pathelement location="${test.class.dir}" />
            <path refid="emma.classpath" />
        </classpath>
        <batchtest todir="${test.report.path}">
            <fileset dir="${test.src.dir}">
                <include name="**/*Test.java" />
                <exclude name="**/TestAll.java" />
            </fileset>
        </batchtest>
    </junit>

    <!-- 計測結果のレポートを出力(とりあえずXMLとHTMLで出力) -->
    <emma enabled="true">
        <property name="report.html.out.encoding" value="UTF-8" />
        <report>
            <sourcepath>
                <pathelement location="${src.dir}" />
            </sourcepath>
            <fileset dir="${coverage.dir}">
                <include name="*.emma" />
            </fileset>
            <xml outfile="${coverage.dir}/coverage.xml" />
            <html outfile="${coverage.dir}/coverage.html" />
        </report>
    </emma>
</target>


hudsonと連携したければ、
emmaプラグインをインストールして
出力されるxmlファイルを指定すれば
hudson上でカバレッジの確認が出来ます。


うん、便利。