第一步:編譯測試
首先,在build.xml文件里定義一個單獨的構建目標,以便編譯測試源文件。
? <target name="compile-tests" depends="compile">
??? <javac srcdir="${test.dir}" destdir="${build.test.dir}">
????? <classpath refid="project.classpath" />
??? </javac>
? </target>
compile-tests目標用<javac>任務在test.dir目錄編譯測試源文件,并將結果類文件放入build.test.dir目錄,用project.classpath路徑作為測試代碼的類路徑。
第二步:運行測試
在build.xml文件里定義構建目標,使所有的JUnit測試自動運行。
? <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目標的depends屬性生成與剛定義的compile-tests目標的依存關系。
如果構建成功,意味著所有的東西不僅都編譯過,還都通過了測試。
將haltonfailure屬性設為true會使構建隨著任何測試失敗而失敗。
這里我們再次用project.classpath定義了運行JUnit測試的類路徑。
下面定義了一個輸出格式化器,在<formatter> 元素中,使用brief類型來輸出每個運行的測試用例的名稱及其統計信息,僅當測試失敗時才有更詳細的信息(plain類型默認比brief類型輸出信息多一些;xml類型將測試結果以XML格式輸出)。將usefile屬性值設為false會將測試結果送往控制臺,而不是寫入文件。
<batchtest>任務收集從封閉<fileset>元素中返回的所有測試,并自動創建包含了所有測試的測試suite。我們將對所有的測試類用*Test.java命名約定取名,這些文件將編譯成*Test.class文件,放在<fileset>的build.test.dir性質指向的目錄中。
最后,<sysproperty>元素定義系統性質為一個鍵值對,這些性質可以在測試代碼中訪問。這里,測試需要知道從哪里找到文檔,以及向哪里放入文檔的索引結果,在運行測試時我們將傳遞這些結果,例如,測試在運行時查看送入的doc.dir系統性質來定位項目目錄結構中doc目錄的絕對路徑。
要運行測試,請執行test目標:
$?ant test
最后,打掃戰場
我們可以定義一個刪除所有構建輸出的Ant目標。
? <target name="clean">
??? <delete dir="${build.dir}" />
? </target>
clean目標使用<delete>任務來刪除build.dir所指的目錄。要刪除目錄,請運行clean目標:
$ ant clean
沖掉這些構建輸出有積極的作用:從頭開始生成構建,可以發現可能被累積構建掩蓋的錯誤。
完整的build.xml:































































下面再舉一個實際項目中用到的構建文件的例子:





































也許你已經看出來了,這就是〈〈jsp2.0技術手冊〉〉里面的build.xml文件啦!