隨筆-94  評(píng)論-56  文章-3  trackbacks-0
          這一篇講述如何自動(dòng)運(yùn)行JUnit測(cè)試進(jìn)行自動(dòng)化測(cè)試。我們將JUnit測(cè)試放在test目錄。
          第一步:編譯測(cè)試
          首先,在build.xml文件里定義一個(gè)單獨(dú)的構(gòu)建目標(biāo),以便編譯測(cè)試源文件。
          ? <target name="compile-tests" depends="compile">
          ??? <javac srcdir="${test.dir}" destdir="${build.test.dir}">
          ????? <classpath refid="project.classpath" />
          ??? </javac>
          ? </target>
          compile-tests目標(biāo)用<javac>任務(wù)在test.dir目錄編譯測(cè)試源文件,并將結(jié)果類文件放入build.test.dir目錄,用project.classpath路徑作為測(cè)試代碼的類路徑。
          第二步:運(yùn)行測(cè)試
          在build.xml文件里定義構(gòu)建目標(biāo),使所有的JUnit測(cè)試自動(dòng)運(yùn)行。
          ? <target name="test" depends="compile-tests">
          ??? <junit haltonfailure="true">
          ????? <classpath refid="project.classpath" />
          ????? <formatter type="brief" usefile="false" />
          ????? <batchtest>
          ??????? <fileset dir="${build.test.dir}"
          ????????? includes="**/*Test.class" />
          ????? </batchtest>
          ????? <sysproperty key="doc.dir"?? value="${doc.dir}" />
          ????? <sysproperty key="index.dir" value="${index.dir}" />
          ??? </junit>
          ? </target>
          test目標(biāo)的depends屬性生成與剛定義的compile-tests目標(biāo)的依存關(guān)系。
          如果構(gòu)建成功,意味著所有的東西不僅都編譯過(guò),還都通過(guò)了測(cè)試。
          將haltonfailure屬性設(shè)為true會(huì)使構(gòu)建隨著任何測(cè)試失敗而失敗。
          這里我們?cè)俅斡胮roject.classpath定義了運(yùn)行JUnit測(cè)試的類路徑。
          下面定義了一個(gè)輸出格式化器,在<formatter> 元素中,使用brief類型來(lái)輸出每個(gè)運(yùn)行的測(cè)試用例的名稱及其統(tǒng)計(jì)信息,僅當(dāng)測(cè)試失敗時(shí)才有更詳細(xì)的信息(plain類型默認(rèn)比brief類型輸出信息多一些;xml類型將測(cè)試結(jié)果以XML格式輸出)。將usefile屬性值設(shè)為false會(huì)將測(cè)試結(jié)果送往控制臺(tái),而不是寫(xiě)入文件。
          <batchtest>任務(wù)收集從封閉<fileset>元素中返回的所有測(cè)試,并自動(dòng)創(chuàng)建包含了所有測(cè)試的測(cè)試suite。我們將對(duì)所有的測(cè)試類用*Test.java命名約定取名,這些文件將編譯成*Test.class文件,放在<fileset>的build.test.dir性質(zhì)指向的目錄中。
          最后,<sysproperty>元素定義系統(tǒng)性質(zhì)為一個(gè)鍵值對(duì),這些性質(zhì)可以在測(cè)試代碼中訪問(wèn)。這里,測(cè)試需要知道從哪里找到文檔,以及向哪里放入文檔的索引結(jié)果,在運(yùn)行測(cè)試時(shí)我們將傳遞這些結(jié)果,例如,測(cè)試在運(yùn)行時(shí)查看送入的doc.dir系統(tǒng)性質(zhì)來(lái)定位項(xiàng)目目錄結(jié)構(gòu)中doc目錄的絕對(duì)路徑。
          要運(yùn)行測(cè)試,請(qǐng)執(zhí)行test目標(biāo):
          $?ant test
          最后,打掃戰(zhàn)場(chǎng)
          我們可以定義一個(gè)刪除所有構(gòu)建輸出的Ant目標(biāo)。
          ? <target name="clean">
          ??? <delete dir="${build.dir}" />
          ? </target>
          clean目標(biāo)使用<delete>任務(wù)來(lái)刪除build.dir所指的目錄。要?jiǎng)h除目錄,請(qǐng)運(yùn)行clean目標(biāo):
          $ ant clean
          沖掉這些構(gòu)建輸出有積極的作用:從頭開(kāi)始生成構(gòu)建,可以發(fā)現(xiàn)可能被累積構(gòu)建掩蓋的錯(cuò)誤。

          完整的build.xml:
          <?xml?version="1.0"?>
          <!--
          ??Excerpted?from?the?book,?"Pragmatic?Project?Automation"
          ??ISBN?0-9745140-3-9
          ??Copyright?2004?The?Pragmatic?Programmers,?LLC.??All?Rights?Reserved.
          ??Visit?www.PragmaticProgrammer.com
          ?
          -->

          <project?name="dms"?default="compile"?basedir=".">
          ??
          ??
          <property?name="build.dir"??????location="build"/>
          ??
          <property?name="build.prod.dir"?location="${build.dir}/prod"/>
          ??
          <property?name="build.test.dir"?location="${build.dir}/test"/>
          ??
          <property?name="doc.dir"????????location="doc"/>
          ??
          <property?name="index.dir"??????location="index"/>
          ??
          <property?name="src.dir"????????location="src"/>
          ??
          <property?name="test.dir"???????location="test"/>
          ??
          <property?name="vendor.lib.dir"?location="vendor/lib"/>

          ??
          <path?id="project.classpath">
          ????
          <pathelement?location="${build.prod.dir}"?/>
          ????
          <pathelement?location="${build.test.dir}"?/>
          ????
          <fileset?dir="${vendor.lib.dir}">
          ??????
          <include?name="*.jar"/>
          ????
          </fileset>
          ??
          </path>????

          ??
          <target?name="prepare">
          ????
          <mkdir?dir="${build.prod.dir}"/>
          ????
          <mkdir?dir="${build.test.dir}"/>
          ??
          </target>


          ??
          <target?name="compile"?depends="prepare">
          ????
          <javac?srcdir="${src.dir}"?destdir="${build.prod.dir}">
          ??????
          <classpath?refid="project.classpath"?/>
          ????
          </javac>
          ??
          </target>

          ??
          <target?name="compile-tests"?depends="compile">
          ????
          <javac?srcdir="${test.dir}"?destdir="${build.test.dir}">
          ??????
          <classpath?refid="project.classpath"?/>
          ????
          </javac>
          ??
          </target>

          ??
          <target?name="test"?depends="compile-tests">
          ????
          <junit?haltonfailure="true">
          ??????
          <classpath?refid="project.classpath"?/>
          ??????
          <formatter?type="brief"?usefile="false"?/>
          ??????
          <batchtest>
          ????????
          <fileset?dir="${build.test.dir}"?
          ??????????includes
          ="**/*Test.class"?/>
          ??????
          </batchtest>
          ??????
          <sysproperty?key="doc.dir"???value="${doc.dir}"?/>
          ??????
          <sysproperty?key="index.dir"?value="${index.dir}"?/>
          ????
          </junit>
          ??
          </target>

          ??
          <target?name="clean">
          ????
          <delete?dir="${build.dir}"?/>
          ??
          </target>
          ??
          </project>

          下面再舉一個(gè)實(shí)際項(xiàng)目中用到的構(gòu)建文件的例子:
          <?xml?version="1.0"??>

          <project?name="JSBook"?default="compile"?basedir=".">

          ??
          <property?environment="env"?/>
          ??
          <property?name="src"?value="WEB-INF/src"?/>
          ??
          <property?name="classes"?value="WEB-INF/classes"?/>
          ??
          <property?name="lib"?value="WEB-INF/lib"?/>?
          ??
          <property?name="dist"?value="dist"?/>
          ??
          ??
          <path?id="task.classpath">
          ????
          <pathelement?location="${classes}"?/>
          ????
          <pathelement?location="${lib}"?/>?
          ????
          <!--?Tomcat?5.0.16?Servlet?2.4?API?-->
          ????
          <pathelement?location="${lib}/servlet-api.jar"?/>
          ????
          <!--?Tomcat?5.0.16?JSP?2.0?API?-->
          ????
          <pathelement?location="${lib}/jsp-api.jar"?/>
          ??
          </path>
          ????
          ??
          <target?name="init"?>
          ????
          <echo>Init?Complete?!</echo>
          ????
          <echo>ant?home?=?${ant.home}?</echo>
          ????
          <echo>java?home?=?${java.home}?</echo>
          ????
          <echo>user?home?=?${user.home}?</echo>??????
          ??
          </target>
          ??
          ??
          <target?name="compile"?depends="init"?>
          ????
          <javac?classpathref="task.classpath"?srcdir="${src}"?destdir="${classes}"?/>
          ????
          <echo?level="verbose">Seen?with?-verbose</echo>
          ????
          <echo?level="debug">Seen?with?-debug</echo>????????
          ????
          <echo>Compilation?Complete?!</echo>
          ??
          </target>
          ??
          ??
          <target?name="war"?>
          ????
          <jar?jarfile="${dist}/JSPBook.war"?basedir="."/>
          ??
          </target>

          </project>
          ???
          也許你已經(jīng)看出來(lái)了,這就是〈〈jsp2.0技術(shù)手冊(cè)〉〉里面的build.xml文件啦!
          posted on 2006-08-31 11:42 小言身寸 閱讀(774) 評(píng)論(0)  編輯  收藏 所屬分類: JAVA相關(guān)技術(shù)
          主站蜘蛛池模板: 瓦房店市| 寿光市| 玉山县| 墨竹工卡县| 吴堡县| 阿拉善左旗| 德安县| 镇雄县| 闵行区| 郓城县| 凤阳县| 涞源县| 贵定县| 阳东县| 罗山县| 顺昌县| 收藏| 南溪县| 佛教| 梁河县| 郸城县| 鲁甸县| 塘沽区| 山东省| 漯河市| 邯郸县| 白城市| 黑河市| 恩施市| 原阳县| 开平市| 伊吾县| 新巴尔虎左旗| 鲁甸县| 西林县| 上虞市| 莲花县| 深水埗区| 仁布县| 翁源县| 招远市|