工厂允许您动态创建测试。例如,假设您想创建一个测试方法,该方法将多次访问网站上的页面,并且您想用不同的值调用它:
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 {@Factorypublic 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;}@Testpublic void testServer() {for (int i = 0; i < m_numberOfTimes; i++) {// access the web page}}}
您的testng.xml只需要引用包含工厂方法的类,因为测试实例本身将在运行时创建:
<class name="WebTestFactory" />
或者,如果以编程方式构建测试套件实例,您可以以与测试相同的方式添加工厂:
TestNG testNG = new TestNG();testNG.setTestClasses(WebTestFactory.class);testNG.run();
工厂方法可以像@Test和@Before/After一样接收参数,并且它必须返回Object[]。返回的对象可以是任何类(不一定与工厂类相同),它们甚至不需要包含 TestNG 注释(在这种情况下它们将被 TestNG 忽略)。
工厂也可以与数据提供者一起使用,您可以通过将@Factory注释放在常规方法或构造函数上来利用此功能。这是构造函数工厂的示例:
@Factory(dataProvider = "dp")public FactoryDataProviderSampleTest(int n) {super(n);}@DataProviderstatic public Object[][] dp() {return new Object[][] {new Object[] { 41 },new Object[] { 42 },};}
该示例将使 TestNG 创建两个测试类,使用值 41 调用构造函数,使用值 42 调用另一个。
