Java Coverage(Cobertura)工具

Java Coverage(Cobertura)工具

 最近有点清闲了,我的前辈让我研究Java Coverage的工具,发现这个Cobertura很名就给大家介绍一下吧

首先当然是下载Cobertura的jar包了,这个工具底层是JCoverage,熟悉Jcoverage的对这个也不会陌生的

Cobertura官网 http://cobertura.sourceforge.net/

大家可以了解很多东西,比如现在的作者啊什么,这里就不介绍了

然后点Download,下载二进制版本,比如名字叫cobertura-1.9.4.1(我用的是最新的version)

最后就是实践了。。下面就给大家讲解一下这个到底是什么玩意

Cobertura是一个开源的java工具,它主要用在java test中 内部封装了JCoverage

它是一个用ant全自动的测试工具,很强大。

如果你想测试覆盖率的话,用这个软件是相当不错的

那么下面就举一个简单的例子来说明它的强大

以下为要测试的Java类

package com.example.simple;

/**
 * @author cnchenhl 2011/02/25
 */
public class PrintStringOfYourName {

    private String name = null;
    private int id = 0;
    private String sex = null;
    private int age = 0;
    private String address;

    public String getName() {
        return name;
    }

    public int getId() {
        return id;
    }

    public String getSex() {
        return sex;
    }

    public int getAge() {
        return age;
    }

    public String getAddress() {
        return address;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setId(int id) {
        this.id = id;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String toString() {
        return "Name :" + name + "ID :" + id + "Age :" + age + "Sex :" + sex + "Address :" + address;
    }

}

 下面是测试的类test

package com.example.simple;

import junit.framework.TestCase;

import org.junit.Before;
import org.junit.Test;

/**
 * 
 * @author cnchenhl 2011/02/25
 */
public class PrintStringOfYourNameTest extends TestCase {

    @Before
    public void setUp() throws Exception {
        System.setProperty("Dnet.sourceforge.cobertura.datafile", "D:/TestCorbertura/cobertura.ser");
    }

    @Test
    public void testtoString() {
        PrintStringOfYourName printStringOfYourName = new PrintStringOfYourName();
        printStringOfYourName.setAddress("shanghai");
        printStringOfYourName.setAge(24);
        printStringOfYourName.setId(0);
        printStringOfYourName.setName("chenhailong");
        printStringOfYourName.setSex("male");
        String str = printStringOfYourName.toString();
        assertEquals(str, "Name :chenhailongID :0Age :24Sex :maleAddress :shanghai");
    }
}

 好了准备工作完成了

那就准备自己的ant构建文件了。路径大家要仔细看,可能会有问题的,基本都是你们的路径有问题。

还要说明的一点是

System.setProperty("Dnet.sourceforge.cobertura.datafile", ""D:/TestCorbertura/cobertura.ser"");
是必须加的,官网指定的,大家要注意。因为instruments容易找不到cobertura.ser 文件,在ant中也要设定

具体的请看构建文件build.xml

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

<project name="cobertura.examples.basic" default="coverage" basedir=".">
	<property file="build.properties" />
	<property name="bin.dir" value="${basedir}/bin" />
	<property name="target" value="target" />
	<path id="cobertura.classpath">
		<fileset dir="${cobertura.dir}">
			<include name="cobertura.jar" />
			<include name="lib/**/*.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.summaryxml.dir}" />
		<mkdir dir="${coverage.html.dir}" />
		<mkdir dir="${target}" />
	</target>

	<target name="compile" depends="init">
		<javac srcdir="${src.dir}" destdir="${classes.dir}" debug="yes">
			<classpath refid="cobertura.classpath" />
		</javac>
	</target>

	<target name="instrument" depends="init,compile">
		<echo message="copy the file to the classes" />
		<copy todir="${classes.dir}">
			<fileset dir="${bin.dir}">
				<include name="**/*.class" />
			</fileset>
		</copy>
		<delete file="cobertura.ser" />
		<delete dir="${instrumented.dir}" />
		<cobertura-instrument todir="${instrumented.dir}">
			<ignore regex="org.apache.log4j.*" />
			<fileset dir="${classes.dir}">
				<include name="**/*.class" />
				<exclude name="**/*Test.class" />
			</fileset>
		</cobertura-instrument>
	</target>

	<target name="test" depends="init,compile">
		<junit fork="yes" dir="${basedir}" failureProperty="test.failed">
			<classpath location="${instrumented.dir}" />
			<classpath location="${classes.dir}" />
			<classpath >
			</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="${src.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">
		<cobertura-report srcdir="${src.dir}" destdir="${coverage.xml.dir}" format="xml" />
	</target>

	<target name="summary-coverage-report">
		<cobertura-report srcdir="${src.dir}" destdir="${coverage.summaryxml.dir}" format="summaryXml" />
	</target>

	<target name="alternate-coverage-report">
		<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" />
		<delete dir="${target}" />
	</target>

	<target name="coverage" depends="compile,instrument,test,coverage-report,summary-coverage-report,alternate-coverage-report,band" description="Compile, instrument ourself, run the tests and generate JUnit and coverage reports." />
	<target name="band">
		<delete file="${target}/report.zip" />
		<jar destfile="${target}/report.zip" basedir="${reports.dir}">
			<manifest>
				<attribute name="Build-Time" value="${timeStamp.day}" />
			</manifest>
		</jar>
	</target>
</project>

 下面是构建文件需要的环境变量

# The source code for the examples can be found in this directory
src.dir=src

# The path to cobertura.jar
cobertura.dir=D:/cobertura-1.9.4.1

# Classes generated by the javac compiler are deposited in this directory
classes.dir=classes

# Instrumented classes are deposited into this directory
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.summaryxml.dir=${reports.dir}/cobertura-summary-xml
coverage.html.dir=${reports.dir}/cobertura-html

 好了以上就大功告成了

哈哈

大家也尝试一下

如果有什么问题的话请给我留言!

谢谢大家的支持

你可能感兴趣的:(java,xml,ant,JUnit,软件测试)