清單 1. 用于組件測試的 TestSuite
package test.org.acme.widget;import junit.framework.Test;import junit.framework.TestSuite;import test.org.acme.widget.*;public class ComponentTestSuite { public static void main(String[] args) { junit.textui.TestRunner.run(ComponentTestSuite.suite()); } public static Test suite(){ TestSuite suite = new TestSuite(); suite.addTestSuite(DefaultSpringWidgetDAOImplTest.class); suite.addTestSuite(WidgetDAOImplLoadTest.class); ... suite.addTestSuite(WidgetReportTest.class); return suite; }} |
定義 TestSuite
的過程的確需要瀏覽現有的測試,并將它們添加到相應的類中(即,將所有的單元測試添加到一個 UnitTestSuite
中)。這也意味著,由于在一個給定分類中編寫新測試,不得不將它們按照一定的程序添加到適當的 TestSuite
中,當然,還需要重新編譯 它們。
運行獨立的 TestSuites
,然后試著創建單一的 Ant 任務,Ant 任務調用正確的測試集?梢远x一個 component-test
任務,用于組織 ComponentTestSuite
等,正如清單 2 中所示:
清單 2. 只運行組件測試的 Ant 任務
<target name="component-test" if="Junit.present" depends="junit-present,compile-tests"> <mkdir dir="${testreportdir}"/> <junit dir="./" failureproperty="test.failure" printSummary="yes" fork="true" haltonerror="true"> <sysproperty key="basedir" value="."/> <formatter type="xml"/> <formatter usefile="false" type="plain"/> <classpath> <path refid="build.classpath"/> <pathelement path="${testclassesdir}"/> <pathelement path="${classesdir}"/> </classpath> <batchtest todir="${testreportdir}"> <fileset dir="test"> <include name="**/ComponentTestSuite.java"/> </fileset> </batchtest> </junit></target> |
理想情況下,還需要有調用單元測試和系統測試的任務。最后,在想要運行整個測試套件時,應該創建一個依賴于所有三種測試種類的第四項任務,如清單 3 中如示:
清單 3. 用于所有測試的 Ant 任務
<target name="test-all" depends="unit-test,component-test,system-test"/> |
創建定制 TestSuite
是實現測試分類的一個快速解決方案。這個方法的缺點是:一旦創建新測試,就必須通過編程將它們添加到適當的 TestSuite
中,這很痛苦。為每種測試創建定制目錄更具擴展性,且允許不 經過重新編譯就添加新的經過分類的測試。
![]() ![]() |
![]()
|
我發現,用 JUnit 實現測試分類最簡單的方法是將測試在邏輯上劃分為與其測試類型相應的特定目錄。使用這項技術,所有的單元測試將駐留在一個 unit 目錄中,所有的組件測試將駐留在一個 component 目錄中,依此類推。
例如,在一個保存所有未分類測試的 test 目錄中,可以創建三個新的子目錄,如清單 4 所示:
清單 4. 實現測試分類的目錄結構
acme-proj/ test/ unit/ component/ system/ conf/ |
為運行這些測試,必需至少定義四個 Ant 任務:為單元測試定義一個,為組件測試定義一個,依此類推。第 4 項任務是一個方便的任務,它運行所有三種測試類型(如 清單 3 所示)。
該 JUnit 任務和 清單 2 中定義的任務非常相似。所不同的是該任務 batchtest
方面的一個細節。此時,fileset
指向一個具體的目錄。在清單 5 的例子中,它指向 unit 目錄。
清單 5. 用于運行所有單元測試的 JUnit 任務的批量測試方面
<batchtest todir="${testreportdir}"> <fileset dir="test/unit"> <include name="**/**Test.java"/> </fileset></batchtest> |
請注意,這個測試只運行 test/unit 目錄下的所有測試。當創建了新的單元測試(或針對此問題的任何其他測試),只需要將它們放到該目錄下,一切就準備妥當了!比起需要將一行新代碼添加到 TestSuite
文件并進行重新編譯,這樣還是多少簡單了一點。
回到最初的場景中,假設您和您的團隊認為使用特定目錄是針對構建時間問題的最具擴展性的解決方案。該任務最困難的地方是檢查及分配測試類型。您重構了 Ant 構建文件并創建了 4 項新任務(為單個的測試類型創建了三項,為運行所有這些測試類型創建了一項)。不僅如此,您還修改了 CruiseControl,從而只在(代碼)簽入時運行真正的單元測試,并以小時為基礎運行組件測試。在進一步檢查之后,發現系統測試也可以按小時運行,所以您創建了一個將組件測試和系統測試一起運行的額外任務。
最終結果是,測試每天都運行很多次,您的團隊能夠更快地發現集成錯誤 —— 通常在幾個小時之內。
當然,創建敏捷性構建并未解決全部問題,但它在確保代碼質量方面確實扮演了至關重要的角色。測試運行得更加頻繁了,針對開發人員測試價值的顧慮成為一段遙遠的記憶。另外,更重要的是,現在 2006 年您的公司獲得了極大的成功!
文章來源于領測軟件測試網 http://www.kjueaiud.com/