用 ant 自動(dòng)化測(cè)試 (轉(zhuǎn))
利用ant和junit實(shí)現(xiàn)單元測(cè)試的自動(dòng)化
在軟件開(kāi)發(fā)過(guò)程中,我們通常需要對(duì)各個(gè)功能模塊以至類的方法進(jìn)行詳細(xì)的測(cè)試。這種對(duì)最小的軟件單元進(jìn)行驗(yàn)證的工作也叫做單元測(cè)試,單元測(cè)試通常在編碼過(guò)程中進(jìn)行,在以測(cè)試驅(qū)動(dòng)開(kāi)發(fā)的項(xiàng)目中,單元測(cè)試是一項(xiàng)非常重要的工作,但隨著開(kāi)發(fā)過(guò)程的深入,我們所積累的單元測(cè)試案例就會(huì)越來(lái)越多,面對(duì)成百上千個(gè)測(cè)試類,單獨(dú)運(yùn)行每個(gè)案例不僅費(fèi)時(shí),而且很難在以后的集成測(cè)試中利用先前的單元測(cè)試案例構(gòu)建出一個(gè)完整的測(cè)試報(bào)告。
Junit是一個(gè)用于java軟件測(cè)試的開(kāi)源項(xiàng)目,主要的應(yīng)用也是作為單元測(cè)試,雖然設(shè)計(jì)短小,但功能卻是非常強(qiáng)大。目前有很多在junit上進(jìn)行擴(kuò)展的項(xiàng)目幫助我們完成各種測(cè)試。比如web性能測(cè)試的httpunit,jmeter,用于代碼覆蓋測(cè)試的hansel,用于數(shù)據(jù)庫(kù)性能測(cè)試的dbunit等等,應(yīng)用遍布軟件測(cè)試的各個(gè)領(lǐng)域。
Ant同樣是一個(gè)非常優(yōu)秀的java項(xiàng)目構(gòu)建工具。據(jù)ant的創(chuàng)始人James Duncan Davidson說(shuō),ant代表:"Another Neat Tool"。同樣的,ant在英文中是“螞蟻“的意思,這又代表著它有建筑本領(lǐng)高超和身軀雖小,但功能卻極其強(qiáng)大的意思(可以參看:http://ant.apache.org/faq.html#ant-name),ant項(xiàng)目從2000年開(kāi)始,一直未停止更新工作,目前的最高版本是1.7.0。
在下面我們還需要用到j(luò)ava的IDE開(kāi)發(fā)工具Eclipse。在最新的3.2版本中,eclipse已經(jīng)整合了junit4、junit3.8.1和ant1.6.5。但由于只有在ant1.7.0以后版本中才開(kāi)始支持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)境可以通過(guò)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無(wú)關(guān))。
下面,我們創(chuàng)建一個(gè)測(cè)試項(xiàng)目,名字為:test,并創(chuàng)建兩個(gè)源文件夾:src和test..把項(xiàng)目源文件和測(cè)試文件分開(kāi)放在這兩個(gè)文件夾中。
我們?cè)趕rc編寫(xiě)一個(gè)測(cè)試類:
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文件夾寫(xiě)個(gè)測(cè)試該類的類:
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)行我們剛寫(xiě)好的測(cè)試案例,但有個(gè)問(wèn)題是eclipse不能正確的同步我們的開(kāi)發(fā)和測(cè)試程序,而且,我們可能還希望測(cè)試的過(guò)程中為我們提供一份詳細(xì)的報(bào)告文檔,以供我們?cè)跍y(cè)試后的改進(jìn)過(guò)程中的討論?,F(xiàn)在我們使用ant的自動(dòng)編譯功能來(lái)實(shí)現(xiàn)測(cè)試的自動(dòng)化,并讓它生成一份詳細(xì)的測(cè)試報(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>清除測(cè)試報(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)建測(cè)試報(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)目測(cè)試文件編譯 成功!</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>
|
我們?cè)趀clipse中利用windows -> show View -> Ant 打開(kāi)ant工作窗口,點(diǎn)擊”Add Buildfiles” 將項(xiàng)目的根目錄下的build.xml添加進(jìn)去,然后在ant工作窗口點(diǎn)運(yùn)行圖標(biāo),可以看到控制臺(tái)上的輸出:(當(dāng)然,用命令行方式運(yùn)行也可以)
整個(gè)項(xiàng)目編譯成功,并在項(xiàng)目根目錄生成一個(gè)report文件夾,我們可以從中看到一份詳細(xì)的測(cè)試報(bào)告:
我們可能會(huì)希望junit 和ant為我們提供中文的測(cè)試報(bào)告,很遺憾的是,ant并沒(méi)有給我們提供這個(gè)選項(xiàng),還好,ant可以讓我們通過(guò)定義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)可以做到測(cè)試代碼和開(kāi)發(fā)代碼分開(kāi),并利用ant的自動(dòng)編譯功能為我們執(zhí)行測(cè)試計(jì)劃和生成測(cè)試報(bào)告。雖然在編寫(xiě)測(cè)試案例的時(shí)候確實(shí)比較麻煩,我們需要詳細(xì)的模擬實(shí)際應(yīng)用中的環(huán)境,并尋找可能出現(xiàn)錯(cuò)誤的邊界值幫助我們?cè)诰帉?xiě)實(shí)際代碼時(shí)盡量減少隱患的發(fā)生,往往編寫(xiě)測(cè)試案例的時(shí)間比我們編寫(xiě)實(shí)際代碼的時(shí)間還長(zhǎng),但這樣做是非常值得的,一個(gè)軟件的開(kāi)發(fā)周期最長(zhǎng)的60%都是花在尋找錯(cuò)誤和完善的過(guò)程中。
posted on 2007-09-03 18:00 leoli 閱讀(2418) 評(píng)論(0) 編輯 收藏 所屬分類: test