公司现在对单元测试越发的看重,这对减少上线之后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> |
其中我的ant脚本写的还算清晰,就不多做解释了,如果大家谁对ant脚本不熟悉,可以看笔者几年以前写的一本电子书,下载地址:http://download.csdn.net/detail/wangwenjun69/3383401
3、执行测试报告:
运行命令:ant test-report
执行之后会在build/report/html下生成测试报告,其中打开index.html如下所示。
4、执行测试用例覆盖率:
执行命令:ant coverreport
执行之后会在build/report/coverage下生成覆盖报告,其中打开index.html如下所示
目标完成,顺便将demo的整个工程打包上传,如果有需要的可以直接下载。
5、总结:
dailybuild是敏捷开发思想中不可或缺的一部分,规范编码的风格和习惯,提高单元测试的覆盖率,有助于在编码阶段降一些bug揪出来,作为一个合格的软件开发人员,应该花一定的时间在单元测试和如何提高软件质量上面
|