【Java】 カバレッジツール ~ Cobertura 編 ~

■ はじめに

* カバレッジツール
* Coberturaで、「コヴェルトゥーラ」と読むらしい

http://d.hatena.ne.jp/selenium_blog/20060309/1141927245

補足:別のライブラリについて

 * 以下の関連記事を参照

設定

[1-1] 以下のサイトからCobertura をダウンロードする

# 今回は、「cobertura-2.1.1-bin.zip」

http://sourceforge.net/projects/cobertura/files/cobertura/

[1-2] zipを解凍

* 「cobertura-2.1.1.jar」とその配下の「lib」が重要

Eclipse/Antで Cobertura を実行するには

[2-1] [1-2]で解凍したフォルダ配下の「cobertura.jar」とその配下の「lib」を対象のプロジェクト配下に配置する

[例] プロジェクト名「SampleJava」

SampleJava
 + src
 + libs
    + cobertura
        + cobertura-2.1.1.jar
        + lib <- 今回はここに置いた
           + asm-5.0.1.jar
           + asm-analysis-5.0.1.jar
           + ・・・略・・・

[2-2] build.xmlを書く(後はこれを実行するだけ)

build.xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project basedir="." default="run.all" name="SampleJava">
  <property name="junit.path" location="C:/eclipse/plugins/org.junit_4.12.0.v201504281640/junit.jar" />
  <property name="hamcrest.path" location="C:/eclipse/plugins/org.hamcrest.core_1.3.0.v201303031735.jar" />
  <property name="lib.dir" location="${basedir}/libs" />
  <property name="src.dir" location="${basedir}/src" />
  <property name="build.dir" location="${basedir}/class" />
  <property name="test.dir" location="${basedir}/test" />
  <property name="junit.output.dir" location="junit" />
  <property name="cobertura.dir" location="${lib.dir}/cobertura" />
  <property name="cobertura.output.dir" location="${basedir}/cobertura" />
  <property name="build.coverage.dir" location="${build.dir}/coverage" />
  <property name="build.instrumented.dir" location="${build.dir}/instrumented-classes" />
  <path id="src.classpath">
    <pathelement location="${build.dir}" />
  </path>
  <path id="cobertura.classpath">
    <fileset dir="${cobertura.dir}">
      <include name="cobertura-2.1.1.jar" />
      <include name="lib/*.jar" />
    </fileset>
  </path>
  <path id="src.classpath">
    <pathelement location="${build.dir}" />
  </path>
  <target name="compile" description="Javaコンパイル">
    <delete dir="${build.dir}" />
    <mkdir dir="${build.dir}" />
    <javac srcdir="${src.dir}" destdir="${build.dir}" debug="true" debuglevel="vars,lines,source" includeantruntime="false" />
  </target>
  <taskdef classpathref="cobertura.classpath" resource="tasks.properties" />
  <target name="run.all">
    <antcall target="coverage.report" />
    <antcall target="run.checkstyle" />
    <antcall target="run.findbugs" />
  </target>
  <target name="instrument" depends="compile.for.test">
    <delete dir="${build.instrumented.dir}" />
    <mkdir dir="${build.instrumented.dir}" />
    <cobertura-instrument todir="${build.instrumented.dir}">
      <fileset dir="${build.dir}">
        <include name="**/*.class" />
      </fileset>
    </cobertura-instrument>
  </target>
  <target name="compile.for.test" description="Javaコンパイル">
    <delete dir="${build.dir}" />
    <mkdir dir="${build.dir}" />
    <javac srcdir="${src.dir}" destdir="${build.dir}" debug="true" debuglevel="vars,lines,source" includeantruntime="false" />
    <javac srcdir="${test.dir}" destdir="${build.dir}" debug="true" debuglevel="vars,lines,source" verbose="true" includeantruntime="false" classpath="${junit.path}" />
  </target>
  <target name="test" depends="instrument" description="Unit test the application">
    <delete dir="${junit.output.dir}" />
    <mkdir dir="${junit.output.dir}" />
    <junit fork="yes" showoutput="yes" dir="${junit.output.dir}" errorProperty="test.failed" failureProperty="test.failed">
      <jvmarg value="-XX:-UseSplitVerifier" />
      <sysproperty key="net.sourceforge.cobertura.datafile"
        file="${basedir}/cobertura.ser" />
      <formatter type="xml" />
      <classpath refid="src.classpath" />
      <classpath>
        <fileset dir="${lib.dir}">
          <include name="**/*.jar" />
        </fileset>
        <pathelement path="${junit.path}" />
        <pathelement path="${hamcrest.path}" />
        <pathelement path="${junit.output.dir}" />
        <pathelement path="${build.dir}" />
      </classpath>
      <batchtest todir="${junit.output.dir}">
        <fileset dir="${test.dir}">
          <include name="**/*Test.java" />
        </fileset>
      </batchtest>
    </junit>
  </target>
  <target name="coverage.report" depends="test">
    <delete dir="${cobertura.output.dir}" />
    <mkdir dir="${cobertura.output.dir}" />
    <cobertura-report format="xml" destdir="${cobertura.output.dir}">
      <fileset dir="${src.dir}">
        <include name="**/*.java"/>
        <exclude name="**/package-info.java" />
      </fileset>
    </cobertura-report>
  </target>
</project>

参考文献

http://works.nri.co.jp/service/pdf/jcoverage_cobertura.pdf
http://www.ibm.com/developerworks/jp/java/library/j-cobertura/
http://d.hatena.ne.jp/yamap_55/20130409/1365518199

関連記事

カバレッジツール ~ EclEmma 編 ~ Jenkins ~ 初級設定編 / (4) プラグインを設定 ~ カバレッジツール Cobertura でのトラブルシューティング Ant で jUnit を実行する