注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

0与1构筑世界,程序员创造时代

软件架构设计 Java编程

 
 
 

日志

 
 

单元测试 - JUnit+Ant自动化执行单元测试并生成报告 | How to Automated Unit Testing with JUnit and Ant  

2013-02-27 17:16:10|  分类: Java |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
单元测试 - JUnit+Ant自动化执行单元测试并生成报告 | How to Automated Unit Testing with JUnit and Ant - 傲风 - 宝剑锋从磨砺出 梅花香自苦寒来

    JUnit是Java社区广泛使用的单元测试框架,使单元测试编写和执行变得非常容易,并且几乎所有的流行Java IDE(Eclipse, NetBeans)都集成了它。而JUnit结合Ant可以自动化执行一个项目所有的单元测试并输出单元测试报告。
    下面通过一个完整的脚本样例来说明如何编写Ant脚本执行一个项目的单元测试用例和输出单元测试报告。

一、定义源代码目录和编译输出目录和classpath等变量定义 | Variable Definitions

单元测试-自动化执行单元测试并输出报告 - 傲风 - 宝剑锋从磨砺出 梅花香自苦寒来
1、业务源代码目录(src.java.dir) ,单元测试源代码目录(src.test.dir)。
2、业务源代码编译后输出目录(target.java.dir),单元测试源代码编译后输出目录(target.unit-test.dir),Cobertura打点后的输出目录(target.cover-test.dir)。
3、第三方依赖库目录。
4、单元测试执行报告输出目录(target.unit-test.dir),单元测试覆盖率报告输出目录(target.cover-test-report.dir)。
5、业务源代码编译所需的classpath(app.classpath),单元测试源代码编译所需的classpath(app.test.classpath)。

二、编译业务源代码和单元测试源代码 | Compile Code

单元测试-自动化执行单元测试并输出报告 - 傲风 - 宝剑锋从磨砺出 梅花香自苦寒来
1、编译业务源代码。
2、编译单元测试源代码。

三、执行单元测试用例并生成单元测试报告 | Unit Test And Generate Report

单元测试-自动化执行单元测试并输出报告 - 傲风 - 宝剑锋从磨砺出 梅花香自苦寒来
1、批量执行单元测试,并且以xml格式输出每一个用例的执行结果。
<junit>标签配置属性说明:
  • printsummary - 为每一个测试用例通过System.out输出一行统计信息,如果出错或测试失败则通过System.err输出信息。
  • haltonerror - 执行单元测试出错时停止执行的后续用例。
  • haltonfailure - 执行单元测试失败时停止执行的后续用例。
  • fork - 在独立的VM中执行单元测试用例。
<formatter>标签的配置属性说明:
  •  type - 单元测试用例执行结果输出格式。可选项有:plain, xml, brief 或 failure
  •  usefile - 单元测试用例执行结果是否输出至文件
<batchtest>标签的配置属性说明:
  • todir - 单元测试用例执行结果输出目录。

2、根据每个用例的执行结果文件Test-*.xml输出单元测试报告。
<junitreport>标签配置属性说明:
  • todir - 单元测试报告输出目录。

四、执行脚本并查看单元测试报告 | Execute Script And View Report

在命令行中输入: ant unit-test-report ,最终输出的单元测试报告类似如下:

单元测试-自动化执行单元测试并输出报告 - 傲风 - 宝剑锋从磨砺出 梅花香自苦寒来
 

附录:完整的Ant脚本build.xml样例

<?xml version="1.0" encoding="UTF-8" ?>
<project name="busimonitor" basedir=".">
    <property name="src.java.dir" location="${basedir}/app" />
    <property name="src.test.dir" location="${basedir}/test" />
    <property name="target.dir" location="${basedir}/classes" />
    <property name="target.java.dir" location="${target.dir}/java" />
    <property name="target.unit-test.dir" location="${target.dir}/unit-test" />
    <property name="target.cover-test.dir" location="${target.dir}/cover-test" />
    <property name="src.extend.lib.dir" location="${basedir}/lib"/>
    <property name="play.lib.dir" location="/devdata/projects/game/play-1.2.5/framework" />
    <property name="target.report.dir" location="${basedir}/report" />
    <property name="target.unit-test-report.dir" location="${target.report.dir}/unit-test" />
    <property name="target.cover-test-report.dir" location="${target.report.dir}/cover-test" />
    <path id="app.classpath">         <fileset dir="${play.lib.dir}">             <include name="**/*.jar" />         </fileset>         <fileset dir="${src.extend.lib.dir}">             <include name="*.jar" />         </fileset>
        <path location="${target.java.dir}" />         <path location="${basedir}/conf" />     </path>
    <path id="app.test.classpath">         <path location="${target.unit-test.dir}" />     </path>
    <target name="compile.java">         <mkdir dir="${target.java.dir}" />         <javac srcdir="${src.java.dir}" destdir="${target.java.dir}"              debug="on" source="1.6" includeantruntime="on">             <classpath refid="app.classpath"></classpath>         </javac>     </target>
    <target name="compile.test" depends="compile.java">         <mkdir dir="${target.unit-test.dir}" />         <javac srcdir="${src.test.dir}" destdir="${target.unit-test.dir}"              debug="on" source="1.6" includeantruntime="on">             <classpath refid="app.classpath"></classpath>             <classpath refid="app.test.classpath"></classpath>         </javac>
        <copy todir="${target.unit-test.dir}">             <fileset dir="${src.test.dir}">                 <include name="**/*.properties" />                 <include name="**/*.xml" />             </fileset>         </copy>     </target>
    <target name="compile" depends="compile.java, compile.test"></target>
    <target name="unit-test" depends="compile">         <mkdir dir="${target.unit-test-report.dir}" />         <junit printsummary="on" haltonerror="off"              haltonfailure="off" fork="on">             <formatter type="plain" usefile="off"/>             <formatter type="xml" usefile="on" />             <batchtest todir="${target.unit-test-report.dir}">                 <fileset dir="${target.unit-test.dir}">                     <include name="**/*Test.class"/>                 </fileset>             </batchtest>             <classpath refid="app.classpath"></classpath>             <classpath refid="app.test.classpath"></classpath>         </junit>     </target>
    <target name="unit-test-report" depends="unit-test">         <mkdir dir="${target.unit-test-report.dir}/html" />         <junitreport todir="${target.unit-test-report.dir}">             <fileset dir="${target.unit-test-report.dir}">                 <include name="TEST-*.xml" />             </fileset>             <report todir="${target.unit-test-report.dir}/html" />         </junitreport>     </target> </project>


参考资料 | References



<正文结束>

文章声明


作者:傲风(aofengblog@163.com)       编写时间:2013年02月27日

网址:http://aofengblog.blog.163.com

作者保留所有权利,转载请保留文章全部内容或者说明原作者和转载地址!

  评论这张
 
阅读(9472)| 评论(3)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017