5.5 - Parameters
測(cè)試方法不要求是無(wú)參數(shù)的。你可以在每個(gè)測(cè)試方法上使用任意數(shù)量的參數(shù),并指示testNG傳遞正確的參數(shù)。
有兩種方式用于設(shè)置參數(shù):使用testng.xml或者編程式。
5.5.1 - Parameters from testng.xml
如果你要為你的參數(shù)使用簡(jiǎn)單值,你可以在你的testng.xml中明確指定:
@Parameters({ "first-name" })
@Test
public void testSingleString(String firstName) {
System.out.println("Invoked testString " + firstName);
assert "Cedric".equals(firstName);
}
在這個(gè)代碼中,我們明確指定java方法的參數(shù)“firstName”應(yīng)該接收名為“first-name”xml參數(shù)的值。 這個(gè)xml參數(shù)在testng.xml中定義:
<suite name="My suite">
<parameter name="first-name" value="Cedric"/>
<test name="Simple example">
<--
-->
同樣的方法可以用于注解@Before/After和@Factory:
@Parameters({ "datasource", "jdbcDriver" })
@BeforeMethod
public void beforeTest(String ds, String driver) {
m_dataSource =
; // look up the value of datasource
m_jdbcDriver = driver;
}
這次,兩個(gè)java參數(shù)ds和driver將分別接收被設(shè)置給屬性datasource和jdbc-driver的值。
參數(shù)可以通過(guò)可選注解來(lái)聲明為可選:
@Parameters("db")
@Test
public void testNonExistentParameter(@Optional("mysql") String db) {
}
如果在testng.xml文件中沒(méi)有找到名為"db"的參數(shù),測(cè)試方法將接受在@Optional注解中指定的默認(rèn)值:"mysql"
@Parameters 注解可以在下面位置使用:
* 在任何有@Test, @Before/After或者@Factory注解的方法上
* 在測(cè)試類的最多一個(gè)構(gòu)造函數(shù)上。這種情況下,當(dāng)TestNG需要實(shí)例化測(cè)試類時(shí),他將調(diào)用這個(gè)特別的帶有初始化為testng.xml中指定的值的參數(shù)的構(gòu)造函數(shù)。這個(gè)特性可以被用于初始化類內(nèi)部的值域?yàn)閷⒂糜跍y(cè)試方法的值。
注意:
* xml參數(shù)被以在注解中出現(xiàn)的相同順序映射到j(luò)ava參數(shù),如果參數(shù)數(shù)量不匹配testNG將發(fā)生錯(cuò)誤。
* 參數(shù)是有范圍的。在testng.xml中,你可以在<suite>標(biāo)簽或者<test>標(biāo)簽下聲明參數(shù)。如果兩個(gè)參數(shù)同名,在<test>標(biāo)簽下定義的參數(shù)優(yōu)先。非常適用于這樣的場(chǎng)合:需要指定一個(gè)應(yīng)用于所有測(cè)試的參數(shù),但是又希望在特定測(cè)試用覆蓋它的值。
5.5.2 - Parameters with DataProviders
在testng.xml中指定參數(shù),對(duì)于以下情況是不夠的:
* 不使用testng.xml
* 需要傳遞復(fù)雜參數(shù),或者參數(shù)需要從java中創(chuàng)建(復(fù)雜對(duì)象,從屬性文件或者數(shù)據(jù)庫(kù)中讀取的對(duì)象)在這種情況下,你可以使用Data Provider來(lái)提供你測(cè)試需要的數(shù)值。Data Provider是類中的一個(gè)返回對(duì)象數(shù)組的數(shù)組的方法。這個(gè)方法帶有@DataProvider注解:
//這個(gè)方法將提供數(shù)據(jù)給任何聲明它的Data Provider名為"test1"的測(cè)試方法
@DataProvider(name = "test1")
public Object[][] createData1() {
return new Object[][] {
{ "Cedric", new Integer(36) },
{ "Anne", new Integer(37)},
};
}
//這個(gè)方法聲明它的數(shù)據(jù)將由名為"test1"的Data Provider提供
@Test(dataProvider = "test1")
public void verifyData1(String n1, Integer n2) {
System.out.println(n1 + " " + n2);
}
將打印
Cedric 36
Anne 37
@Test方法用dataProvider屬性來(lái)指定它的Data Provider。這個(gè)名字必須符合同一個(gè)類中用@DataProvider(name="...")注解的方法,它們要使用同一個(gè)匹配的名字。
默認(rèn),將在當(dāng)前類或者它的基類中查找data provider。如果你想將data provider放置到另一個(gè)類中,需要將這個(gè)data provider方法設(shè)置為靜態(tài)方法,并在dataProviderClass屬性中指定在哪個(gè)類中可以找到這個(gè)方法。
public static class StaticProvider {
@DataProvider(name = "create")
public static Object[][] createData() {
return new Object[][] {
new Object[] { new Integer(42) }
}
}
}
public class MyTest {
@Test(dataProvider = "create", dataProviderClass = StaticProvider.class)
public void test(Integer n) {
// 
}
}
Data Provider方法將返回下面兩個(gè)類型中的一種:
The Data Provider method can return one of the following two types:
* 對(duì)象數(shù)組的數(shù)組(Object[][]) ,外圍數(shù)據(jù)的大小是測(cè)試方法將被調(diào)用的次數(shù),而內(nèi)層數(shù)組的大小和類型必須和測(cè)試方法的參數(shù)列表匹配。如同上面舉例說(shuō)明的。
* <Object[]>的Iterator,和Object[][]的唯一差別在于Iterator容許延遲創(chuàng)建測(cè)試數(shù)據(jù)。testNG將一個(gè)接一個(gè)的調(diào)用iterator,再用iterator返回的參數(shù)調(diào)用測(cè)試方法。如果有很多參數(shù)集合需要傳遞給方法而又不想一開(kāi)始就創(chuàng)建所有參數(shù),會(huì)非常有用。
Here is an example of this feature for both JDK 1.4 and JDK5 (note that the JDK 1.4 example does not use Generics):
這里有一個(gè)同時(shí)適用于JDK 1.4和JDK5的例子(注意JDK 1.4的例子不使用注解):
/**
* @testng.data-provider name="test1"
*/
public Iterator createData() {
return new MyIterator(DATA);
)
@DataProvider(name = "test1")
public Iterator createData() {
return new MyIterator(DATA);
}
如果將測(cè)試方法的第一個(gè)參數(shù)申明為java.lang.reflect.Method,TestNG將使用這個(gè)第一個(gè)參數(shù)來(lái)傳遞當(dāng)前測(cè)試方法。當(dāng)多個(gè)測(cè)試方法使用同一個(gè)@DataProvider而需要依當(dāng)前申請(qǐng)數(shù)據(jù)的方法而定來(lái)返回不同值時(shí)特別有用。
舉例說(shuō)明,下面的代碼在@DataProvider中打印測(cè)試方法的名字:
@DataProvider(name = "dp")
public Object[][] createData(Method m) {
System.out.println(m.getName()); // print test method name
return new Object[][] { new Object[] { "Cedric" }};
}
@Test(dataProvider = "dp")
public void test1(String s) {
}
@Test(dataProvider = "dp")
public void test2(String s) {
}
將會(huì)顯示:
test1
test2
5.5.3 - Parameters in reports
被用于調(diào)用測(cè)試方法的參數(shù)將在TestNG生成的HTML報(bào)告中顯示。實(shí)例如下: