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可以帮助我们实现简单的数据驱动测试(根据测试数据,执行对应的程序)。

原文地址:https://www.cnblogs.com/beifucangqiong/p/11184975.html

时间: 2024-10-15 05:02:02

TestNG中@Factory的用法一:简单的数据驱动的相关文章

TestNG中的注解(Annotations)

TestNG中的注解极大的方便了测试用例与测试方法的组织.考虑到平时使用的特别多,所以从官方文档中转载过来,并且考虑到逐步的翻译,以备不时之需. @BeforeSuite@AfterSuite@BeforeTest@AfterTest@BeforeGroups@AfterGroups@BeforeClass@AfterClass@BeforeMethod@AfterMethod Configuration information for a TestNG class: @BeforeSuite:

TestNg之@Factory详解------如何进行参数值变化性测试

TestNg的 @Factory注解从字面意思上来讲就是采用工厂的方法来创建测试数据并配合完成测试 其主要应对的场景是:对于某一个测试用例或方法,我们需要输入多个测试数据进行测试,并且这些测试数据可以是有一定关系(可以通过代码控制), 此时,我们就可以把自动化或者手动测试时的遇到的只因测试数据不同的多个测试用例合并成一个测试用例,来进行更方便和快捷的测试, 对编写自动化测试代码人员节省了很多时间 策略:一般我们会在标有@Factory注解的方法中对测试类进行调用,这时TestNg会自动调用测试类

Python练习题4(列表去重):[5,3,4,&#39;ok&#39;,4,3,&#39;abc&#39;,8,52,&#39;ok&#39;]去除列表中重复内容 方法一:使用set 方法二:不使用set,自己写方法

方法一:利用集合去重 1 list1 = [5,3,4,'ok',4,3,'abc',8,52,'ok'] 2 list1=list(set(list1)) 3 print(list1) 方法二:此方法略微冗余,先判断元素是否重复,再将重复元素提取并保存到新列表中,再for 新建的列表元素,删除原列表 1 def list_dup(ls): 2 list2 = [] 3 length = len(ls) #获取列表元素个数 4 for i in range(0,length-1): 5 for

Hibernate中,基于Annotation的简单树形结构的实现

在系统设计中,经常用到递归性质的树形结果,比如菜单.多级分类等,一般是在同一个表中定义父子关系实现这种结构. 下面是在Hibernate中,基于Annotation的简单树形结构的实现: 第一步:创建Entity类,并添加注解实现关联关系    ps: 主要是利用@ManyToOne 和 @OneToMany 配置在同一个Entity类中实现树形递归的结构.hibernate注解形式比在xml配置更加简洁 TreeNode.java 1 package com.hfut.hibernate; 2

Collections中sort()方法源代码的简单分析

Collections的sort方法代码: public static <T> void sort(List<T> list, Comparator<? super T> c) { Object[] a = list.toArray(); Arrays.sort(a, (Comparator)c); ListIterator i = list.listIterator(); for (int j=0; j<a.length; j++) { i.next(); i.

Android中资源文件中的字符串数组string-array简单用法

在Android中,用string-array是一种简单的提取XML资源文件数据的方法. 例子如下: 把相应的数据放到values文件夹的strings.xml文件里,或是其他自定义的xml中都可以,以下操作方法相同. <?xml version="1.0" encoding="utf-8"?> <resources> <string-array name="sports"> <item>足球<

Android中的帧动画的简单使用

Android中动画主要有下面几种,帧动画(frame),补间动画(tween),属性动画(property) 我们平时项目中主要用的是帧动画和补间动画 帧动画需要我们准备一组静态图片,这些图片是通过分解动画得来的,静态图片连起来播放形成动画效果 我们在res目录下新建一个drawable目录,用来存放动画资源和xml文件 图片如下: girl.xml 注意android:oneshot="false|true" 该属性控制动画是否重复播放,false代表重复播放 <?xml v

在IIS中配置PHP运行环境简单步骤-注意事项

在IIS中配置PHP运行环境简单步骤 安装 IIS 7.0 打开 Control Panel\Programs\Programs and Features\Turn Windows features on or off, 在打开的对话框中勾选上这两个选项: 单击OK等待片刻, IIS就安装完成了. 安装 PHP 5.2.6 1. 下载: PHP 5.2.6 ;  其它版本的 PHP 下载. 2. 将压缩包解压, 放到一个目录中, 比如 D:\php 3. 将 php.ini-dist 复制到 C

工作中关于rpm的一个简单但头疼的问题

工作中关于rpm的一个简单但头疼的问题: 公司有个需要自动化更新rpm包的需求,rpm包名是:tingyun-agent-php-1.0.5-1.x86_64,本来是一个很简单的东西,一行代码就可以实现: for a in `rpm-aq|grep tingyun`;do rpm -e $a;done 但是结果是: [[email protected] scripts]# for a in`rpm -aq|grep tingyun`;do rpm -e $a;done error: packag