TestNG – @Factory和@DataProvider之间的区别
TestNG – @Factory
和@DataProvider
之间的区别
在学习 TestNG 时,许多人在阅读@DataProvider
和@Factory
注解时会感到困惑 - 什么时候使用什么? 还有什么更好的呢? 让我们看看它们的两个功能。
@Factory
和@DataProvider
之间的区别
以下是 TestNG 上@Factory
和@DataProvider
功能之间的主要区别。
- 数据供应器:使用数据供应器的测试方法将根据数据供应器提供的数据执行多次。 该测试方法将使用该测试方法所属的相同测试类实例来执行。
- 工厂:工厂将使用相应类的单独实例执行测试类中存在的所有测试方法。
TestNG 工厂用于动态创建测试类的实例。 如果要多次运行测试类,这将很有用。 例如,如果您有一个要登录到站点的测试并且想要多次运行该测试,则它易于使用的 TestNG 工厂在其中创建多个测试类实例并运行测试(可能是测试任何内存泄漏) 问题)。
而数据供应器用于为测试提供参数。 如果为测试提供数据供应器,则每次运行测试时将使用不同的值集。 对于需要每次使用不同用户名和密码集登录到站点的情况,这很有用。
让我们创建一个示例,展示这两者之间的明显区别。
@DataProvider
示例
下列类包含testMethod
和beforeClass
方法。 testMethod
接受String
参数,该参数的值由DataProvider
方法dataMethod
提供。 beforeClass
方法在执行时将消息打印到控制台上,testMethod
也是如此。 testMethod
在执行时将传递给它的参数打印到控制台。
public class DataProviderClass
{
@BeforeClass
public void beforeClass() {
System.out.println("Before class executed");
}
@Test(dataProvider = "dataMethod")
public void testMethod(String param) {
System.out.println("The parameter value is: " + param);
}
@DataProvider
public Object[][] dataMethod() {
return new Object[][] { { "one" }, { "two" } };
}
}
让我们进行测试。
Before class executed
The parameter value is: one
The parameter value is: two
PASSED: testMethod("one")
PASSED: testMethod("two")
从前面的测试结果中可以看到,无论执行了多少次测试方法,类beforeClass
仅执行一次。
@Factory
示例
下列类包含testMethod
和beforeClass
方法。 测试类的构造器采用String
参数值。 beforeClass
和testMethod
都将消息打印到控制台上。
public class SimpleTest
{
private String param = "";
public SimpleTest(String param) {
this.param = param;
}
@BeforeClass
public void beforeClass() {
System.out.println("Before SimpleTest class executed.");
}
@Test
public void testMethod() {
System.out.println("testMethod parameter value is: " + param);
}
}
public class SimpleTestFactory
{
@Factory
public Object[] factoryMethod() {
return new Object[] {
new SimpleTest("one"),
new SimpleTest("two")
};
}
}
让我们进行测试。
Before SimpleTest class executed.
testMethod parameter value is: two
Before SimpleTest class executed.
testMethod parameter value is: one
PASSED: testMethod
PASSED: testMethod
从先前的测试结果可以看出,在每次执行testMethod
之前,都会执行beforeClass
方法。 这表明工厂实现对测试类的每个单独实例执行测试方法。 如前所述,DataProvider
为测试类的单个实例执行测试方法(testMethod
)。