工厂允许动态创建测试。
例如,假设你想创建一个测试方法,该方法将多次访问网站上的页面,并且希望每次使用不同的值来调用它,可以如下实现:
public class TestWebServer {
@Test(parameters = { "number-of-times" })
public void accessPage(int numberOfTimes) {
while (numberOfTimes-- > 0) {
// access the web page
}
}
}
<test name="T1">
<parameter name="number-of-times" value="10"/>
<classes>
<class name= "TestWebServer" />
</classes>
</test>
<test name="T2">
<parameter name="number-of-times" value="20"/>
<classes>
<class name= "TestWebServer"/>
</classes>
</test>
<test name="T3">
<parameter name="number-of-times" value="30"/>
<classes>
<class name= "TestWebServer"/>
</classes>
</test>
但是上面这种方式可能很快就会变得无法管理,因此,应该使用工厂:
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;
}
}
新的测试类:
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
}
}
}
testng.xml只需要引用包含工厂方法的类,因为测试实例本身将在运行时创建:
<class name="WebTestFactory" />
如果以编程方式构建test suite实例,则可以按照相同的方式添加工厂执行测试:
TestNG testNG = new TestNG();
testNG.setTestClasses(WebTestFactory.class);
testNG.run();
工厂方法可以像@Test和@ Before / After一样接收参数,必须返回Object []。返回的对象可以是任何类(不一定与工厂类相同),它们甚至不需要包含TestNG注解(在这种情况下,TestNG将忽略它们)。
工厂也可以与data provider一起使用,并且可以通过将@Factory注解放在常规方法或构造函数上来利用此功能。这是构造函数工厂的示例:
@Factory(dataProvider = "dp")
public FactoryDataProviderSampleTest(int n) {
super(n);
}
@DataProvider
static public Object[][] dp() {
return new Object[][] {
new Object[] { 41 },
new Object[] { 42 },
};
}
该示例将使TestNG创建两个测试类,分别使用值41和42调用构造函数。
类级别的注解
@Test注解不仅可以放在方法上,也可以放在类上:
@Test
public class Test1 {
public void test1() {
}
public void test2() {
}
}
类级别的@Test注解的作用是使该类的所有公共方法都成为测试方法,即使它们没有被注解。如果要添加某些属性,仍然可以在方法上重复使用@Test注解。例如:
@Test
public class Test1 {
public void test1() {
}
@Test(groups = "g1")
public void test2() {
}
}
以上将会同时添加两个测试方法,但是test2()属于g1组。
欢迎关注 公众号【测试备忘录】,一起交流学习~