Testng测试框架(6)--@Factory动态地创建测试类的实例

工厂允许您动态地创建测试。例如,假设您想创建一个测试方法,该方法将多次访问网站上的某个页面,并且您希望使用不同的值来调用它。

public class TestWebServer {
  @Test(parameters = { "number-of-times" })
  public void accessPage(int numberOfTimes) {
    while (numberOfTimes-- > 0) {
     // access the web page
    }
  }
}
<test name="T1">
  <parameter name="number-of-times" value="10"/>
  <classes>
    <class name= "TestWebServer" />
  </classes>
</test>

<test name="T2">
  <parameter name="number-of-times" value="20"/>
  <classes>
    <class name= "TestWebServer"/>
  </classes>
</test>

<test name="T3">
  <parameter name="number-of-times" value="30"/>
  <classes>
    <class name= "TestWebServer"/>
  </classes>
</test>

这种方法很快就会没办法管理,所以,你可以使用工厂方法。

public class WebTestFactory {
  @Factory
  public Object[] createInstances() {
   Object[] result = new Object[10];
   for (int i = 0; i < 10; i++) {
      result[i] = new WebTest(i * 10);
    }
    return result;
  }
}

现在test class是

public class WebTest {
  private int m_numberOfTimes;
  public WebTest(int numberOfTimes) {
    m_numberOfTimes = numberOfTimes;
  }

  @Test
  public void testServer() {
   for (int i = 0; i < m_numberOfTimes; i++) {
     // access the web page
    }
  }
}

Your testng.xml only needs to reference the class that contains the factory method, since the test instances themselves will be created at runtime:

<class name="WebTestFactory" />

Or, if building a test suite instance programmatically, you can add the factory in the same manner as for tests:

TestNG testNG = new TestNG();
testNG.setTestClasses(WebTestFactory.class);
testNG.run();

The factory method can receive parameters just like @Test and @Before/@After and it must return Object[]. The objects returned can be of any class (not necessarily the same class as the factory class) and they don’t even need to contain TestNG annotations (in which case they will be ignored by TestNG).

工厂也可以与数据提供者一起使用,您可以通过将 @Factory 注解放在普通方法或构造函数上来利用这一功能

@Factory(dataProvider = "dp")
public FactoryDataProviderSampleTest(int n) {
  super(n);
}
@DataProvider
static public Object[][] dp() {
  return new Object[][] {
    new Object[] { 41 },
    new Object[] { 42 },
  };
}

这个例子使TestNG创建两个test classes,构造方法分别使用值41和42。

The example will make TestNG create two test classes, on with the constructor invoked with the value 41 and the other with 42.

,当使用 @Factory 注解时,您可以选择性地为数据提供者指定索引。当指定了索引时,只有位于这些指定索引位置的元素才会作为参数传递给带有 @Factory 注解的构造函数。

@Factory(dataProvider = "dp", indices = {1, 3})
public ExampleTestCase(String text) {
  this.i = i;
}

@DataProvider(name = "dp")
public static Object[] getData() {
  return new Object[]{
      "Java", "Kotlin", "Golang", "Rust"
  };
}

在这个例子中, 值Kotlin (2nd element) 和 Rust (4th element) 被作为参数传给@Factory标记的构造方法,创建了2个ExampleTestCase实例。

示例1

工厂可以与数据提供者一起使用,您可以通过将 @Factory 注解放在普通方法或构造函数上来利用这一功能。以下是一个使用构造函数工厂的示例:

import org.testng.annotations.DataProvider;
import org.testng.annotations.Factory;
import org.testng.annotations.Test;

public class WebPageTest {

    private String url;

    @Factory(dataProvider = "pageUrls")
    public WebPageTest(String url) {
        this.url = url;
    }

    @Test
    public void testPage() {
        // 在这里编写访问网页并验证其内容的逻辑
        System.out.println("Testing page: " + url);
        // 假设这里有一些验证逻辑
        // ...
    }

    @DataProvider(name = "pageUrls")
    public static Object[][] providePageUrls() {
        return new Object[][] {
                {"http://example.com/page1"},
                {"http://example.com/page2"},
                {"http://example.com/page3"}
        };
    }
}

在这里插入图片描述

在这个例子中,我们定义了一个 WebPageTest 类,它包含一个构造函数,该构造函数接受一个 url 字符串作为参数。我们在构造函数上使用了 @Factory 注解,并指定了 dataProvider = "pageUrls"。这意味着 TestNG 将使用 providePageUrls 数据提供者返回的数据来动态创建 WebPageTest 类的实例。

数据提供者 providePageUrls 返回了一个包含多个 URL 的数组。对于数组中的每个 URL,TestNG 都会调用 WebPageTest 的构造函数来创建一个新的实例,并将 URL 传递给构造函数。

然后,对于每个创建的 WebPageTest 实例,TestNG 会自动执行 testPage 测试方法。由于每个实例都有自己的 url 成员变量,因此每个实例的测试将针对不同的 URL 进行。

这种使用工厂和数据提供者的方式非常灵活,它允许您根据动态生成的数据集创建多个测试实例,并对每个实例执行相同的测试逻辑。这对于需要针对不同输入数据运行相同测试的场景特别有用,比如测试网站的不同页面或不同配置下的功能。

示例2

在 TestNG 中,@Factory 注解用于动态地创建测试类的实例。当你想要根据一系列不同的参数或数据集来创建多个测试实例时,这个注解非常有用。每个实例都会执行类中定义的测试方法。

以下是如何在 TestNG 中使用 @Factory 注解的基本步骤:

  1. 定义一个测试类:这个类包含了你想要执行的测试方法。

  2. 添加一个带有 @Factory 注解的静态方法:这个方法用于创建测试类的实例。它通常接受一个或多个参数,这些参数由数据提供者方法提供。

  3. 编写一个数据提供者方法:这个方法使用 @DataProvider 注解标记,并返回一个对象数组,用于为 @Factory 方法提供参数。

下面是一个简单的例子,展示了如何使用 @Factory@DataProvider 来动态创建测试实例:

import org.testng.annotations.DataProvider;  
import org.testng.annotations.Factory;  
import org.testng.annotations.Test;  
  
public class DynamicTestExample {  
  
    private String testData;  
  
    public DynamicTestExample(String testData) {  
        this.testData = testData;  
    }  
  
    @Test  
    public void testMethod() {  
        System.out.println("Executing test with data: " + testData);  
        // 在这里编写你的测试逻辑  
    }  
  
    @DataProvider(name = "testDataProvider")  
    public static Object[][] provideTestData() {  
        return new Object[][]{  
                {"Data1"},  
                {"Data2"},  
                {"Data3"}  
        };  
    }  
  
    @Factory(dataProvider = "testDataProvider")  
    public static Object[] createInstances(String testData) {  
        return new Object[]{new DynamicTestExample(testData)};  
    }  
}

在这个例子中:

  • DynamicTestExample 是测试类,它有一个构造函数接受一个 String 类型的参数 testData
  • testMethod 是测试方法,它使用构造函数中传递的 testData 执行一些测试逻辑。
  • provideTestData 是一个数据提供者方法,它返回一个二维数组,包含三个字符串元素。
  • createInstance 是一个带有 @Factory 注解的静态方法。它接受一个字符串参数,并使用这个参数创建一个 DynamicTestExample 的实例。@Factory 注解中的 dataProvider 属性指向了数据提供者方法 provideTestData

当 TestNG 运行这个测试类时,它会:

  1. 调用 provideTestData 方法来获取数据。
  2. 对于数据提供者返回的每一行数据,调用 createInstance 方法来创建一个新的 DynamicTestExample 实例。
  3. 对于每个创建的实例,执行 testMethod 方法。

这样,你就能够基于不同的数据集动态地创建和执行多个测试实例了。每个实例都会使用不同的 testData 值来执行 testMethod

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/536178.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++题解】1605. 求一个两位数的个位和十位的和

问题&#xff1a;1605. 求一个两位数的个位和十位的和 类型&#xff1a;基本运算、拆位求解。 题目描述&#xff1a; 从键盘读入一个两位的整数 n &#xff0c;请求出这个两位整数个位和十位的和是多少&#xff1f; 输入&#xff1a; 一个两位的整数 n 。 输出&#xff1a…

hbase基础shell用法

HBase中用create命令创建表&#xff0c;具体如下&#xff1a; create student,Sname,Ssex,Sage,Sdept,course 此时&#xff0c;即创建了一个“student”表&#xff0c;属性有&#xff1a;Sname,Ssex,Sage,Sdept,course。因为HBase的表中会有一个系统默认的属性作为行键&#x…

【MySQL】事务篇

SueWakeup 个人主页&#xff1a;SueWakeup 系列专栏&#xff1a;学习技术栈 个性签名&#xff1a;保留赤子之心也许是种幸运吧 目录 本系列专栏 1. 什么是事务 2. 事务的特征 原子性&#xff08;Atomicity&#xff09; 一致性&#xff08;Consistency&#xff09; 隔离性&…

255Mesh 无线lora模块详细配置和测试

一、型号介绍 字符含义&#xff1a; E&#xff1a;终端 N&#xff1a;节点&#xff08;node&#xff09; G&#xff1a;网关 &#xff08;gateway&#xff09; 官网淘宝介绍 注意&#xff1a;组网必须配网关。 二、功能配置 软件界面 1.网络参数 网络参数包括网络 ID&a…

华为OD技术面试-有序数组第K最小值

背景 2024-03-15华为od 二面&#xff0c;记录结题过程 有序矩阵中第 K 小的元素 - 力扣&#xff08;LeetCode&#xff09; https://leetcode.cn/problems/kth-smallest-element-in-a-sorted-matrix/submissions/512483717/ 题目 给你一个 n x n 矩阵 matrix &#xff0c;其…

FPGA基于VCU的H265视频压缩,HDMI2.0输入,支持4K60帧,提供工程源码+开发板+技术支持

目录 1、前言免责声明 2、相关方案推荐我这里已有的视频图像编解码方案 3、详细设计方案设计框图FPGA开发板视频输入Video PHY ControllerHDMI 1.4/2.0 Receiver SubsystemVideo Processing SubsystemVideo Frame Buffer WriteZynq UltraScale VCUPetaLinux 系统制作VLC播放器工…

ubuntu安装irtualbox注意事项

下载官网7.0版本&#xff0c;ubuntu22.04,安装一直出错误&#xff0c;查到了下面兄弟的办法&#xff0c;仍然不幸&#xff0c;最后使用apt重装&#xff0c;请按第二部分流程安装&#xff0c;安装6.1,可以用 第一部分&#xff0c;反正我是没搞通&#xff0c;7.0反复的出现相同的…

在 Leetcode 上使用 Javascript 查找数组中的所有重复项(使用 JS 的 DSA)

在本篇博客文章中&#xff0c;我们将探讨如何在数组中找出所有重复的元素&#xff0c;这个问题源自LeetCode上的一个问题。 问题描述&#xff1a; 我们有一个包含n个整数的数组&#xff0c;所有整数都在范围[1, n]内。每个整数要么出现一次&#xff0c;要么出现两次。任务是找…

第8章 项目整合管理

子过程&#xff1a;为创建预定的产品、服务或成果而执行的一系列相互关联的行动和活动&#xff1b; 既属于某一过程组&#xff08;启动、规划、执行、监控、收尾&#xff09;又属于某一知识领域&#xff08;整合、范围、进度、成本、质量、资源、采购、沟通、干系人、风险&…

5G智慧水利数字孪生可视化平台,推进水利行业数字化转型

5G智慧水利数字孪生可视化平台&#xff0c;推进水利行业数字化转型。随着5G技术的快速发展&#xff0c;越来越多的行业开始探索数字化转型的道路。水利行业作为国民经济的重要支柱&#xff0c;也面临着数字化转型的迫切需求。5G智慧水利数字孪生可视化平台作为水利行业数字化转…

数据安全之路:Databend 用户与角色管理应用

Databend 目前支持基于角色的访问控制 (RBAC) 和 自主访问控制 (DAC) 模型&#xff0c;用于访问控制功能。 通过本指南&#xff0c;我们会了解权限和角色在 Databend 中的基本概念&#xff0c;以及如何管理角色、继承角色与建立层级、设置默认角色以及所有权的重要性。这些功能…

活动预告|NineData 创始人CEO叶正盛将参加QCon全球软件开发大会,共话AI大模型技术在数据库DevOps的实践

4月13日下午&#xff0c;NineData创始人&CEO叶正盛即将参加InfoQ中国主办的『QCon全球软件开发大会北京站』的技术大会。在本次技术峰会上&#xff0c;叶正盛将以《AI大模型技术在数据库DevOps的实践》为主题&#xff0c;深入剖析AI大模型技术在数据库DevOps领域的最新进展…

逆向案例二十一——遇到混淆怎么办

开始新的板块尝试&#xff0c;混淆了怎么办 网址&#xff1a;极简壁纸_海量电脑桌面壁纸美图_4K超高清_最潮壁纸网站 抓包抓到&#xff0c;好久没做解密了&#xff0c;奥里给干他&#xff01;&#xff1a; 搜索关键字&#xff0c;打上断点&#xff0c;点击第二页。 _0x10a345…

SOLIDOWRKS怎么将中间格式的模具装配体转化为装配体格式

模具是工业生产中用于制作成型物品的工具&#xff0c;它由各种零件构成&#xff0c;可以通过改变所成型材料的物理状态来实现物品外形的加工。如果工程师已经有其他格式的模具装配体&#xff0c;但是又想将其他格式的模具装配体导入solidworks里面&#xff0c;并且将一个个实体…

rust wasm入门

&#x1f4d5;作者简介&#xff1a; 过去日记&#xff0c;致力于Java、GoLang,Rust等多种编程语言&#xff0c;热爱技术&#xff0c;喜欢游戏的博主。 &#x1f4d8;相关专栏Rust初阶教程、go语言基础系列、spring教程等&#xff0c;大家有兴趣的可以看一看 &#x1f4d9;Jav…

SpringBoot修改菜品模块开发

需求分析与设计 一&#xff1a;产品原型 在菜品管理列表页面点击修改按钮&#xff0c;跳转到修改菜品页面&#xff0c;在修改页面回显菜品相关信息并进行修改&#xff0c;最后点击保存按钮完成修改操作。 修改菜品原型&#xff1a; 二&#xff1a;接口设计 通过对上述原型图…

图像处理与视觉感知---期末复习重点(7)

文章目录 一、图像压缩1.1 三种冗余1.2 模型1.3 信息测量 二、无误差压缩2.1 哈夫曼编码2.1.1 步骤2.1.2 例题 2.2 算术编码 三、变换编码 一、图像压缩 1.1 三种冗余 1. 三种基本的是数据冗余为&#xff1a;编码冗余、像素间冗余、心理视觉冗余。 2. 编码冗余&#xff1a;如果…

在线拍卖系统|基于Springboot的在线拍卖系统设计与实现(源码+数据库+文档)

在线拍卖系统目录 基于Springboot的在线拍卖系统设计与实现 一、前言 二、系统设计 三、系统功能设计 1、前台&#xff1a; 2、后台 用户功能模块 5.2用户功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a…

个人博客系统项目(SpringBoot+Linux部署上线)

在学完SpringBoot框架、MyBatis后&#xff0c;直接开始做第一个项目&#xff1a;博客系统 首先&#xff0c;该博客系统包含核心功能有&#xff1a; 一、登录、注册、退出登录功能。 二、没有登陆前可以查看博客首页以及博客展示的分页处理&#xff0c;以及点击查看博客可以…

ELK-Kibana 部署

目录 一、在 node1 节点上操作 1.1.安装 Kibana 1.2.设置 Kibana 的主配置文件 1.3.启动 Kibana 服务 1.4.验证 Kibana 1.5.将 Apache 服务器的日志&#xff08;访问的、错误的&#xff09;添加到 ES 并通过 Kibana 显示 1.6. 浏览器访问 二、部署FilebeatELK&…