而每個程式模組內又含有眾多的單元測試,此時如果程式師還每次都手工跑單元測試的話,工作量將是巨大的,而且這是種無聊的重複性工作。 本文將介紹一個基於 JHTTP://www.aliyun.com/zixun/aggregation/29926.html">Unit 的全域單元測試程式,程式師只需要執行一個檔, 就能將整個工程內所有的單元測試檔都自動執行,從而節約了程式師寶貴的時間,提高軟體產品開發進度。
最近參與了一個新產品的研發工作。 新產品是採用模組式開發方式,擁有眾多的功能模組,每一個模組是一個獨立的 JAVA 工程。 在產品中,為了保證各個模組的功能,目前其都有相應的 JUnit 測試程式。 隨著產品功能的逐漸完善,我們發現,程式中光是 JUnit Test 測試檔案,全部加起來已經有幾百個。 由於這些檔分佈在幾十個不同的工程不同的子目錄結構中,目前並沒有很好的工具可以將所有的單元測試一次運行。 而手工的運行這些單元測試是非常繁瑣的,對程式師來說是浪費時間的;又或者可以用腳本完成運行所有測試檔案的目的,但是由於我們採取的是敏捷開發的模式,JUnit Test 測試集合會不斷的持續增長,每增加一個 JUnit Test 檔 ,就需要立即修改腳本;一旦忘記修改,這個新加的測試檔案可能就無法被執行可見,用腳本來執行測試檔案也並不是很好的手段,依然給我們的開發帶來額外工作。 這裡11545.html">我們有了一個想法,做一個全域的單元測試程式,去自動的檢索工程集中所有的 JUnit Test 測試程式。 這個全域單元測試程式將基於 JUnit4 去運行。
核心機制:JUnit4 支援一次運行多個測試程式
首先我們要瞭解 JUnit4 支援多個 Class 集合作為輸入,並且調用 org.junit.runner.Runner.run() 方法運行輸入的測試類集合。 JUnit4 中已經定義了一些預設的 Runner,可以分別處理不同的輸入類集合:比如 BlockJUnit4ClassRunner,就是預設處理帶有 @Test 的 JUnit4 測試類的運行器;Suite,可以處理相容 JUnit3 的測試類的運行器,等等。
我們可以來看下面的 Runner 結構圖:
圖 1. JUnit Runner 結構圖
Runner 類定義了運行測試案例的介面,Suite 類繼承自 Runner 類,Suite 類支援 JUnit3 風格的測試類,可以用來執行多個測試案例。 因此我們的想法是,自訂一個繼承自 Suite 類的 Runner,就是上圖中得 AllClassRunner 類。 這個 Runner 的輸入將是工程集中所有找到的 JUnit Test Class 集合,這樣就可以一次運行工程中不同工程不同目錄下的所有 JUnit Test 檔了。 下面是我們的 AllClassRunner 類的代碼:
清單 1. AllClassRunner 類的代碼
public class AllJunitTestRunner extends Suite { public AllJunitTestRunner(Class<?> clazz, RunnerBuilder builde r) throws InitializationError { // 調用父類 Suite 方法直接運行所有符合要求的 JUnit Test 物件 super(builder, clazz, loadAllTestClass(filterCla ssNameList (clazz, loadAllClassesName(clazz)))); } }
loadAllClassesName 方法將會找到工程集中所有的 Class 檔案名的集合,filterClassNameList 將會對找到的 Class 檔集合進行過濾,過濾條件是針對檔案名稱。 loadAllTestClass 則會找到所有符合條件的 JUnitTest Class 集合。