用 ant 自動化測試 (轉(zhuǎn))
利用ant和junit實(shí)現(xiàn)單元測試的自動化
在軟件開發(fā)過程中,我們通常需要對各個(gè)功能模塊以至類的方法進(jìn)行詳細(xì)的測試。這種對最小的軟件單元進(jìn)行驗(yàn)證的工作也叫做單元測試,單元測試通常在編碼過程中進(jìn)行,在以測試驅(qū)動開發(fā)的項(xiàng)目中,單元測試是一項(xiàng)非常重要的工作,但隨著開發(fā)過程的深入,我們所積累的單元測試案例就會越來越多,面對成百上千個(gè)測試類,單獨(dú)運(yùn)行每個(gè)案例不僅費(fèi)時(shí),而且很難在以后的集成測試中利用先前的單元測試案例構(gòu)建出一個(gè)完整的測試報(bào)告。
Junit是一個(gè)用于java軟件測試的開源項(xiàng)目,主要的應(yīng)用也是作為單元測試,雖然設(shè)計(jì)短小,但功能卻是非常強(qiáng)大。目前有很多在junit上進(jìn)行擴(kuò)展的項(xiàng)目幫助我們完成各種測試。比如web性能測試的httpunit,jmeter,用于代碼覆蓋測試的hansel,用于數(shù)據(jù)庫性能測試的dbunit等等,應(yīng)用遍布軟件測試的各個(gè)領(lǐng)域。
Ant同樣是一個(gè)非常優(yōu)秀的java項(xiàng)目構(gòu)建工具。據(jù)ant的創(chuàng)始人James Duncan Davidson說,ant代表:"Another Neat Tool"。同樣的,ant在英文中是“螞蟻“的意思,這又代表著它有建筑本領(lǐng)高超和身軀雖小,但功能卻極其強(qiáng)大的意思(可以參看:http://ant.apache.org/faq.html#ant-name),ant項(xiàng)目從2000年開始,一直未停止更新工作,目前的最高版本是1.7.0。
在下面我們還需要用到j(luò)ava的IDE開發(fā)工具Eclipse。在最新的3.2版本中,eclipse已經(jīng)整合了junit4、junit3.8.1和ant1.6.5。但由于只有在ant1.7.0以后版本中才開始支持junit,因此需要我們從http://ant.apache.org下載最新的1.7.0,并重新設(shè)置eclipse的Ant Home的位置指向ant1.7.0的lib包。如圖:
Eclipse里面已經(jīng)自帶了junit4和junit3.8.1,如果使用的jdk環(huán)境是5.0(jdk1.5)可以使用junit4,如果是1.4則使用junit3.8.1。查看和設(shè)置項(xiàng)目的jdk環(huán)境可以通過project ->properties ->java compiler.如圖:
默認(rèn)情況下,"Enable project specific settings" 選項(xiàng)是未選中的,則項(xiàng)目使用當(dāng)前操作系統(tǒng)默認(rèn)的java環(huán)境(跟你設(shè)置的java build path無關(guān))。
下面,我們創(chuàng)建一個(gè)測試項(xiàng)目,名字為:test,并創(chuàng)建兩個(gè)源文件夾:src和test..把項(xiàng)目源文件和測試文件分開放在這兩個(gè)文件夾中。
我們在src編寫一個(gè)測試類:
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文件夾寫個(gè)測試該類的類:
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));
}
}
|
當(dāng)然我們可以利用eclipse的Run As Junit Test(快捷鍵:Alt+Shift+X T)運(yùn)行我們剛寫好的測試案例,但有個(gè)問題是eclipse不能正確的同步我們的開發(fā)和測試程序,而且,我們可能還希望測試的過程中為我們提供一份詳細(xì)的報(bào)告文檔,以供我們在測試后的改進(jìn)過程中的討論。現(xiàn)在我們使用ant的自動編譯功能來實(shí)現(xiàn)測試的自動化,并讓它生成一份詳細(xì)的測試報(bào)告。
注意的是,ant自帶了junit的支持包,但項(xiàng)目需要junit.jar,還需要在項(xiàng)目的lib文件夾中放置junit.jar,(這里我假設(shè)工程目錄存放項(xiàng)目依賴組件的是lib文件夾)如果我們要單獨(dú)使用ant編譯整個(gè)項(xiàng)目,需要在項(xiàng)目構(gòu)建文件build.xml中定義編譯所用到的lib包。當(dāng)然,為了省事,我們也可以把項(xiàng)目依賴的lib包放到ant的設(shè)置項(xiàng)Global Entries 中,如圖:
這里我們把項(xiàng)目依賴包都設(shè)置在build.xml中:
在項(xiàng)目的根目錄創(chuàng)建一個(gè)build.xml,內(nèi)容如下:
<?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>清除測試報(bào)告文件 成功!</echo>
</target>
<target name="compile init">
<mkdir dir="${output folder}"/>
<echo>創(chuàng)建編譯文件夾 成功!</echo>
</target>
<target name="report init"depends="clean">
<mkdir dir="${report folder}"/>
<echo>創(chuàng)建測試報(bào)告文件夾 成功!</echo>
</target>
<target name="compile"depends="compile init">
<javac srcdir="${src folder}" destdir="${output folder}" classpathref="classpath"/>
<echo>項(xiàng)目源文件編譯 成功!</echo>
</target>
<target name="test compile" depends="report init">
<javac srcdir="${test folder}" destdir="${output folder}" classpathref="classpath"/>
<echo>項(xiàng)目測試文件編譯 成功!</echo>
</target>
<target name="all compile" depends="compile, test compile">
</target>
<target name="test auot junit and report" depends="all compile">
<junitprint summary="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}">
<filesetdir="${report folder}">
<include name="TEST-*.xml"/>
</fileset>
<report format="frames" todir="${report folder}"/>
</junitreport>
</target>
</project>
|
我們在eclipse中利用windows -> show View -> Ant 打開ant工作窗口,點(diǎn)擊”Add Buildfiles” 將項(xiàng)目的根目錄下的build.xml添加進(jìn)去,然后在ant工作窗口點(diǎn)運(yùn)行圖標(biāo),可以看到控制臺上的輸出:(當(dāng)然,用命令行方式運(yùn)行也可以)
整個(gè)項(xiàng)目編譯成功,并在項(xiàng)目根目錄生成一個(gè)report文件夾,我們可以從中看到一份詳細(xì)的測試報(bào)告:
我們可能會希望junit 和ant為我們提供中文的測試報(bào)告,很遺憾的是,ant并沒有給我們提供這個(gè)選項(xiàng),還好,ant可以讓我們通過定義styledir屬性,更改報(bào)告文件的輸出樣式的配置文件:我們要做的,就是漢化在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>
|
這是更改后的效果:
現(xiàn)在我們已經(jīng)可以做到測試代碼和開發(fā)代碼分開,并利用ant的自動編譯功能為我們執(zhí)行測試計(jì)劃和生成測試報(bào)告。雖然在編寫測試案例的時(shí)候確實(shí)比較麻煩,我們需要詳細(xì)的模擬實(shí)際應(yīng)用中的環(huán)境,并尋找可能出現(xiàn)錯(cuò)誤的邊界值幫助我們在編寫實(shí)際代碼時(shí)盡量減少隱患的發(fā)生,往往編寫測試案例的時(shí)間比我們編寫實(shí)際代碼的時(shí)間還長,但這樣做是非常值得的,一個(gè)軟件的開發(fā)周期最長的60%都是花在尋找錯(cuò)誤和完善的過程中。
posted on 2007-09-03 18:00 leoli 閱讀(2423) 評論(0) 編輯 收藏 所屬分類: test