8、@Parameters使用方式
测试方法不必是无参数的。 您可以在每种测试方法上使用任意数量的参数,并指示TestNG使用@Parameters注解向您传递正确的参数。
@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
and @Factory
之上
@Parameters({ "datasource", "jdbcDriver" })
@BeforeMethod
public void beforeTest(String ds, String driver) {
m_dataSource = ...;
m_jdbcDriver = driver;
}
可以使用@Optional
指定参数默认值
@Parameters("db")
@Test
public void testNonExistentParameter(@Optional("mysql") String db) { ... }
如果在testng.xml
中找不到"db"
参数,将使用mysql
作用参数值。
9、@DataProvider使用方式
如果我们需要传递复杂的参数,或者需要通过Java创建的参数(复杂对象,从属性文件或数据库读取的对象等),则在testng.xml
中指定参数可能不够。 在这种情况下,您可以使用数据提供程序来提供需要测试的值。 数据提供程序是类上的一种方法,它返回对象数组的数组。 此方法用@DataProvider
注解:
//此方法声明为一个数据支持者,测试方法可以通过name调用
@DataProvider(name = "test1")
public Object[][] createData1() {
return new Object[][] {
{ "Cedric", new Integer(36) },
{ "Anne", new Integer(37)},
};
}
//此测试方法指定引用test1数据支持者
@Test(dataProvider = "test1")
public void verifyData1(String n1, Integer n2) {
System.out.println(n1 + " " + n2);
}
输出
Cedric 36
Anne 37
默认情况下,dataProvider
在同一个类中通过name
查找方法,如果想再其他类中查找数据支持者,必须dataProviderClass
指定,同时必须使用static
修饰,如下:
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) {
// ...
}
}
dataProvider
支持的返回值类型:
Object[n][m]:n表示test方法执行次数,m表示test方法有几个参数。(最常用)
Iterator<Object[]>:和Object[][]类似,换成了迭代器而已,可以理解为List<Object>.iterate()
Object[n]:某种类型的数组。
Iterator<Object>:某种类型的迭代器。
Iterator<Object[]>:
@DataProvider(name = "test1")
public Iterator<Object[]> createData() {
return new MyIterator(DATA);
}
Object[n]:
@DataProvider(name = "test1")
public MyCustomData[] createData() {
return new MyCustomData[]{ new MyCustomData() };
}
Iterator<Object>:
@DataProvider(name = "test1")
public Iterator<MyCustomData> createData() {
return Arrays.asList(new MyCustomData()).iterator();
}
Iterator<Object>:
@DataProvider(name = "test1")
public Iterator<Stream> createData() {
return Arrays.asList(Stream.of("a", "b", "c")).iterator();
}
可以在DataProvider
方法上声明一个java.lang.reflect.Method
参数用来输出test方法名称,当多个test方法使用同一个DataProvider
时非常有用:
@DataProvider(name = "dp")
public Object[][] createData(Method m) {
System.out.println(m.getName()); // 打印 test 方法 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
如果你想并发执行,使用parallel
属性
@DataProvider(parallel = true)
从属性默认情况下,线程池的大小为10。 我们可以在XML文件的标记中修改此值:
<suite name="Suite1" data-provider-thread-count="20" >
...
10、依赖
有时,您需要按特定顺序调用测试方法。我们可以使用@Test
批注中的属性dependsOnMethods
或dependsOnGroups
。
有两种依赖关系:
硬依赖: 所依赖的所有方法都必须已经运行并成功运行。 如果依赖项中至少发生了一次故障,则不会在报告中调用并将其标记为SKIP。
软依赖:即使其中一些方法失败了,也将始终在所依赖的方法之后运行。通过在@Test批注中添加“alwaysRun = true”来获得软依赖性。
硬依赖:
@Test
public void serverStartedOk() {}
@Test(dependsOnMethods = { "serverStartedOk" })
public void method1() {}
此案例,serverStartedOk
先执行,method1
再执行。
我们还可以使用依赖组:
@Test(groups = { "init" })
public void serverStartedOk() {}
@Test(groups = { "init" })
public void initEnvironment() {}
@Test(dependsOnGroups = { "init.*" })
public void method1() {}
init.*
使用的是正则表达式,所以method1
在serverStartedOk
和initEnvironment
之后执行。
欢迎来到testingpai.com!
注册 关于