您的位置:軟件測(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)簽:

參數(shù)化測(cè)試

TestNG 中另一個(gè)有趣的特性是參數(shù)化測(cè)試。在 JUnit 中,如果您想改變某個(gè)受測(cè)方法的參數(shù)組,只能給每個(gè) 不同的參數(shù)組編寫(xiě)一個(gè)測(cè)試用例。多數(shù)情況下,這不會(huì)帶來(lái)太多麻煩。然而,我們有時(shí)會(huì)碰到一些情況,對(duì)其中的業(yè)務(wù)邏輯,需要運(yùn)行的測(cè)試數(shù)目變化范圍很大。

在這樣的情況下,使用 JUnit 的測(cè)試人員往往會(huì)轉(zhuǎn)而使用 FIT 這樣的框架,因?yàn)檫@樣可以用表格數(shù)據(jù)驅(qū)動(dòng)測(cè)試。但是 TestNG 提供了開(kāi)箱即用的類(lèi)似特性。通過(guò)在 TestNG 的 XML 配置文件中放入?yún)?shù)化數(shù)據(jù),可以對(duì)不同的數(shù)據(jù)集重用同一個(gè)測(cè)試用例,甚至有可能會(huì)得到不同的結(jié)果。這種技術(shù)完美地避免了只能 假定一切正常的測(cè)試,或是沒(méi)有對(duì)邊界進(jìn)行有效驗(yàn)證的情況。

在清單 5 中,我用 Java 1.4 定義了一個(gè) TestNG 測(cè)試,該測(cè)試可接收兩個(gè)參數(shù):classname 和 size。這兩個(gè)參數(shù)可以驗(yàn)證某個(gè)類(lèi)的層次結(jié)構(gòu)(也是說(shuō),如果傳入 java.util.Vector,則 HierarchyBuilder 所構(gòu)建的 Hierarchy 的值將為 2 )。

清單 5. 一個(gè) TestNG 參數(shù)化測(cè)試

package test.com.acme.da;

import com.acme.da.hierarchy.Hierarchy;
import com.acme.da.hierarchy.HierarchyBuilder;

public class HierarchyTest {
/**
* @testng.test
* @testng.parameters value="class_name, size"
*/
public void assertValues(String classname, int size) throws Exception{
Hierarchy hier = HierarchyBuilder.buildHierarchy(classname);
assert hier.getHierarchyClassNames().length == size: "didn't equal!";
}
}

清單 5 列出了一個(gè)泛型測(cè)試,它可以采用不同的數(shù)據(jù)反復(fù)重用。請(qǐng)花點(diǎn)時(shí)間思考一下這個(gè)問(wèn)題。如果有 10 個(gè)不同的參數(shù)組合需要在 JUnit 中測(cè)試,您只能寫(xiě) 10 個(gè)測(cè)試用例。每個(gè)測(cè)試用例完成的任務(wù)基本是相同的,只是受測(cè)方法的參數(shù)有所改變。但是,如果使用參數(shù)化測(cè)試,可以只定義一個(gè) 測(cè)試用例,然后,(舉例來(lái)說(shuō))把所需的參數(shù)模式加到 TestNG 的測(cè)試套件文件中。清單 6 中展示了這中方法:

清單 6. 一個(gè) TestNG 參數(shù)化測(cè)試套件文件

<!DOCTYPE suite SYSTEM "http://beust.com/testng/testng-1.0.dtd">
<suite name="Deckt-10">
<test name="Deckt-10-test">

<parameter name="class_name" value="java.util.Vector"/>
<parameter name="size" value="2"/>

<classes>
<class name="test.com.acme.da.HierarchyTest"/>
</classes>
</test>
</suite>

清單 6 中的 TestNG 測(cè)試套件文件只對(duì)該測(cè)試定義了一個(gè)參數(shù)組(class_name 為 java.util.Vector,且 size 等于 2),但卻具有無(wú)限的可能。這樣做的一個(gè)額外的好處是:將測(cè)試數(shù)據(jù)移動(dòng)到 XML 文件的無(wú)代碼工件意味著非程序員也可以指定數(shù)據(jù)。

高級(jí)參數(shù)化測(cè)試

盡管從一個(gè) XML 文件中抽取數(shù)據(jù)會(huì)很方便,但偶爾會(huì)有些測(cè)試需要有復(fù)雜類(lèi)型,這些類(lèi)型無(wú)法用 String 或原語(yǔ)值來(lái)表示。TestNG 可以通過(guò)它的 @DataProvider 注釋處理這樣的情況。@DataProvider 注釋可以方便地把復(fù)雜參數(shù)類(lèi)型映射到某個(gè)測(cè)試方法。例如,清單 7 中的 verifyHierarchy 測(cè)試中,我采用了重載的 buildHierarchy 方法,它可接收一個(gè) Class 類(lèi)型的數(shù)據(jù), 它斷言(asserting)Hierarchy 的 getHierarchyClassNames() 方法應(yīng)該返回一個(gè)適當(dāng)?shù)淖址當(dāng)?shù)組:

清單 7. TestNG 中的 DataProvider 用法

package test.com.acme.da.ng;

import java.util.Vector;

import static org.testng.Assert.assertEquals;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

import com.acme.da.hierarchy.Hierarchy;
import com.acme.da.hierarchy.HierarchyBuilder;

public class HierarchyTest {

@DataProvider(name = "class-hierarchies")
public Object[][] dataValues(){
return new Object[][]{
{Vector.class, new String[] {"java.util.AbstractList",
"java.util.AbstractCollection"}},
{String.class, new String[] {}}
};
}

@Test(dataProvider = "class-hierarchies")
public void verifyHierarchy(Class clzz, String[] names)
throws Exception{
Hierarchy hier = HierarchyBuilder.buildHierarchy(clzz);
assertEquals(hier.getHierarchyClassNames(), names,
"values were not equal");
}
}

dataValues() 方法通過(guò)一個(gè)多維數(shù)組提供與 verifyHierarchy 測(cè)試方法的參數(shù)值匹配的數(shù)據(jù)值。TestNG 遍歷這些數(shù)據(jù)值,并根據(jù)數(shù)據(jù)值調(diào)用了兩次 verifyHierarchy。在第一次調(diào)用時(shí),Class 參數(shù)被設(shè)置為 Vector.class ,而 String 數(shù)組參數(shù)容納 “java.util.AbstractList ” 和 “ java.util.AbstractCollection ” 這兩個(gè) String 類(lèi)型的數(shù)據(jù)。這樣挺方便吧?

為什么只選擇其一?

我已經(jīng)探討了對(duì)我而言,TestNG 的一些獨(dú)有優(yōu)勢(shì),但是它還有其他幾個(gè)特性是 JUnit 所不具備的。例如 TestNG 中使用了測(cè)試分組,它可以根據(jù)諸如運(yùn)行時(shí)間這樣的特征來(lái)對(duì)測(cè)試分類(lèi)。也可在 Java 1.4 中通過(guò) javadoc 風(fēng)格的注釋來(lái)使用它,如 清單 5 所示。

正如我在本文開(kāi)頭所說(shuō),JUnit 4 和 TestNG 在表面上是相似的。然而,設(shè)計(jì) JUnit 的目的是為了分析代碼單元,而 TestNG 的預(yù)期用途則針對(duì)高級(jí)測(cè)試。對(duì)于大型測(cè)試套件,我們不希望在某一項(xiàng)測(cè)試失敗時(shí)得重新運(yùn)行數(shù)千項(xiàng)測(cè)試,TestNG 的靈活性在這里尤為有用。這兩個(gè)框架都有自己的優(yōu)勢(shì),您可以隨意同時(shí)使用它們。

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