Setting up Cobertura Java Code-Coverage with Netbeans

We use Cobertura as our Code-Coverage Tool for a Java project and I had to somehow integrate it into Netbeans. This Blogpost helped me do it, pretty good.

In Short:

build.xml is your ant-build file, it also includes the Netbeans default-, auto-generated one nbproject/build-impl.xml

The nbproject/project.properties file is used for variable-definitions for usage in the build file.

In build.xml inside the <project>-Tag, add:

<path id="cobertura.classpath">
  <fileset dir="${basedir}">
    <include name="lib/cobertura-1.9.4.1/cobertura.jar" />
    <include name="lib/cobertura-1.9.4.1/lib/*\*/\*.jar" />
  </fileset>
</path>
<taskdef classpathref="cobertura.classpath" resource="tasks.properties"/>
<target name="cobertura-instrument" depends="init,compile-test,-pre-test-run">
  <cobertura-instrument todir="${build.test.cobertura.classes.dir}">
  <fileset dir="${build.classes.dir}">
  <include name="*\*/\*.class"/>
  </fileset>
  </cobertura-instrument>
</target>
<target name="test-coverage" depends="init,compile-test,-pre-test-run,cobertura-instrument,-do-test-run,test-report,-post-test-run,-test-browse"/>
<target name="cobertura-coverage-report" depends="init">
  <cobertura-report srcdir="${src.dir}" destdir="${cobertura.report.dir}"/>
  <delete file="Serialized" failonerror="false"/>
  <delete file="cobertura.ser" failonerror="false"/>
</target>

This gives you the necessary build-targets. But you just used some variables which were not set yet! So:

In your nbproject/project.properties:

build.test.cobertura.classes.dir=${build.dir}/cobertura-instrumented-classes
cobertura.dir=lib/cobertura-1.9.4.1
cobertura.report.dir=${build.dir}/cobertura-report

and extend the following 2:

run.test.classpath=\
  ${cobertura.dir}/cobertura.jar:\
  ${build.test.cobertura.classes.dir}:\
  ${javac.test.classpath}:\
  ${build.test.classes.dir}

With this in netbeans you can switch to the Files-window, right-click the build.xml, choose Run Target, then choose (under Other) test-coverage and afterwards cobertura-coverage-report to generate the HTML report in your build folder.

For our project, I afterwards added an exclude for the GUI-package (in the cobertura-instrument-target), which is not to be tested anyway, so code coverage is a dont-want there:

<target name="cobertura-instrument" depends="init,compile-test,-pre-test-run">
  <cobertura-instrument todir="${build.test.cobertura.classes.dir}">
    <fileset dir="${build.classes.dir}">
      <include name="**/*.class"/>
      <exclude name="<em>~ourprojectname~</em>/gui/**/*.class"/>
    </fileset>
  </cobertura-instrument>
</target>