5.5 - Parameters
測試方法不要求是無參數的。你可以在每個測試方法上使用任意數量的參數,并指示testNG傳遞正確的參數。
有兩種方式用于設置參數:使用testng.xml或者編程式。
5.5.1 - Parameters from testng.xml
如果你要為你的參數使用簡單值,你可以在你的testng.xml中明確指定:
@Parameters({ "first-name" })
@Test
public void testSingleString(String firstName) {
System.out.println("Invoked testString " + firstName);
assert "Cedric".equals(firstName);
}
在這個代碼中,我們明確指定java方法的參數“firstName”應該接收名為“first-name”xml參數的值。 這個xml參數在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;
}
這次,兩個java參數ds和driver將分別接收被設置給屬性datasource和jdbc-driver的值。
參數可以通過可選注解來聲明為可選:
@Parameters("db")
@Test
public void testNonExistentParameter(@Optional("mysql") String db) {
}
如果在testng.xml文件中沒有找到名為"db"的參數,測試方法將接受在@Optional注解中指定的默認值:"mysql"
@Parameters 注解可以在下面位置使用:
* 在任何有@Test, @Before/After或者@Factory注解的方法上
* 在測試類的最多一個構造函數上。這種情況下,當TestNG需要實例化測試類時,他將調用這個特別的帶有初始化為testng.xml中指定的值的參數的構造函數。這個特性可以被用于初始化類內部的值域為將用于測試方法的值。
注意:
* xml參數被以在注解中出現的相同順序映射到java參數,如果參數數量不匹配testNG將發生錯誤。
* 參數是有范圍的。在testng.xml中,你可以在<suite>標簽或者<test>標簽下聲明參數。如果兩個參數同名,在<test>標簽下定義的參數優先。非常適用于這樣的場合:需要指定一個應用于所有測試的參數,但是又希望在特定測試用覆蓋它的值。
5.5.2 - Parameters with DataProviders
在testng.xml中指定參數,對于以下情況是不夠的:
* 不使用testng.xml
* 需要傳遞復雜參數,或者參數需要從java中創建(復雜對象,從屬性文件或者數據庫中讀取的對象)在這種情況下,你可以使用Data Provider來提供你測試需要的數值。Data Provider是類中的一個返回對象數組的數組的方法。這個方法帶有@DataProvider注解:
//這個方法將提供數據給任何聲明它的Data Provider名為"test1"的測試方法
@DataProvider(name = "test1")
public Object[][] createData1() {
return new Object[][] {
{ "Cedric", new Integer(36) },
{ "Anne", new Integer(37)},
};
}
//這個方法聲明它的數據將由名為"test1"的Data Provider提供
@Test(dataProvider = "test1")
public void verifyData1(String n1, Integer n2) {
System.out.println(n1 + " " + n2);
}
將打印
Cedric 36
Anne 37
@Test方法用dataProvider屬性來指定它的Data Provider。這個名字必須符合同一個類中用@DataProvider(name="...")注解的方法,它們要使用同一個匹配的名字。
默認,將在當前類或者它的基類中查找data provider。如果你想將data provider放置到另一個類中,需要將這個data provider方法設置為靜態方法,并在dataProviderClass屬性中指定在哪個類中可以找到這個方法。
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方法將返回下面兩個類型中的一種:
The Data Provider method can return one of the following two types:
* 對象數組的數組(Object[][]) ,外圍數據的大小是測試方法將被調用的次數,而內層數組的大小和類型必須和測試方法的參數列表匹配。如同上面舉例說明的。
* <Object[]>的Iterator,和Object[][]的唯一差別在于Iterator容許延遲創建測試數據。testNG將一個接一個的調用iterator,再用iterator返回的參數調用測試方法。如果有很多參數集合需要傳遞給方法而又不想一開始就創建所有參數,會非常有用。
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):
這里有一個同時適用于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);
}
如果將測試方法的第一個參數申明為java.lang.reflect.Method,TestNG將使用這個第一個參數來傳遞當前測試方法。當多個測試方法使用同一個@DataProvider而需要依當前申請數據的方法而定來返回不同值時特別有用。
舉例說明,下面的代碼在@DataProvider中打印測試方法的名字:
@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) {
}
將會顯示:
test1
test2
5.5.3 - Parameters in reports
被用于調用測試方法的參數將在TestNG生成的HTML報告中顯示。實例如下: