您的位置:軟件測試 > 開源軟件測試 > 開源單元測試工具 > TestNG
JUnit 4與TestNG的對比
作者:網(wǎng)絡(luò)轉(zhuǎn)載 發(fā)布時間:[ 2013/2/22 14:18:48 ] 推薦標簽:

顯然,這兩個清單很相似。不過,如果仔細看,您會發(fā)現(xiàn) TestNG 的編碼規(guī)則比 JUnit 4 更靈活。清單 1 里,在 JUnit 中我必須把 @BeforeClass 修飾的方法聲明為 static,這又要求我把 fixture,即 finder 聲明為 static。我還必須把 init() 聲明為 public?纯辞鍐 2,您會發(fā)現(xiàn)不同。這里不再需要那些規(guī)則了。我的 init() 方法既不是 static,也不是 public。

從初起,TestNG 的靈活性是其主要優(yōu)勢之一,但這并非它惟一的賣點。TestNG 還提供了 JUnit 4 所不具備的其他一些特性。

依賴性測試

JUnit 框架想達到的一個目標是測試隔離。它的缺點是:人們很難確定測試用例執(zhí)行的順序,而這對于任何類型的依賴性測試都非常重要。開發(fā)者們使用了多種技術(shù)來解決這個問題,例如,按字母順序指定測試用例,或是更多地依靠 fixture 來適當?shù)亟鉀Q問題。

如果測試成功,這些解決方法都沒什么問題。但是,如果測試不成功,會產(chǎn)生一個很麻煩的后果:所有 后續(xù)的依賴測試也會失敗。在某些情況下,這會使大型測試套件報告出許多不必要的錯誤。例如,假設(shè)有一個測試套件測試一個需要登錄的 Web 應(yīng)用程序。您可以創(chuàng)建一個有依賴關(guān)系的方法,通過登錄到這個應(yīng)用程序來創(chuàng)建整個測試套件,從而避免 JUnit 的隔離機制。這種解決方法不錯,但是如果登錄失敗,即使登錄該應(yīng)用程序后的其他功能都正常工作,整個測試套件依然會全部失。

跳過,而不是標為失敗

與 JUnit 不同,TestNG 利用 Test 注釋的 dependsOnMethods 屬性來應(yīng)對測試的依賴性問題。有了這個便利的特性,可以輕松指定依賴方法。例如,前面所說的登錄將在某個方法之前 運行。此外,如果依賴方法失敗,它將被跳過,而不是標記為失敗。

清單 3. 使用 TestNG 進行依賴性測試

import net.sourceforge.jwebunit.WebTester;

public class AccountHistoryTest {
private WebTester tester;

@BeforeClass
protected void init() throws Exception {
this.tester = new WebTester();
this.tester.getTestContext().
setBaseUrl("http://div.acme.com:8185/ceg/");
}

@Test
public void verifyLogIn() {
this.tester.beginAt("/");
this.tester.setFormElement("username", "admin");
this.tester.setFormElement("password", "admin");
this.tester.submit();
this.tester.assertTextPresent("Logged in as admin");
}

@Test (dependsOnMethods = {"verifyLogIn"})
public void verifyAccountInfo() {
this.tester.clickLinkWithText("History", 0);
this.tester.assertTextPresent("GTG Data Feed");
}
}

在清單 3 中定義了兩個測試:一個驗證登錄,另一個驗證賬戶信息。請注意,通過使用 Test 注釋的 dependsOnMethods = {"verifyLogIn"} 子句,verifyAccountInfo 測試指定了它依賴 verifyLogIn() 方法。

通過 TestNG 的 Eclipse 插件(例如)運行該測試時,如果 verifyLogIn 測試失敗,TestNG 將直接跳過 verifyAccountInfo 測試,請參見下圖 :

  圖 在 TestNG 中跳過的測試

對于大型測試套件,TestNG 這種不標記為失敗,而只是跳過的處理方法可以減輕很多壓力。您的團隊可以集中精力查找為什么百分之五十的測試套件被跳過,而不是去找百分之五十的測試套件失敗的原因!更有利的是,TestNG 采取了只重新運行失敗測試的機制,這使它的依賴性測試設(shè)置更為完善。

失敗和重運行

在大型測試套件中,這種重新運行失敗測試的能力顯得尤為方便。這是 TestNG 獨有的一個特性。在 JUnit 4 中,如果測試套件包括 1000 項測試,其中 3 項失敗,很可能會迫使您重新運行整個測試套件(修改錯誤以后)。不用說,這樣的工作可能會耗費幾個小時。

一旦 TestNG 中出現(xiàn)失敗,它會創(chuàng)建一個 XML 配置文件,對失敗的測試加以說明。如果利用這個文件執(zhí)行 TestNG 運行程序,TestNG 只 運行失敗的測試。所以,在前面的例子里,您只需重新運行那三個失敗的測試,而不是整個測試套件。

實際上,您可以通過清單 2 中的 Web 測試的例子自己看到這點。verifyLogIn() 方法失敗時,TestNG 自動創(chuàng)建一個 testng-failed.xml 文件。該文件將成為如清單 4 所示的替代性測試套件:

清單 4. 失敗測試的 XML 文件
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite thread-count="5" verbose="1" name="Failed suite [HistoryTesting]"
parallel="false" annotations="JDK5">
<test name="test.com.acme.ceg.AccountHistoryTest(failed)" junit="false">
<classes>
<class name="test.com.acme.ceg.AccountHistoryTest">
<methods>
<include name="verifyLogIn"/>
</methods>
</class>
</classes>
</test>
</suite>

運行小的測試套件時,這個特性似乎沒什么大不了。但是如果您的測試套件規(guī)模較大,您很快會體會到它的好處。

上一頁123下一頁
軟件測試工具 | 聯(lián)系我們 | 投訴建議 | 誠聘英才 | 申請使用列表 | 網(wǎng)站地圖
滬ICP備07036474 2003-2017 版權(quán)所有 上海澤眾軟件科技有限公司 Shanghai ZeZhong Software Co.,Ltd