公司现在对单元测试越发的看重,这对减少上线之后bug的减少会带来很好的帮助,在笔者就职的公司里,在编写代码阶段,开发人员需要做如下一些事情:
1、checkstyle统一规范代码的格式,注释的数量。
2、junit进行代码的单元测试,并且在覆盖率上面有比较高的要求。
3、dailybuild结合上述两者并且外加findbugs。
4、除此之外,为了防止提交不合法的代码到SVN仓库,又做了SVN的控制,特意开发了SVN hooks,如果代码不符合checkstyle和单元测试,以及findbugs等要求,都会提交代码失败。
很开心项目组的这些工作我都有参与进去进行设计和进行具体的开发,今天就分享一下我写的一个很小的demo,主要是针对ant+junit进行单元测试以及生成测试报告,并且利用jacoco进行单元测试覆盖率的报告,其中ant+junit的组合想必很多人已经非常的熟悉了~这里就不再赘述,jacoco是一个比较优秀以及很强大的工具,如果大家有兴趣可以看看jacoco顺便研究一下sonar+jacoco+maven的组合。 jacoco的下载地址为:http://www.eclemma.org/jacoco/
在本文中,我们就一个很小的工程进行一下上述三者的组合,让大家体验一下如何进行测试报告以及覆盖报告的生成。
1.build.properties文件
在开始编写build.xml之前,我们先定义一下build.properties文件
<span style="font-size:18px;">#Mon, 25 Nov 2013 12:08:58 +0800 src.dir=src test.src.dir=test build.dir=build build.classes=${build.dir}/classes build.test.dir=${build.dir}/test build.test.classes=${build.test.dir}/classes build.test.report=${build.dir}/report build.test.report.coverage=${build.test.report}/coverage junit.lib.dir=devlib </span> |
2.build.xml文件
<span style="font-size:18px;"><?xml version="1.0" encoding="UTF-8"?> <!-- ====================================================================== Nov 25, 2013 11:51:47 AM project description clouder ====================================================================== --> <project name="build" default="init" basedir="." xmlns:jacoco="antlib:org.jacoco.ant"> <taskdef uri="antlib:org.jacoco.ant" resource="org/jacoco/ant/antlib.xml"> <classpath path="${basedir}/devlib/jacocoant.jar"> </classpath> </taskdef> <property file="build.properties"> </property> <path id="compile-test-path"> <pathelement location="${build.classes}" /> <fileset dir="${junit.lib.dir}"> <include name="**/*.jar" /> </fileset> </path> <path id="run-test-path"> <path refid="compile-test-path" /> <pathelement location="${build.test.classes}" /> </path> <target name="init" depends="clean"> <mkdir dir="${build.dir}" /> <mkdir dir="${build.classes}" /> <mkdir dir="${build.test.dir}" /> <mkdir dir="${build.test.classes}" /> <mkdir dir="${build.test.report}" /> <mkdir dir="${build.test.report.coverage}" /> </target> <target name="clean"> <delete dir="${build.dir}"> </delete> </target> <target name="src_compile" depends="init"> <javac srcdir="${src.dir}" destdir="${build.classes}" failonerror="true" verbose="true"> </javac> </target> <target name="test_compile" depends="src_compile"> <javac srcdir="${test.src.dir}" destdir="${build.test.classes}" failonerror="true" verbose="true"> <classpath refid="compile-test-path"> </classpath> </javac> </target> <target name="coverage"> <jacoco:coverage> <junit haltonfailure="false" fork="true" printsummary="true"> <classpath refid="run-test-path"> </classpath> <formatter type="xml" /> <batchtest todir="${build.test.report}"> <fileset dir="${build.test.classes}" includes="**/*Test*.class"> </fileset> </batchtest> </junit> </jacoco:coverage> </target> <target name="run-test" depends="test_compile"> <junit haltonfailure="false" fork="true" printsummary="true"> <classpath refid="run-test-path"> </classpath> <formatter type="xml" /> <batchtest todir="${build.test.report}"> <fileset dir="${build.test.classes}" includes="**/*Test*.class"> </fileset> </batchtest> </junit> </target> <target name="test-report" depends="run-test"> <junitreport todir="${build.test.report}"> <fileset dir="${build.test.report}"> <include name="TEST-*.xml" /> </fileset> <report format="frames" todir="${build.test.report}/html" /> </junitreport> </target> <target name="coverreport" depends="coverage"> <jacoco:report> <executiondata> <file file="${basedir}/jacoco.exec" /> </executiondata> <structure name="MeltingPot unit test coverage rate report."> <classfiles> <fileset dir="${build.classes}" /> </classfiles> <sourcefiles encoding="UTF-8"> <fileset dir="${src.dir}" /> </sourcefiles> </structure> <html footer="Onecloud MeltingPot." destdir="${build.test.report.coverage}" /> <csv destfile="${build.test.report.coverage}/coverage-report.csv" /> </jacoco:report> </target> <target name="all-report" depends="coverreport,test-report"> <echo>generate unit test report and coverage rate report.</echo> </target> </project> </span> |
原文转自:http://www.uml.org.cn/Test/201402143.asp