8 工厂们(
Factories)
工厂们允许动态创建测试。比如:假设我们想要创建一个方法,该方法需要使用不同的值访问网站的几次网页。
public class TestWebServer {
@Test(parameters = { "number-of-times" })
public void accessPage(int numberOfTimes) {
while (numberOfTimes-- > 0) {
// access the web page
}
}
}
xml配置
<test name="T1">
<parameter name="number-of-times" value="10"/>
<class name="TestWebServer"/>
</test>
<test name="T2"> <parameter name="number-of-times" value="20"/> <class name="TestWebServer"/> </test>
<test name="T3">
<parameter name="number-of-times" value="30"/>
<class name="TestWebServer"/>
</test>
这种情况很快会变得无法管理,这种情况下,我们应该使用工厂(factory):
publicclassWebTestFactory{
@FactorypublicObject[]createInstances(){
Object[]result=newObject[10];for(inti=0;i<10;i++){
result[i]=newWebTest(i*10);
}returnresult;
}
}
新的测试类如下:
publicclassWebTest{
privateintm_numberOfTimes;publicWebTest(intnumberOfTimes){
m_numberOfTimes=numberOfTimes;
}@TestpublicvoidtestServer(){
for(inti=0;i<m_numberOfTimes;i++){
//accessthewebpage
}
}
}
在testng.xml中紧紧需要配置包含工厂方法的类即可。因为测试实例本身会在运行的时候被创建:
<class name="WebTestFactory" />
工厂方法可以接受像@test和@Before/After这样的参数,必须返回object[]。返回的对象可以任何类,且甚至不用包含TestNG的注解。
工厂也可以和数据提供者一起使用,可以通过将注解@Factory放在正常方法或者构造方法上。下面是一个构造方法的例子:
@Factory(dataProvider="dp")publicFactoryDataProviderSampleTest(intn){
super(n);
}@DataProviderstaticpublicObject[][]dp(){
returnnewObject[][]{
newObject[]{
41
},
newObject[]{
42
},
};
}