`

使用Cobertura统计测试覆盖率

阅读更多
官方:http://cobertura.sourceforge.net/


Cobertura是一个基于jcoverage的免费Java工具,它能够显示哪一部分代码被你的测试所覆盖,并可生成HTML或XML 报告.



cobertura 的大概基本工作思路:
1.对已经编译好的class 文件添加标记
2. 对添加好标记的代码进行单元测试
3. 输出覆盖率统计报告

在ant 中使用cobertura 的基本步骤:
1. 编译代码
2. 定义cobertura 的ant task
3. 用nstrument 命令为编译好的代码添加标记
4. 用junit 命令对添加好标记的代码进行单元测试
5. 用cobertura-report 命令输出报告


build.properties
#源代码目录
src.dir=src  
#测试代码目录
test.dir=test 

# The path to cobertura.jar
cobertura.dir=C:\\cobertura-1.9

# Classes generated by the javac compiler are deposited in this directory
# Classes所产生的javac编译器都存放在这个目录
classes.dir=classes

# Instrumented classes are deposited into this directory
# 所装入classes的存入这个目录
instrumented.dir=instrumented

# All reports go into this directory
reports.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

junit3.dir=D:\\junit3.8.1

junit4.dir=D:\\junit4.4

#数据库驱动的目录
jdbc.dir=path


build.xml

<?xml version="1.0" encoding="UTF-8"?>

<project name="测试项目" default="coverage" basedir=".">

	<property file="build.properties" />

	<path id="cobertura.classpath">
		<fileset dir="${cobertura.dir}">
			<include name="cobertura.jar" />
			<include name="lib/**/*.jar" />
		</fileset>
	</path>

	<path id="junit3.classpath">
		<fileset dir="${junit3.dir}">
			<include name="junit.jar" />
		</fileset>
	</path>

	<path id="junit4.classpath">
		<fileset dir="${junit4.dir}">
			<include name="junit4.jar" />
		</fileset>
	</path>

	
	<taskdef classpathref="cobertura.classpath" resource="tasks.properties" />

	<target name="init">
		<mkdir dir="${classes.dir}" />
		<mkdir dir="${instrumented.dir}" />
		<mkdir dir="${reports.xml.dir}" />
		<mkdir dir="${reports.html.dir}" />
		<mkdir dir="${coverage.xml.dir}" />
		<mkdir dir="${coverage.html.dir}" />
	</target>

	<target name="compile" depends="init">
//源代码
		<javac srcdir="${src.dir}" destdir="${classes.dir}" debug="yes">
			<classpath refid="cobertura.classpath" />
			<classpath refid="junit3.classpath" />
			<classpath refid="junit4.classpath" />
			
		</javac>
//测试代码
		<javac srcdir="${test.dir}" destdir="${classes.dir}" debug="yes">
			<classpath refid="cobertura.classpath" />
			<classpath refid="junit3.classpath" />
			<classpath refid="junit4.classpath" />
			
		</javac>
	</target>

	<target name="instrument" depends="init,compile">
		<!--
			Remove the coverage data file and any old instrumentation.
		-->
		<delete file="cobertura.ser" />
		<delete dir="${instrumented.dir}" />

		<!--
			Instrument the application classes, writing the
			instrumented classes into ${build.instrumented.dir}.
		-->
		<cobertura-instrument todir="${instrumented.dir}">
			<!--
				The following line causes instrument to ignore any
				source line containing a reference to log4j, for the
				purposes of coverage reporting.
			-->
			<ignore regex="org.apache.log4j.*" />

			<fileset dir="${classes.dir}">
				<!--
					Instrument all the application classes, but
					don't instrument the test classes.
				-->
				<include name="**/*.class" />
				<exclude name="**/*Test*.class" />
				<exclude name="**/Test.class"/>
				<exclude name="com/pattern/**/*.class"/>
			</fileset>
		</cobertura-instrument>
	</target>

	<target name="test" depends="init,compile">
		<junit fork="yes" dir="${basedir}" failureProperty="test.failed">
			<!--
				Note the classpath order: instrumented classes are before the
				original (uninstrumented) classes.  This is important.
			-->
			<classpath location="${instrumented.dir}" />
			<classpath location="${classes.dir}" />
			<classpath refid="junit3.classpath"></classpath>
			<classpath refid="junit4.classpath"></classpath>
			<classpath location="${jdbc.dir}"></classpath>

			<!--
				The instrumented classes reference classes used by the
				Cobertura runtime, so Cobertura and its dependencies
				must be on your classpath.
			-->
			<classpath refid="cobertura.classpath" />

			<formatter type="xml" />
			<test name="${testcase}" todir="${reports.xml.dir}" if="testcase" />
			<batchtest todir="${reports.xml.dir}" unless="testcase">
				<fileset dir="${test.dir}">
					<include name="**/*Test*.java" />
				</fileset>
			</batchtest>
		</junit>

		<junitreport todir="${reports.xml.dir}">
			<fileset dir="${reports.xml.dir}">
				<include name="TEST-*.xml" />
			</fileset>
			<report format="frames" todir="${reports.html.dir}" />
		</junitreport>
	</target>

	<target name="coverage-check">
		<cobertura-check branchrate="34" totallinerate="100" />
	</target>

	<target name="coverage-report">
		<!--
			Generate an XML file containing the coverage data using
			the "srcdir" attribute.
		-->
		<cobertura-report srcdir="${src.dir}" destdir="${coverage.xml.dir}" format="xml" />
	</target>

	<target name="alternate-coverage-report">
		<!--
			Generate a series of HTML files containing the coverage
			data in a user-readable form using nested source filesets.
		-->
		<cobertura-report destdir="${coverage.html.dir}">
			<fileset dir="${src.dir}">
				<include name="**/*.java" />
			</fileset>
		</cobertura-report>
	</target>

	<target name="clean" description="Remove all files created by the build/test process.">
		<delete dir="${classes.dir}" />
		<delete dir="${instrumented.dir}" />
		<delete dir="${reports.dir}" />
		<delete file="cobertura.log" />
		<delete file="cobertura.ser" />
	</target>

	<target name="coverage" depends="clean,compile,instrument,test,coverage-report,alternate-coverage-report" description="Compile, instrument ourself, run the tests and generate JUnit and coverage reports." />

</project>



具体看官方文档
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics