在前面的文章中,我们介绍了@Parameters标注,可以在运行时为测试方法设置参数。但是,对于一个测试类,只是因为测试方法的参数不同,就不得不在testng.xml中定义大量雷同的测试用例,这样的做法将很快导致测试规划的冗长,难以维护。
为此,TestNG还提供了测试实例的工厂机制,用到了@Factory标注。在这种工厂机制中,工厂类定义了一个使用@Factory标注声明的方法,该方法必须返回一个Object[]类型的数组,数组元素就是运行时生成的测试类的实例。这些测试类的实例往往采用不同的参数构造,因而可以执行不同的测试用例。
1.定义测试类
public class WebTest {
private int m_numberOfTimes;
public WebTest(int numberOfTimes) {
m_numberOfTimes = numberOfTimes;
}
@Test
public void testServer() {
for (int i = 0; i < m_numberOfTimes; i++) {
// access the web page
}
}
该测试类的构造带参数。
2.定义测试实例的工厂类
public class WebTestFactory {
@Factory
public Object[] createInstances() {
Object[] result = new Object[10];
for (int i = 0; i < 10; i++) {
result[i] = new WebTest(i * 10);//动态参数的测试实例
}
return result;
}
}
只有一个创建测试实例的方法,由@Factory标注声明。
3.在testng.xml配置文件中使用测试工厂类
<class name="WebTestFactory" />
补充,作为构造测试实例的参数,还可以使用@DataProvider,示例如下:
public class FactoryDataProviderFactory {
@Factory(dataProvider = "dp")
public Object[] FactoryDataProviderSampleTest(int n) {
...
}
@DataProvider(name = "dp")
public static Object[][] dp() {
return new Object[][] {
new Object[] { 41 },
new Object[] { 42 },
};
}
}