TestNG @Factory注解教程

TestNG @Factory注解教程

原文: https://howtodoinjava.com/testng/testng-factory-annotation-tutorial/

让我们了解 TestNG @Factory注解,该注解允许根据某些数据集或条件在运行时创建测试。

Table of Contents

1\. When to use testng factory
2\. Basic testng factory example
3\. TestNG factory - test parameters
4\. TestNG @Factory with @DataProvider
5\. TestNG @Factory - dependent tests

1. 何时使用 testng 工厂

有时我们可能需要使用不同的数据值运行一组测试。 为此,我们可以在 testng XML 的套件中定义一组独立的测试,并测试所需的场景。 这种方法的问题在于,如果您获得了额外的数据集,则需要重新定义测试。

TestNG 通过提供@Factory注解功能解决了此问题。 TestNG 中的工厂在运行时动态定义和创建测试。

工厂方法必须返回Object类的数组,即Object[]

2. 基本的 testng 工厂示例

让我们使用 TestNG 的@Factory注解创建一个示例程序,以了解如何使用工厂

public class SimpleTest 
{
	@Test
	public void simpleTest() {
		System.out.println("Simple Test Method.");
	}
}

public class SimpleTestFactory 
{
	@Factory
	public Object[] factoryMethod() {
		return new Object[] { new SimpleTest(), new SimpleTest() };
	}
}

上一类在其中定义了工厂方法。 通过在相应的测试方法上方声明@Factory来定义工厂方法。

让我们现在运行工厂。

Simple Test Method.
Simple Test Method.
PASSED: simpleTest
PASSED: simpleTest

如您在前面的测试结果中看到的,SimpleTestFactory类的测试方法执行了两次。 该执行基于工厂方法返回的Object数组。 当所述方法返回SimpleTest类的两个对象时,TestNG 在指定的返回对象内部查找并在其中执行所有测试方法。 在这种情况下,由于只有一种测试方法,因此 TestNG 会执行相应的测试方法。

3. TestNG 工厂参数

使用工厂方法的主要优点之一是,您可以在初始化它们时将参数传递给测试类。 然后,可以在上述类中存在的所有测试方法中使用这些参数。

public class SimpleTest 
{
	private int param;

	public SimpleTest(int param) {
		this.param = param;
	}

	@Test
	public void testMethodOne() {
		int opValue = param + 1;
		System.out.println("Test method one output: " + opValue);
	}

	@Test
	public void testMethodTwo() {
		int opValue = param + 2;
		System.out.println("Test method two output: " + opValue);
	}
}

public class SimpleTestFactory 
{
	@Factory
	public Object[] factoryMethod() {
		return new Object[] { new SimpleTest(0), new SimpleTest(1) };
	}
}

上一个测试类的构造器将一个参数作为整数,并将其分配给局部变量param。 然后,在测试类中提供的两种测试方法中使用此变量。 每个测试方法都会为param添加一个值,并在执行时将其打印到控制台。

现在开始运行测试。

Test method one output: 2
Test method one output: 1
Test method two output: 3
Test method two output: 2

PASSED: testMethodOne
PASSED: testMethodOne
PASSED: testMethodTwo
PASSED: testMethodTwo

从前面的测试结果中可以看到,每个测试方法分别执行两次。 测试方法使用初始化测试类时传递的参数,并且控制台显示相应的输出。

4. TestNG @Factory@DataProvider

@DataProvider功能也可以与@Factory注解一起使用,以在运行时创建测试。 这可以通过在类的构造器或常规方法上声明@Factory注解来完成。

public class DataProviderTest 
{
	private int param;

	@Factory(dataProvider = "dataMethod")
	public DataProviderTest(int param) {
		this.param = param;
	}

	@DataProvider
	public static Object[][] dataMethod() {
		return new Object[][] { { 0 }, { 1 } };
	}

	@Test
	public void testMethodOne() {
		int opValue = param + 1;
		System.out.println("Test method one output: " + opValue);
	}

	@Test
	public void testMethodTwo() {
		int opValue = param + 2;
		System.out.println("Test method two output: " + opValue);
	}
}

前面的类类似于我们先前使用的测试类。 测试类的构造器带有@Factory注解。 此注解使用名为dataMethodDataProvider方法为测试类的构造器提供值。 DataProvider方法返回一个双对象数组,其中第一个数组代表数据集,该数据集确定要迭代测试的次数,而第二个数组是每次迭代将传递给测试方法的实际参数值。 所述双对象数组包含两个数据集,其值分别为 0 和 1。

现在开始运行测试。

Test method one output: 2
Test method one output: 1
Test method two output: 3
Test method two output: 2

PASSED: testMethodOne
PASSED: testMethodOne
PASSED: testMethodTwo
PASSED: testMethodTwo

5. TestNG @Factory – 依赖测试

到目前为止,我们已经看到了工厂实现的不同示例。 让我们看看与工厂类一起使用时如何执行依赖方法。

public class DependencyTest 
{
	private int param;

	public DependencyTest(int param) {
		this.param = param;
	}

	@Test(dependsOnMethods = { "testMethodTwo" })
	public void testMethodOne() {
		System.out.println("Test method one with param values: " + this.param);
	}

	@Test
	public void testMethodTwo() {
		System.out.println("Test method two with param values: " + this.param);
	}
}

public class SimpleTestFactory 
{
	@Factory
	public Object[] factoryMethod() 
	{
		return new Object[] { new DependencyTest(1), new DependencyTest(2) };
	}
}

此类包含两种测试方法testMethodOnetestMethodTwo,其中testMethodOne取决于testMethodTwo。 该类的构造器将一个参数作为整数,并将其值设置为名为param的内部变量。 这两种测试方法在执行时都会将其方法名称和param变量值一起打印到控制台。

现在开始运行测试。

Test method two with param values: 2
Test method two with param values: 1
Test method one with param values: 2
Test method one with param values: 1

PASSED: testMethodTwo
PASSED: testMethodTwo
PASSED: testMethodOne
PASSED: testMethodOne

从前面的测试结果可以看出,testMethodTwo的两个实例都在testMethodOne的任何实例之前执行。 这是 TestNG 中工厂实现的默认行为,它将在实际测试方法之前执行从属测试方法的所有实例。

这与 TestNG 中的 @Factory注解有关。 如果您有任何疑问,请告诉我。

学习愉快!

参考:

TestNG 文档