你走你的陽光道,我走我的獨木橋:整合ant ivy 和testng
近期自己折騰自己,放著正統(tǒng)的maven + junit不用,卻準備用ant + ivy 替代maven做依賴管理,用testng替代junit做單元測試。
現(xiàn)在要做的工作,其實很簡單,就是ant的腳本中,搞定相關(guān)的target: 編譯,運行單元測試。
需要的步驟大體如下:
1. ivy 做依賴解析,得到所有依賴的jar包,以便生成編譯源碼需要的classpath路徑
這里很重要的一點,是需要區(qū)分開編譯正常代碼的classpath和編譯測試代碼的classpath,因為通常情況下testcase需要一些特殊的依賴如juni,testng之類的測試框架,easymock,jmock之類的mock工具。
2. 編譯代碼和測試案例
3. 運行testng 來執(zhí)行testcase
分別來看三者的實現(xiàn)。
1) ivy解析依賴
ant代碼如下:








用到了ivy標準的resolve 任務(wù),然后再用cachefileset來獲取需要的文件列表,以備后面使用。注意type要寫成"jar,bundle",因此目前的依賴包雖然擴張名都是jar,但是它的ivy類型定義確有可能為bundle(都是OSGI惹得禍)。還有上面用了兩次cachefileset任務(wù),conf不同。
2) 編譯代碼和測試案例





































注意這里用到classpath時,是在上面得到的ivy cachefileset的基礎(chǔ)上,增加其他路徑才得到最終的classpath。曾經(jīng)在這里折騰了不少時間,因為開始是用ivy的cacheclasspath任務(wù)直接拿到一個classpath,然后在這里發(fā)現(xiàn)單有這個classpath是不夠的。可是又沒有找到如何從一個classpath生成一個更多內(nèi)容的classpath的方法(郁悶,ant里面的classpath似乎不支持這種classpath=***+***+classpath的算法,或者是我笨沒有找到)。最后只好改用cachefileset來獲取fileset,然后自己增加其他路徑。典型如編譯測試案例時,必須將前面編譯好的class作為classpath的一部分增加。從這種角度講,ivy的cacheclasspath任務(wù)是用處不大的,實用的是cachefileset任務(wù)。
3) 運行testng
首先需要初始化testng,引入testng的任務(wù)。







在具體執(zhí)行testng時,有兩種選擇:
1. 通過testng.xml指定具體的測試案例
應(yīng)該說testng對此有非常強大而富有彈性的支持,通過testng.xml可以指定不同的package,class,可以指定exclude,可以分組,還有其他高級特性。
2. 運行所有案例
使用testng.xml文件的前提是項目有提供testng.xml文件,對于一些簡單的項目,可能只是簡單的希望執(zhí)行所有testcase,因此就需要在運行檢測testng.xml文件存在與否。













testng.xml存在時,通過xmlfileset來調(diào)用testng任務(wù):

















testng.xml不存在時,通過classfileset來指定需要執(zhí)行的class:



























注意這里有個檢測,判斷是否有測試案例存在,如果沒有寫測試案例,則跳過testng任務(wù)的執(zhí)行,否則如果classfileset為空,testng即得不到testng.xml的輸入,也得不到classfileset的輸入,會直接報錯的,因此需要避免因為沒有測試案例導(dǎo)致test失敗進而整個build都失敗的情況。
OK,上述三板斧下去,基本ant + ivy + testng就可以完成整合,一起跑起來了。敲一個ant test下去,就可以依賴解析,編譯,執(zhí)行testcase的全套過程。過程比maven + junit復(fù)雜多了,主要是一切都要自己動手,不過完成之后的效果似乎還不錯。上述的過程對于一般項目都是通用的,因此以后就可以偷懶了。
posted on 2010-05-31 16:11 sky ao 閱讀(2484) 評論(0) 編輯 收藏 所屬分類: project building