TestNG中@Factory的用法一:简单的数据驱动

为什么要使用@Factory注解呢,先来看下面这个例子

被测试类Person

package ngtest;

import org.testng.annotations.Parameters;
import org.testng.annotations.Test;

/**
 * @author Administrator
 *
 */
public class Person{
	String name;
	int age;
	
	@Parameters({"name","age"})
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}

	@Test()
	public void say() {
		System.out.print("我是"+name+" ");
		if(age<18){
			System.out.println("我未成年");
		}else if(age>=18&&age<=45){
			System.out.println("我是青年人");
		}else if(age>45&&age<=60){
			System.out.println("我是中年人");
		}else if(age>60){
			System.out.println("我是老年人");
		}
	}
	
}

该类的say()方法中有四个判断分支,为了测试充分,必须执行四次这个方法,如果不使用@Factory注解,在TestNG配置文件中必须这样配置:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite">
	<test name="Test1">
		<parameter name="name" value="明明" />
		<parameter name="age" value="10" />
		<classes>
			<class name="ngtest.Person" />
		</classes>
	</test>
	<test name="Test2">
		<parameter name="name" value="杨子" />
		<parameter name="age" value="20" />
		<classes>
			<class name="ngtest.Person" />
		</classes>
	</test>
	<test name="Test3">
		<parameter name="name" value="刘创" />
		<parameter name="age" value="50" />
		<classes>
			<class name="ngtest.Person" />
		</classes>
	</test>
	<test name="Test4">
		<parameter name="name" value="朱爷爷" />
		<parameter name="age" value="70" />
		<classes>
			<class name="ngtest.Person" />
		</classes>
	</test>
</suite> 

如果使用@Factory注解,就比较简单,而且方便扩展,示例如下。

不需改动原有类,添加一个新类PersonFactory

package ngtest;

import java.util.ArrayList;

import org.testng.annotations.Factory;

public class PersonFactory {
	@Factory
	public Object[] factory() {
		ArrayList<Person> testList = new ArrayList<>();
		Person tp = new Person("明明",10);
		testList.add(tp);
		Person tp2 = new Person("杨子",20);
		testList.add(tp2);
		Person tp3 = new Person("刘创",50);
		testList.add(tp3);
		Person tp4 = new Person("朱爷爷",70);
		testList.add(tp4);
		return testList.toArray();
	}
}

运行时,可以在Eclipse中,在这个factory类上点击右键,run as testng suite执行,也可以配置在testng.xml中,只需要配置factory类即可,原类不用管。
testng.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite">
	<test name="Test1">
		<classes>
			<class name="ngtest.PersonFactory" />
		</classes>
	</test>
</suite> 

运行结果

[TestNG] Running:
  D:\workspace\tester\testng.xml

我是朱爷爷 我是老年人
我是杨子 我是青年人
我是刘创 我是中年人
我是明明 我未成年

===============================================
Suite
Total tests run: 4, Failures: 0, Skips: 0
===============================================

使用@Factory的运行原理

  1. 如果不使用@Factory,运行普通的被@Test标注的方法时,实际上是TestNG框架调用了该类的构造函数构造出一个对象,然后再执行对象的这个方法。
  2. 使用了@Factory后,可以看到被@Factory标注的方法返回了一个Object数组,数组中每一个元素是一个被测试类的对象。也就是说@Factory构造了多个被测试类对象,然后把每一个对象都传递给了TestNG框架,然后TestNG框架在分别执行这些对象中被@Test标注的方法。
    通过上面的描述,我们就知道了@Factory可以帮助我们实现简单的数据驱动测试(根据测试数据,执行对应的程序)。
posted @ 2019-07-14 17:38  背负苍穹  阅读(477)  评论(0编辑  收藏  举报