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

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

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

依賴性測(cè)試

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

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

跳過(guò),而不是標(biāo)為失敗

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

清單 3. 使用 TestNG 進(jìn)行依賴性測(cè)試

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 中定義了兩個(gè)測(cè)試:一個(gè)驗(yàn)證登錄,另一個(gè)驗(yàn)證賬戶信息。請(qǐng)注意,通過(guò)使用 Test 注釋的 dependsOnMethods = {"verifyLogIn"} 子句,verifyAccountInfo 測(cè)試指定了它依賴 verifyLogIn() 方法。

通過(guò) TestNG 的 Eclipse 插件(例如)運(yùn)行該測(cè)試時(shí),如果 verifyLogIn 測(cè)試失敗,TestNG 將直接跳過(guò) verifyAccountInfo 測(cè)試,請(qǐng)參見(jiàn)下圖 :

  圖 在 TestNG 中跳過(guò)的測(cè)試

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

失敗和重運(yùn)行

在大型測(cè)試套件中,這種重新運(yùn)行失敗測(cè)試的能力顯得尤為方便。這是 TestNG 獨(dú)有的一個(gè)特性。在 JUnit 4 中,如果測(cè)試套件包括 1000 項(xiàng)測(cè)試,其中 3 項(xiàng)失敗,很可能會(huì)迫使您重新運(yùn)行整個(gè)測(cè)試套件(修改錯(cuò)誤以后)。不用說(shuō),這樣的工作可能會(huì)耗費(fèi)幾個(gè)小時(shí)。

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

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

清單 4. 失敗測(cè)試的 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>

運(yùn)行小的測(cè)試套件時(shí),這個(gè)特性似乎沒(méi)什么大不了。但是如果您的測(cè)試套件規(guī)模較大,您很快會(huì)體會(huì)到它的好處。

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