简介
  最近忙着装修博客园,没时间更新文章,今天终于抽出时间把上次写的一半的文章给写完了,新的博客园风格,希望大家喜欢。今天继续介绍testng的相关知识–工厂。

工厂允许你动态的创建测试。例如,假设你需要创建一个测试方法,并用它来多次访问一个web页面,而且每次都带有不同的参数:

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

对编写自己主动化测试代码人员节省了非常多时间

策略:一般我们会在标有@Factory注解的方法中对测试类进行调用,这时TestNg会自动调用测试类中带有@Test注解的方法

配置文件:只需要配置带有@Factory注解的类即可

@Factory必须放在一个返回对象数组的顶部,所有的这些对象都包含测试类的实例,testng会确保@Factory只被调用一次。

@Factory方法是首先被调用的,在@Test方法和配置方法之前,只有当所有的@Factory方法被调用之后,testng才开始执行配置和测试方法。

@Factory允许在运行时动态测试。

上边说了这么多是不是把大家说的云里雾里,晕头转向的,接下来通过具体的例子给小伙伴和同学们分享一下。

实例
为什么要使用@Factory注解呢,先来看下面这个例子
被测试类Person:

参考代码:

package hongge;

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

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配置文件中必须这样配置:

TestNG配置文件
参考代码

从上边我们可以清楚地看出来:参数一旦多起来,就难以管理了,所以应该使用工厂来做

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

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

新类PersonFactory

参考代码package hongge;

import java.util.ArrayList;

import org.testng.annotations.Factory;

public class PersonFactory {
@Factory
public Object[] factory() {
ArrayList 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类(PersonFactory)上点击右键,Run As-> TestNg test执行,


也可以配置在testng.xml中,只需要配置factory类即可,原类不用管。

testng.xml
参考代码
运行结果
你的testng.xml 只需要引用包含工厂方法的类,而测试实例自己会在运行时创建:

工厂方法可以接受诸如 @Test 和 @Before/After 所标记的参数,并且会返回 Object[]。这些返回的对象可以是任何类(不一定是跟工厂方法相同的类),并且他们甚至都不需要TestNG注解(在例子中会被TestNG忽略掉)

使用@Factory的运行原理
1、如果不使用@Factory,运行普通的被@Test标注的方法时,实际上是TestNG框架调用了该类的构造函数构造出一个对象,然后再执行对象的这个方法。

2、使用了@Factory后,可以看到被@Factory标注的方法返回了一个Object数组,数组中每一个元素是一个被测试类的对象。也就是说@Factory构造了多个被测试类对象,然后把每一个对象都传递给了TestNG框架,然后TestNG框架在分别执行这些对象中被@Test标注的方法。
通过上面的描述,我们就知道了@Factory可以帮助我们实现简单的数据驱动测试(根据测试数据,执行对应的程序)。

Java自动化测试框架-07 - TestNG之Factory篇 - (详细教程)相关推荐

  1. Java自动化测试框架-01 - TestNG之入门篇 - (详细教程)

    TestNG是什么? TestNG按照官方的定义: TestNG是一个测试框架,其灵感来自JUnit和NUnit,但引入了一些新的功能,使其功能更强大,使用更方便. TestNG是一个开源自动化测试框 ...

  2. Java自动化测试框架-11 - TestNG之annotation与并发测试篇 (详细教程)

    1.简介 TestNG中用到的annotation的快速预览及其属性. 2.TestNG基本注解(注释) 注解 描述 @BeforeSuite 注解的方法只运行一次,在当前suite所有测试执行之前执 ...

  3. Java自动化测试框架-08 - TestNG之并行性和超时篇 (详细教程)

    一.并行性和超时 您可以指示TestNG以各种方式在单独的线程中运行测试. 可以通过在suite标签中使用 parallel 属性来让测试方法运行在不同的线程中.这个属性可以带有如下这样的值: 二.并 ...

  4. Java自动化测试框架-12 - TestNG之xml文件详解篇 (详细教程)

    1.简介 现在这篇,我们来学习TestNG.xml文件,前面我们已经知道,TestNG就是运行这个文件来执行测试用例的.通过本篇,你可以进一步了解到:这个文件是配置测试用例,测试套件.简单来说,利用这 ...

  5. Java自动化测试框架-04 - TestNG之Test Method篇 - (详细教程)

    简介 按照上一篇的计划,这一篇给小伙伴们分享一下测试方法. 一.设置参数 测试方法是可以带有参数的.每个测试方法都可以带有任意数量的参数,并且可以通过使用TestNG的@Parameters向方法传递 ...

  6. Java自动化测试框架-03 - TestNG之Test Group篇 - (详细教程)

    简介 其实这篇文章的group宏哥在上一篇中就提到过,但是就是举例一笔带过的,因此今天专门有一篇文章来讲解Group的相关知识.希望大家茅塞顿开 ,有着更进一步认识和了解测试组. 一.Test Gro ...

  7. Java自动化测试框架-10 - TestNG之测试结果篇(详细教程)

    1.-测试结果 1.1-成功,失败和断言 测试被认为是成功的,如果它不引发任何异常完成,还是它扔的预期异常(请参阅文档expectedExceptions属性上找到的@Test注释). 您的测试方法通 ...

  8. Java自动化测试框架-09 - TestNG之依赖注入篇 (详细教程)

    1.-依赖注入 TestNG支持两种不同类型的依赖项注入:本机(由TestNG本身执行)和外部(由诸如Guice的依赖项注入框架执行). 1.1-本机依赖项注入 TestNG允许您在方法中声明其他参数 ...

  9. Java自动化测试框架-02 - TestNG之理论到实践 - (详细教程)

    理论 TestNG,即Testing, NextGeneration,下一代测试技术,是一套根据JUnit 和NUnit思想而构建的利用注释来强化测试功能的一个测试框架,即可以用来做单元测试,也可以用 ...

最新文章

  1. latex 表格单元格上下左右居中_Excel文字对齐技巧:学会这6种方式,快速整理规范表格...
  2. 完美解决Ubuntu16.04虚拟机窗口自适应问题
  3. TensorFlow 1.2正式发布,新增Python 3.6支持
  4. 膨胀卷积的缺点_膨胀卷积与IDCNN
  5. mysql 快速初始化_MySQL中的批量初始化数据的对比测试(r12笔记第71天)
  6. RGB与YUV的转换
  7. 【git】克隆成功,但是检出失败
  8. Django Navi 重用
  9. 在Flash中使影片剪辑等候一段时间播放
  10. 【Linux】Linux备份与恢复——dump和restore命令
  11. AUTOCAD——拉伸
  12. MySQL必知必会——数据库基础知识和MySQL基本使用
  13. IMD下载软件的使用
  14. 如何自己制作图标文件
  15. js 对象解构 默认值 重命名
  16. csv文件示例_自己动手? -一个简单的CSV解析器示例
  17. 富不过三代已成过去,解答为什么越有钱的越有钱?
  18. 数字电路中的基础电路结构
  19. 加密流量也能识别与管控,绿网借至强AI加速能力打造高效智能DPI方案
  20. mysql无法停止slave_遇到诡异的问题 stop slave 无法停止

热门文章

  1. Linux core dumps 的生成
  2. Web开发中,使用表格来展示每个角色对应的权限
  3. 发布一个jquery插件--在Web下输入密码时提示大写锁定键(2012-05-03 10:20最后修改)...
  4. 1011 Sticks
  5. java代码里出现中文乱码怎么解决
  6. WebApi实现验证授权Token,WebApi生成文档等
  7. win7 64下安装mysql-python报错的解决办法
  8. 如何进行网站性能优化
  9. ubuntu desktop的分辨率设置
  10. 邮件标题乱码问题解决一例