在软件开发过程中,我们通常需要对各个功能模块以至类的方法进行详细的测试。这种对最小的软件单元进行验证的工作也叫做单元测试,单元测试通常在编码过程中进行,在以测试驱动开发的项目中,单元测试是一项非常重要的工作,但随着开发过程的深入,我们所积累的单元测试案例就会越来越多,面对成百上千个测试类,单独运行每个案例不仅费时,而且很难在以后的集成测试中利用先前的单元测试案例构建出一个完整的测试报告。
Junit是一个用于java软件测试的开源项目,主要的应用也是作为单元测试,虽然设计短小,但功能却是非常强大。目前有很多在junit上进行扩展的项目帮助我们完成各种测试。比如web性能测试的httpunit,jmeter,用于代码覆盖测试的hansel,用于数据库性能测试的dbunit等等,应用遍布软件测试的各个领域。
Ant同样是一个非常优秀的java项目构建工具。据ant的创始人James Duncan Davidson说,ant代表:"Another Neat Tool"。同样的,ant在英文中是“蚂蚁“的意思,这又代表着它有建筑本领高超和身躯虽小,但功能却极其强大的意思(可以参看:
http://ant.apache.org/faq.html#ant-name
),ant项目从2000年开始,一直未停止更新工作,目前的最高版本是1.7.0。
在下面我们还需要用到java的IDE开发工具Eclipse。在最新的3.2版本中,eclipse已经整合了junit4、junit3.8.1和ant1.6.5。但由于只有在ant1.7.0以后版本中才开始支持junit,因此需要我们从
http://ant.apache.org
下载最新的1.7.0,并重新设置eclipse的Ant Home的位置指向ant1.7.0的lib包。如图:
Eclipse里面已经自带了junit4和junit3.8.1,如果使用的jdk环境是5.0(jdk1.5)可以使用junit4,如果是1.4则使用junit3.8.1。查看和设置项目的jdk环境可以通过project ->properties ->java compiler.如图:
默认情况下,"Enable project specific settings" 选项是未选中的,则项目使用当前操作系统默认的java环境(跟你设置的java build path无关)。
下面,我们创建一个测试项目,名字为:test,并创建两个源文件夹:src和test..把项目源文件和测试文件分开放在这两个文件夹中。
我们在src编写一个测试类:
package com.widetrust;
public class CountService {
private int summary;
private int count;
public boolean stat(int visitor){
count++;
summary += visitor;
if(summary>1000 && count>2){
return true;
}else{
return false;
}
}
}
|
在test文件夹写个测试该类的类:
package com.widetrust.test;
import com.widetrust.CountService;
import junit.framework.TestCase;
public class TestCountService extends TestCase {
CountService cs;
protected void setUp() throws Exception {
cs = new CountService();
}
protected void tearDown() throws Exception {
}
public void testStat(){
assertEquals(true, cs.stat(4000));
}
public void testStat2(){
cs.stat(2000);
cs.stat(2000);
assertEquals(true, cs.stat(3000));
}
}
|
当然我们可以利用eclipse的Run As Junit Test(快捷键:Alt+Shift+X T)运行我们刚写好的测试案例,但有个问题是eclipse不能正确的同步我们的开发和测试程序,而且,我们可能还希望测试的过程中为我们提供一份详细的报告文档,以供我们在测试后的改进过程中的讨论。现在我们使用ant的自动编译功能来实现测试的自动化,并让它生成一份详细的测试报告。
注意的是,ant自带了junit的支持包,但项目需要junit.jar,还需要在项目的lib文件夹中放置junit.jar,(这里我假设工程目录存放项目依赖组件的是lib文件夹)如果我们要单独使用ant编译整个项目,需要在项目构建文件build.xml中定义编译所用到的lib包。当然,为了省事,我们也可以把项目依赖的lib包放到ant的设置项Global Entries 中,如图:
这里我们把项目依赖包都设置在build.xml中:
在项目的根目录创建一个build.xml,内容如下:
<?xml version="1.0"?>
<project name="ant and junit" default="test auot junit and report" basedir=".">
<!-- 定义工程依赖的jar包存放的位置 -->
<property name="lib.dir" value="lib"/>
<path id="classpath">
<fileset dir="${lib.dir}" includes="**/*.jar"/>
</path>
<property name="output folder" value="classes"/>
<property name="src folder" value="src"/>
<property name="test folder" value="test"/>
<property name="report folder" value="report"/>
<target name="clean">
<delete dir="report"/>
<echo>清除测试报告文件 成功!</echo>
</target>
<target name="compile init">
<mkdir dir="${output folder}"/>
<echo>创建编译文件夹 成功!</echo>
</target>
<target name="report init"depends="clean">
<mkdir dir="${report folder}"/>
<echo>创建测试报告文件夹 成功!</echo>
</target>
<target name="compile"depends="compile init">
<javac srcdir="${src folder}" destdir="${output folder}" classpathref="classpath"/>
<echo>项目源文件编译 成功!</echo>
</target>
<target name="test compile" depends="report init">
<javac srcdir="${test folder}" destdir="${output folder}" classpathref="classpath"/>
<echo>项目测试文件编译 成功!</echo>
</target>
<target name="all compile" depends="compile, test compile">
</target>
<target name="test auot junit and report" depends="all compile">
<junit printsummary="on" fork="true" showoutput="true">
<classpath>
<fileset dir="${lib.dir}"includes="**/*.jar"/>
<pathelement path="${output folder}"/>
</classpath>
<formatter type="xml"/>
<batchtest todir="${report folder}">
<fileset dir="${output folder}">
<include name="**/Test*.*"/>
</fileset>
</batchtest>
</junit>
<junitreport todir="${report folder}">
<fileset dir="${report folder}">
<include name="TEST-*.xml"/>
</fileset>
<report format="frames" todir="${report folder}"/>
</junitreport>
</target>
</project>
|
我们在eclipse中利用windows -> show View -> Ant 打开ant工作窗口,点击”Add Buildfiles” 将项目的根目录下的build.xml添加进去,然后在ant工作窗口点运行图标,可以看到控制台上的输出:(当然,用命令行方式运行也可以)
整个项目编译成功,并在项目根目录生成一个report文件夹,我们可以从中看到一份详细的测试报告:
我们可能会希望junit 和ant为我们提供中文的测试报告,很遗憾的是,ant并没有给我们提供这个选项,还好,ant可以让我们通过定义styledir属性,更改报告文件的输出样式的配置文件:我们要做的,就是汉化在ant安装文件夹中的junit-frames.xsl和junit-noframes.xsl,(也可以从
http://download.csdn.net/user/lemonfamily
下载到该文件)甚至可以在里面定义一些我们需要的东西。
<junitreporttodir="${report folder}">
<filesetdir="${report folder}">
<includename="TEST-*.xml"/>
</fileset>
<reportformat="frames"todir="${report folder}"styledir="junitreport"/>
</junitreport>
|
这是更改后的效果:
现在我们已经可以做到测试代码和开发代码分开,并利用ant的自动编译功能为我们执行测试计划和生成测试报告。虽然在编写测试案例的时候确实比较麻烦,我们需要详细的模拟实际应用中的环境,并寻找可能出现错误的边界值帮助我们在编写实际代码时尽量减少隐患的发生,往往编写测试案例的时间比我们编写实际代码的时间还长,但这样做是非常值得的,一个软件的开发周期最长的60%都是花在寻找错误和完善的过程中。