测试方法不全是无参数的。您可以在每个测试方法上使用任意数量的参数,并指示 TestNG 使用@Parameters注释向您传递正确的参数。
有两种方法可以设置这些参数:使用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;
}
2个 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中,您可以在
标记或 下声明它们。如果两个参数具有相同的名称,则 中定义的参数具有优先权。如果您需要指定适用于所有测试的参数并仅针对某些测试覆盖其值,这很方便。
带有 DataProviders 的Parameters
需要传递复杂参数或需要从 Java 创建的参数(复杂对象、从属性文件或数据库读取的对象等),在testng.xml 中指定参数可能还不够。在这种情况下,您可以使用数据提供者来提供您需要测试的值。数据提供者是您的类上的一个方法,它返回一个对象数组。此方法使用@DataProvider注释:
//This method will provide data to any test method that declares that its Data Provider
//is named "test1"
@DataProvider(name = "test1")
public Object[][] createData1() {
return new Object[][] {
{ "Cedric", new Integer(36) },
{ "Anne", new Integer(37)},
};
}
//This test method declares that its data should be supplied by the Data Provider
//named "test1"
@Test(dataProvider = "test1")
public void verifyData1(String n1, Integer n2) {
System.out.println(n1 + " " + n2);
}
//打印
Cedric 36
Anne 37
在@Test标注的方法指定了dataProvider属性,此名称必须对应于同一个类上的一个方法,该方法用@DataProvider(name=”…”)注释 并具有匹配的名称。
默认情况下,将在当前测试类或其基类之一中查找数据提供者。如果要将数据提供者放在不同的类中,它需要是静态方法或具有非参数构造函数的类,并在dataProviderClass属性中指定可以找到它的类:
public 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) {
// ...
}
}
数据提供者也支持注入。TestNG 将使用测试上下文进行注入。Data Provider 方法可以返回以下类型之一:
- 对象数组 ( Object[][] )的数组,其中第一个维度的大小是调用测试方法的次数,第二个维度的大小包含必须与测试的参数类型兼容的对象数组方法。上面的例子就是这种情况。
- 一个Iterator