简介

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

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

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

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

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

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

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

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

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

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

实例

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

被测试类Person:

参考代码:

  1. package hongge;
  2. /**
  3. * @author 北京-宏哥
  4. *
  5. * Java自动化测试框架-07 - TestNG之Factory篇
  6. *
  7. * 2019年11月6日
  8. */
  9. import org.testng.annotations.Parameters;
  10. import org.testng.annotations.Test;
  11.  
  12. public class Person {
  13. String name;
  14. int age;
  15.  
  16. @Parameters({"name","age"})
  17. public Person(String name, int age) {
  18. super();
  19. this.name = name;
  20. this.age = age;
  21. }
  22.  
  23. @Test()
  24. public void say() {
  25. System.out.print("我是"+name+" ");
  26. if(age<18){
  27. System.out.println("我未成年");
  28. }else if(age>=18&&age<=45){
  29. System.out.println("我是青年人");
  30. }else if(age>45&&age<=60){
  31. System.out.println("我是中年人");
  32. }else if(age>60){
  33. System.out.println("我是老年人");
  34. }
  35. }
  36. }

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

TestNG配置文件

参考代码

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
  3. <suite name="Suite">
  4. <test name="Test1">
  5. <parameter name="name" value="小明" />
  6. <parameter name="age" value="10" />
  7. <classes>
  8. <class name="hongge.Person" />
  9. </classes>
  10. </test>
  11. <test name="Test2">
  12. <parameter name="name" value="宏哥" />
  13. <parameter name="age" value="20" />
  14. <classes>
  15. <class name="hongge.Person" />
  16. </classes>
  17. </test>
  18. <test name="Test3">
  19. <parameter name="name" value="刘创" />
  20. <parameter name="age" value="50" />
  21. <classes>
  22. <class name="hongge.Person" />
  23. </classes>
  24. </test>
  25. <test name="Test4">
  26. <parameter name="name" value="爷爷" />
  27. <parameter name="age" value="70" />
  28. <classes>
  29. <class name="hongge.Person" />
  30. </classes>
  31. </test><!-- Test -->
  32. </suite> <!-- Suite -->

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

工厂

Factory注解

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

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

新类PersonFactory

参考代码

  1. package hongge;
  2.  
  3. import java.util.ArrayList;
  4.  
  5. import org.testng.annotations.Factory;
  6.  
  7. /**
  8. * @author 北京-宏哥
  9. *
  10. * Java自动化测试框架-07 - TestNG之Factory篇
  11. *
  12. * 2019年11月6日
  13. */
  14. public class PersonFactory {
  15. @Factory
  16. public Object[] factory() {
  17. ArrayList<Person> testList = new ArrayList<>();
  18. Person tp = new Person("明明",10);
  19. testList.add(tp);
  20. Person tp2 = new Person("宏哥",20);
  21. testList.add(tp2);
  22. Person tp3 = new Person("刘创",50);
  23. testList.add(tp3);
  24. Person tp4 = new Person("朱爷爷",70);
  25. testList.add(tp4);
  26. return testList.toArray();
  27. }
  28. }

运行时,可以在Eclipse中,在这个factory类(PersonFactory)上点击右键,Run As-> TestNg test执行,

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

testng.xml

参考代码

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
  3. <suite name="Suite">
  4. <test name="Test1">
  5. <classes>
  6. <class name="hongge.PersonFactory" />
  7. </classes>
  8. </test><!-- Test -->
  9. </suite> <!-- Suite -->

运行结果

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

<class name="WebTestFactory"/>

工厂方法可以接受诸如 @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自动化测试框架-02 - TestNG之理论实践 - 纸上得来终觉浅,绝知此事要躬行(详细教程)

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

  3. Java自动化测试框架-02 - TestNG之理论到实践

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

  4. Java自动化测试框架-04 - TestNG之Test Method篇 - 道法自然,法力无边(详细教程)

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

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

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

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

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

  7. 《手把手教你》系列基础篇(八十一)-java+ selenium自动化测试-框架设计基础-TestNG如何暂停执行一些case(详解教程)

    1.简介 在实际测试过程中,我们经常会遇到这样的情况,开发由于某些原因导致一些模块进度延后,而你的自动化测试脚本已经提前完成,这样就会有部分模块测试,有部分模块不能进行测试.这就需要我们暂时不让一些t ...

  8. Java自动化测试框架-03 - TestNG之Test Group篇 - 我们一起组团打怪升级(详细教程)

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

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

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

随机推荐

  1. opencv之为图像添加边界

    我们经常会有对图像边缘做扩展的需求.比如 希望卷积后得到的矩阵大小不变 希望改变图像大小,但是不改变宽高比 opencv实现 opencv中使用copyMakeBorder()来完成这一功能 api ...

  2. SpringBoot2+Netty打造通俗简版RPC通信框架(升级版)

    背景         上篇文章我简单的介绍了自己打造的通俗简版RPC通信框架,这篇是对简版的增强~         如果大家对此项目还感兴趣的话,可到码云上瞄瞄:Netty-RPC         上 ...

  3. Flutter学习笔记(29)--Flutter如何与native进行通信

    如需转载,请注明出处:Flutter学习笔记(29)--Flutter如何与native进行通信 前言:在我们开发Flutter项目的时候,难免会遇到需要调用native api或者是其他的情况,这时 ...

  4. 05-03 主成分分析(PCA)

    目录 主成分分析(PCA) 一.维数灾难和降维 二.主成分分析学习目标 三.主成分分析详解 3.1 主成分分析两个条件 3.2 基于最近重构性推导PCA 3.2.1 主成分分析目标函数 3.2.2 主 ...

  5. 初探内核之《Linux内核设计与实现》笔记上

    内核简介  本篇简单介绍内核相关的基本概念. 主要内容: 单内核和微内核 内核版本号 1. 单内核和微内核   原理 优势 劣势 单内核 整个内核都在一个大内核地址空间上运行. 1. 简单.2. 高效 ...

  6. 【POJ2001】Shortest Prefixes

    Shortest Prefixes Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 18724   Accepted: 810 ...

  7. 计算机网络知识点总结2:IP协议(IPV4)

    一.Internet网络是一种数据报网络(另一种是虚电路网络,用于ATM等),主要功能是路由和转发. 二.IP数据报(分组)格式(IPV4版本) 首部 描述 版本号(4bit) 描述IP协议的版本号, ...

  8. 不得不看的秘诀,如何成为一名合格的web前端工程师

    何为:前端工程师? 前端工程师,也叫Web前端开发工程师.他是随着web发展,细分出来的行业. Web前端开发技术主要包括三个要素:HTML.CSS和JavaScript! 它要求前端开发工程师不仅要 ...

  9. css 块元素超出文字省略表示

    .text-omit{ white-space: nowrap; text-overflow: ellipsis; overflow: hidden; } 只对块元素的设置有效 . 块元素和行内元素见 ...

  10. DP题 总结 [更新中]

    建设中 ... 预防针 : 本蒟蒻代码风格清奇(⊙﹏⊙)b 一.选学霸 题目描述 老师想从N名学生中选M人当学霸,但有K对人实力相当,如果实力相当的人中,一部分被选上,另一部分没有,同学们就会抗议.所 ...