Cobertura是一个基于jcoverage的免费Java工具,它能够显示哪一部分代码被你的测试所覆盖,并可生成HTML或XML报告. 本文将介绍如何在项目中使用cobertura来测量单元测试的代码覆盖情况.
首先创建一个Java项目,本文以Eclipse为例:
项目名: CodeCoverageTest
结构图如下:
接下,创建一个Ant构建配置文件,帮我们实现自动化的编译,单元测试以及cobertura来测量单元测试的代码覆盖情况。
Ant的 build.xml文件内容如下:
- <?xml version="1.0" encoding="UTF-8"?>
- 2
- 3 <project name="cobertura.examples.basic" default="coverage" basedir=".">
- 4
- 5 <!-- 引用 build.properties文件 配置路径信息-->
- 6 <property file="build.properties" />
- 7
- 8 <!-- 设置 cobertura路径 -->
- 9 <path id="cobertura.classpath">
- 10 <fileset dir="${cobertura.dir}">
- 11 <include name="cobertura.jar" />
- 12 <include name="lib/**/*.jar" />
- 13 </fileset>
- 14 </path>
- 15
- 16 <!-- 配置 cobatura ant 扩展任务 -->
- 17 <taskdef classpathref="cobertura.classpath" resource="tasks.properties"/>
- 18
- 19 <target name="init">
- 20 <mkdir dir="${classes.dir}" />
- 21 <mkdir dir="${instrumented.dir}" />
- 22 <mkdir dir="${reports.xml.dir}" />
- 23 <mkdir dir="${reports.html.dir}" />
- 24 <mkdir dir="${coverage.xml.dir}" />
- 25 <mkdir dir="${coverage.html.dir}" />
- 26 </target>
- 27
- 28 <!-- 编译源代码 -->
- 29 <target name="compile" depends="init">
- 30 <javac srcdir="${src.dir}:${test.dir}:${src.conf.dir}:${test.conf.dir}" destdir
- ="${classes.dir}" debug="yes">
- 31 <classpath refid="cobertura.classpath" />
- 32 </javac>
- 33 </target>
- 34
- 35 <target name="instrument" depends="init,compile">
- 36 <!--
- 37 Remove the coverage data file and any old instrumentation.
- 38 -->
- 39 <delete file="cobertura.ser"/>
- 40 <delete dir="${instrumented.dir}" />
- 41
- 42 <!--
- 43 Instrument the application classes, writing the
- 44 instrumented classes into ${build.instrumented.dir}.
- 45 -->
- 46 <cobertura-instrument todir="${instrumented.dir}">
- 47 <!--
- 48 The following line causes instrument to ignore any
- 49 source line containing a reference to log4j, for the
- 50 purposes of coverage reporting.
- 51 -->
- 52 <ignore regex="org.apache.log4j.*" />
- 53
- 54 <fileset dir="${classes.dir}">
- 55 <!--
- 56 Instrument all the application classes, but
- 57 don't instrument the test classes.
- 58 -->
- 59 <include name="**/*.class" />
- 60 <exclude name="**/*Test.class" />
- 61 </fileset>
- 62 </cobertura-instrument>
- 63 </target>
- 64
- 65 <!-- 单元测试 -->
- 66 <target name="test" depends="init,compile">
- 67 <junit fork="yes" dir="${basedir}" failureProperty="test.failed">
- 68 <!--
- 69 Note the classpath order: instrumented classes are before the
- 70 original (uninstrumented) classes. This is important.
- 71 -->
- 72 <classpath location="${instrumented.dir}" />
- 73 <classpath location="${classes.dir}" />
- 74
- 75 <!--
- 76 The instrumented classes reference classes used by the
- 77 Cobertura runtime, so Cobertura and its dependencies
- 78 must be on your classpath.
- 79 -->
- 80 <classpath refid="cobertura.classpath" />
- 81
- 82 <formatter type="xml" />
- 83 <test name="${testcase}" todir="${reports.xml.dir}" if="testcase" />
- 84 <batchtest todir="${reports.xml.dir}" unless="testcase">
- 85 <fileset dir="${test.dir}">
- 86 <include name="**/*Test.java" />
- 87 </fileset>
- 88 <fileset dir="${src.dir}">
- 89 <include name="**/*Test.java" />
- 90 </fileset>
- 91 </batchtest>
- 92 </junit>
- 93
- 94 <junitreport todir="${reports.xml.dir}">
- 95 <fileset dir="${reports.xml.dir}">
- 96 <include name="TEST-*.xml" />
- 97 </fileset>
- 98 <report format="frames" todir="${reports.html.dir}" />
- 99 </junitreport>
- 100 </target>
- 101
- 102 <target name="coverage-check">
- 103 <cobertura-check branchrate="34" totallinerate="100" />
- 104 </target>
- 105
- 106 <!-- 生成 coverage xml格式报告 -->
- 107 <target name="coverage-report">
- 108 <!--
- 109 Generate an XML file containing the coverage data using
- 110 the "srcdir" attribute.
- 111 -->
- 112 <cobertura-report srcdir="${src.dir}" destdir="${coverage.xml.dir}" format=
- "xml" />
- 113 </target>
- 114
- 115 <!-- 生成 coverage html格式报告 -->
- 116 <target name="alternate-coverage-report">
- 117 <!--
- 118 Generate a series of HTML files containing the coverage
- 119 data in a user-readable form using nested source filesets.
- 120 -->
- 121 <cobertura-report destdir="${coverage.html.dir}">
- 122 <fileset dir="${src.dir}">
- 123 <include name="**/*.java"/>
- 124 </fileset>
- 125 </cobertura-report>
- 126 </target>
- 127
- 128 <target name="clean" description="Remove all files created by the build/test
- process.">
- 129 <delete dir="${classes.dir}" />
- 130 <delete dir="${instrumented.dir}" />
- 131 <delete dir="${reports.dir}" />
- 132 <delete file="cobertura.log" />
- 133 <delete file="cobertura.ser" />
- 134 </target>
- 135
- 136 <target name="coverage" depends="compile,instrument,test,coverage-report,
- alternate-coverage-report" description="Compile, instrument ourself,
- run the tests and generate JUnit and coverage reports."/>
- 137
- 138 </project>
- 139
build.properties文件
- # The source code for the examples can be found in this directory
- src.dir=../src/java
- src.conf.dir=../src/conf
- test.dir=../test/java
- test.conf.dir=../src/conf
- # The path to cobertura.jar
- coberturacoberturacobertura.dir=cobertura
- # Classes generated by the javac compiler are deposited in this directory
- classes.dir=../bin
- # Instrumented classes are deposited into this directory
- instrumentedinstrumentedinstrumented.dir=instrumented
- # All reports go into this directory
- reportsreportsreports.dir=reports
- # Unit test reports from JUnit are deposited into this directory
- reports.xml.dir=${reports.dir}/junit-xml
- reports.html.dir=${reports.dir}/junit-html
- # Coverage reports are deposited into these directories
- coverage.xml.dir=${reports.dir}/cobertura-xml
- coverage.html.dir=${reports.dir}/cobertura-html
编写示例代码
Hello.java
编写测试Hello.java的测试类,进行单元测试
HelloTest.java
接下来,我们运行 Cobertura来进行测试
运行 Cobertura,测试在Eclipse运行时,要在Ant插件的运行类库环境中加入cobertura相关类库。
查看运行结果报告:
JUnit报告
Cobertura报告
到目前已经完成整个项目的基于Ant进行编译,测试以及生成Cobertura测试报告的开发IDE环境。这个项目框架足以应用日常的开发需求。
Cobertura官网地址: http://cobertura.sourceforge.net/