本文共 1671 字,大约阅读时间需要 5 分钟。
TestNG中@Factory与@DataProvider的功能大相径庭,但是在多次执行的问题上常常理不清。
1.@DataProvider
首先,必须明确,使用@DataProvider修饰的方法,只负责提供测试数据,而且是测试执行前就确定了的静态数据。该方法必须被其他测试方法引用才意义。
其次,必须强调,使用@DataProvider修饰的方法,其返回的数据类型必须为Object[][]。为什么必须是二维数组呢?其中的一维表示单位测试数据,而另一维表示可以提供多组独立的测试数据,供逐一使用。
@DataProviderpublic Object[][] dataMethod() { return new Object[][] { { "one" }, { "two" } };}
所以,当@DataProvider修饰的方法提供了多组测试数据时,引用@DataProvider的测试方法,就会被多次执行,每次执行使用@DataProvider的一组测试数据。即@DataProvider修饰的方法中有多少组测试数据,引用@DataProvider的测试方法就会被执行多少次。但是自始至终只有一个测试类的实例,即该实例的一个测试方法被多次执行。
@Test(dataProvider = "dataMethod")public void testMethod(String param) { System.out.println("The parameter value is: " + param);}
2. @Factory
首先,使用@Factory修饰的方法,负责提供测试类的实例。只是测试类的构造函数带了参数,为了构造不同的测试类实例,每次都要给测试类的构造函数传递不同的测试参数,从而构造不同的测试类的实例。@Factory修饰的方法永远返回Object[]类型。
其次,测试类中无需显式引用@Factory修饰的方法,因为该方法就提供测试类的实例,不需要调用。执行测试时,先构造一个测试类的实例,再执行该测试类中的所有测试方法。然后再构造一个新的测试类的实例,并执行其所有测试方法,直到所有的测试类的实例都被构造执行。即@Factory修饰的方法中有多少个测试类的实例,就会执行多少遍该测试类中的所有测试方法。
@Factorypublic Object[] factoryMethod() { return new Object[] { new SimpleTest("one"), new SimpleTest("two") };}
3. 在@Factory方法中引用@DataProvider方法
既然@Factory修饰的方法,也需要测试数据用以构造测试类的实例,那么该方法还可以引用@DataProvider修饰的方法,以构造不同的测试类的实例。
@Factory(dataProvider = "dataMethod")public Object[] factoryMethod(String param) { return new Object[] { new SimpleTest(param) };}
4. 不同测试类的实例
此外,@Factory修饰的方法不仅仅能够构造一个测试类的不同实例,还能够构造不同测试类的实例。
@Factory(dataProvider = "dataMethod")public Object[] factoryMethod(String param) { return new Object[] { new SimpleTest(param), new ComplicateTest(param) };}
使用上述@dataProvider作为参数数据,将分别构造两个SimpleTest测试类实例,和ComplicateTest两个测试类实例。
转载地址:http://oqlai.baihongyu.com/