testNG-@Factory详解+demo

news/2024/12/2 11:33:17/

@Factory详解

  • 简介
  • 策略:
  • 实例:

简介

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

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

策略:

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

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

  1. @Factory必须放在一个返回对象数组的顶部,所有的这些对象都包含测试类的实例,testng会确保@Factory只被调用一次;
  2. @Factory方法是首先被调用的,在@Test方法和配置方法之前,只有当所有的@Factory方法被调用之后,testng才开始执行配置和测试方法;
  3. @Factory允许在运行时动态测试。

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

实例:

被测试类Person:

publicclass Person {String name;int age;@Parameters({"name","age"})publicPerson(String name,int age) {super();this.name = name;this.age = age;}@Test()publicvoid say() {System.out.print("我是"+name+" ");if(age<18){System.out.println("我未成年");}elseif(age>=18&&age<=45){System.out.println("我是青年人");}elseif(age>45&&age<=60){System.out.println("我是中年人");}elseif(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="hongge.Person" /></classes></test><test name="Test2"><parameter name="name" value="宏哥" /><parameter name="age" value="20" /><classes><class name="hongge.Person" /></classes></test><test name="Test3"><parameter name="name" value="刘创" /><parameter name="age" value="50" /><classes><class name="hongge.Person" /></classes></test><test name="Test4"><parameter name="name" value="爷爷" /><parameter name="age" value="70" /><classes><class name="hongge.Person" /></classes></test><!-- Test --></suite>

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

工厂

Factory注解

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

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

publicclass PersonFactory {@Factorypublic Object[] factory() {ArrayList testList =newArrayList<>();Person tp =newPerson("明明",10);testList.add(tp);Person tp2 =newPerson("宏哥",20);testList.add(tp2);Person tp3 =newPerson("刘创",50);testList.add(tp3);Person tp4 =newPerson("朱爷爷",70);testList.add(tp4);return testList.toArray();}}
<?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="hongge.PersonFactory" /></classes></test><!-- Test --></suite> <!-- Suite -->

使用@Factory的运行原理

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

2、使用了@Factory后,可以看到被@Factory标注的方法返回了一个Object数组,数组中每一个元素是一个被测试类的对象。也就是说@Factory构造了多个被测试类对象,然后把每一个对象都传递给了TestNG框架,然后TestNG框架在分别执行这些对象中被@Test标注的方法。


http://www.ppmy.cn/news/1082170.html

相关文章

【typeof instanceof Object.prototype.toString constructor区别】

几个数据类型判断区别 typeofinstanceofObject.prototype.toStringconstructor typeof 它返回的是一个字符串&#xff0c;表示未经过计算的操作数的类型 typeof(undefined) //"undefined"typeof(null) //"object"typeof(100) //"number"typeof…

Neo-reGeorg隧道搭建

目录 Neo-regeorg前言 环境搭建 具体使用 kail安装Neo-reGeorg kail内生成webshell并设置密码 kail与win10连接 windows server内打开服务 kail虚拟机访问windows server以及所在的内网 Neo-regeorg前言 regeorg为reDuh的升级版&#xff0c;主要功能就是把内网服务器的…

vue3 常见的警告记录

1. [Vue warn]: Invalid prop: type check failed for prop "stretch". Expected Boolean, got String with value "true". 解决办法&#xff1a;<el-tabs stretch"true"></el-tabs> 里的strech前面加上&#xff1a;即可 正确&…

【图像分割】实战篇(1)传统图像分割

聚类图像分割 K均值聚类是一种常用的聚类算法&#xff0c;它将图像像素分为K个不同的群集&#xff0c;以使每个群集内的像素具有相似的颜色或强度。这可以用于分割具有不同颜色或亮度的对象。 import numpy as np import matplotlib.pyplot as plt from sklearn.cluster impo…

博客系统后台前端UI设计

效果展示 API编写 index.js import axios from "./request"const fastdfs {delete: file/fastdfs/delete } const permission {search: "/sys/permission/search",add: "/sys/permission/add",update: "/sys/permission/update",d…

【Day-26慢就是快】代码随想录-二叉树-对阵二叉树

给定一个二叉树&#xff0c;检查它是否是镜像对称的。 —————————————————————————————————————————— 分析&#xff1a; 需要比较的是根节点的左右子树&#xff0c;且是两个子树的里侧和外侧的元素是否相等。 根据后序遍历算法&…

鉴源论坛 · 观模丨基于应用程序编程接口(API)的自动化测试(上)

作者 | 黄杉 华东师范大学软件工程学院博士 苏亭 华东师范大学软件工程学院教授 版块 | 鉴源论坛 观模 社群 | 添加微信号“TICPShanghai”加入“上海控安51fusa安全社区” 01 应用程序编程接口&#xff08;API&#xff09; 应用程序编程接口&#xff0c;英文全称为Applica…

【Java核心知识】ThreadLocal相关知识

ThreadLocal 什么是ThreadLocal ThreadLoacal类可以为每个线程保存一份独有的变量&#xff0c;该变量对于每个线程都是独占的。实现原理为每个Thread类中包含一个ThreadHashMap&#xff0c;key为变量的name&#xff0c;value为变量的值。 在日常使用中&#xff0c;我们可以通…