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

Posted beifucangqiong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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可以帮助我们实现简单的数据驱动测试(根据测试数据,执行对应的程序)。

以上是关于TestNG中@Factory的用法一:简单的数据驱动的主要内容,如果未能解决你的问题,请参考以下文章

TestNg的工厂測试引用@DataProvider数据源----灵活使用工厂測试

10TestNG 的 FixTrue用法一

TestNG中DataProvider的用法

TestNg依赖配置基础用法(单一方法依赖)------TestNg依赖详解

构造函数上的 TestNG Factory、DataProvider 和 valargs 导致“java.lang.IllegalArgumentException:参数数量错误”2

TestNG 入门教程