用 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 下載到該文件)甚至可以在里面定義一些我們需要的東西。
          (可以參看:http://ant.apache.org/manual/OptionalTasks/junitreport.html
           
          <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


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           

          導(dǎo)航

          <2025年5月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          統(tǒng)計(jì)

          常用鏈接

          留言簿(6)

          隨筆分類

          隨筆檔案(17)

          文章分類(86)

          收藏夾(3)

          flex blog

          good site

          java blog

          my friend

          tools

          抓蝦

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 体育| 江孜县| 新竹市| 梧州市| 博客| 漠河县| 东平县| 宁国市| 济源市| 涟水县| 泰州市| 巍山| 景泰县| 大渡口区| 东源县| 建德市| 宁陕县| 德兴市| 景泰县| 白城市| 扶沟县| 青河县| 丰城市| 上思县| 伊吾县| 富川| 黄骅市| 南靖县| 芦溪县| 阿坝县| 全州县| 长武县| 犍为县| 德格县| 寻甸| 小金县| 防城港市| 新乡市| 濉溪县| 南木林县| 屯留县|