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

news2024/11/15 10:12:48

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vs配置opencv和libtorch

网上很多教程刚开始都让切release模式&#xff0c;博主最初因为没找到哪里切换&#xff0c;所以用的默认的debug模式。他们配置方法一样&#xff0c;其区别在于 Debug&#xff1a;调试版本&#xff0c;包含调试信息&#xff0c;所以容量比Release大很多&#xff0c;并且不进行任…

苹果个人证书管理

根据近日工业和信息化部发布的《工业和信息化部关于开展移动互联网应用程序备案工作的通知》&#xff0c;相信不少要进行IOS平台App备案的朋友遇到了一个问题&#xff0c;就是apple不提供云管理式证书的下载&#xff0c;也就无法获取公钥及证书SHA-1指纹。 已经上架的应用不想重…

Python leetcode 2844 生成特殊字的最少操作,力扣练习,贪心解法代码实践

今天又来练习力扣了&#xff0c;又是向大佬学习的一天&#xff0c;leetcode 2844 生成特殊字的最少操作 1.题目 给你一个下标从 0 开始的字符串 num &#xff0c;表示一个非负整数。 在一次操作中&#xff0c;您可以选择 num 的任意一位数字并将其删除。请注意&#xff0c;如果…

你想来微软苏黎世混合现实研究中心学习和实习吗?

Microsoft Mixed Reality & AI Lab - Zurich 苏黎世混合现实研发中心简介 微软苏黎世混合现实与人工智能实验室概况 专注于利用计算机视觉绘制和理解环境&#xff0c;识别和跟踪相关物体&#xff0c;并帮助用户执行任务&#xff0c;构建混合现实的未来。该实验室还在探索混…

Python和Java哪个更适合后端开发?

Python和Java都是强大的后端开发语言&#xff0c;它们各自有鲜明的特点和适用场景。选择哪一个更适合后端开发&#xff0c;主要取决于具体的项目需求、团队技术栈、个人技能偏好以及长期发展考虑等因素。 下面是两者在后端开发中的优势和劣势&#xff1a; 「Python&#xff1…

OpenHarmony轻量系统开发【12】OneNET云接入

12.1 OneNET云介绍 通常来说&#xff0c;一个物联网产品应当包括设备、云平台、手机APP。我将在鸿蒙系统上移植MQTT协议、OneNET接入协议&#xff0c;实现手机APP、网页两者都可以远程&#xff08;跨网络&#xff0c;不是局域网的&#xff09;访问开发板数据&#xff0c;并控制…

端口协议(爆破、未授权)

常见端口服务及攻击方向&#xff1a; 弱口令爆破 工具&#xff1a;https://github.com/vanhauser-thc/thc-hydra hydra是一个支持多协议的自动化的爆破工具。 支持的服务、协议&#xff1a; telnet ftp pop3[-ntlm] imap[-ntlm] smb smbnt http-{head|get} http-{get|post}-…

xAI发布Grok-1.5V,多模态AI震撼登场!

xAI发布Grok-1.5 视觉预览AI软件 前言 就在最近&#xff0c;马斯克旗下的xAI隆重推出他们的第一代多式联运型号Grok-1.5V。这款AI产品的性能到底怎样&#xff1f;又能发挥什么作用&#xff1f;我们接着往下看。 介绍Grok-1.5 xAI表示&#xff0c;Grol-1.5这款AI不仅拥有着强大的…

SpringBoot启动时banner设置

SpringBoot启动时banner设置 1.操作步骤2.各种banner图像 1.操作步骤 在application.properties文件中设置新的banner对于的文件位置&#xff0c;最好放在resources目录下 spring.banner.locationbanner.txt2.各种banner图像 &#xff08;1&#xff09;经典大佛图 具体txt文…

OpenHarmony开发案例:【电影卡片】

介绍 本篇Codelab基于元服务卡片的能力&#xff0c;实现带有卡片的电影应用&#xff0c;介绍卡片的开发过程和生命周期实现。需要完成以下功能&#xff1a; 元服务卡片&#xff0c;用于在桌面上添加2x2或2x4规格元服务卡片。关系型数据库&#xff0c;用于创建、查询、添加、删…

数据结构从入门到实战——顺序表

目录 前言 一、顺序表的概念及结构 1.1 线性表 二、顺序表分类 三、动态顺序表的实现 3.1 顺序表结构的创建以及初始化 3.2 顺序表的销毁 3.3 顺序表的打印 3.4 尾插数据 ——最困难的 3.5 头插数据 3.6 尾删数据 3.7 头部删除数据 前言 在计算机科学和数据结…

强大的系统监测工具 iStat Menus for mac最新中文激活版

iStat Menus for Mac是一款功能强大的系统监控工具&#xff0c;专为Mac用户设计&#xff0c;旨在帮助用户全面了解电脑的运行状态&#xff0c;提高电脑的性能和稳定性。 iStat Menus for mac最新中文激活版下载 该软件可以实时监测CPU使用率、内存占用、网络速度、硬盘活动等各…

第九届少儿模特明星盛典 全球赛推广大使『费菲』精彩回顾

2024年1月30日-2月1日&#xff0c;魔都上海迎来了龙年第一场“少儿形体行业美育春晚”&#xff01;由IPA模特委员会主办的第九届少儿模特明星盛典全球总决赛圆满收官&#xff01;近2000名少儿模特选手从五湖四海而来&#xff0c;决战寒假这场高水准&#xff0c;高人气&#xff…

Harmony与Android项目结构对比

主要文件对应 Android文件HarmonyOS文件清单文件AndroidManifest.xmlmodule.json5Activity/Fragmententryability下的ts文件XML布局pages下的ets文件resresourcesModule下的build.gradleModule下的build-profile.json5gradlehvigor根目录下的build.gradle根目录下的build-profi…

pnpm 报错: ERR_PNPM_META_FETCH_FAIL

今天突然遇到一个报错&#xff0c;pnpm 报错&#xff1a; ERR_PNPM_META_FETCH_FAIL  GET https://registry.npm.taobao.org/vue%2Fcli-service: request to https://registry.npm.taobao.org/vue%2Fcli-service failed, reason: certificate has expired问题原因&#xff1a;…

国外EDM邮件群发多少钱?哪个软件好?

在当今全球化市场环境下&#xff0c;电子邮件营销作为最有效的数字营销渠道之一&#xff0c;其影响力不容忽视。而高效精准的EDM&#xff08;Electronic Direct Mail&#xff09;邮件营销策略更是企业拓展海外市场、提升品牌知名度的关键手段。云衔科技以其创新的智能EDM邮件营…

316_C++_xml文件解析成map,可以放到QT表格上, 且 xml、xlsx文件可以互相解析

xml文件例如&#xff1a; <?xml version"1.0" encoding"UTF-8" standalone"yes"?> <TrTable> <tr id"0" label"TR_PB_CH" text"CH%2"/> <tr id"4" label"TR_PB_CHN"…

新专业探路:智能视觉工程专业实验室如何建?

今日&#xff0c;“第八届全国高校电子信息类专业教学论坛”在成都圆满闭幕。整体会议聚焦人才自主培养、一流专业建设、新质课程建设&#xff0c;来自全国多所高校和企业的参会代表齐聚一堂&#xff0c;分享教育与教学成果为推动电子信息类专业建设及课程建设&#xff0c;探讨…

指针的深入理解(七)

指针的深入理解&#xff08;七&#xff09; 个人主页&#xff1a;大白的编程日记 个人专栏&#xff1a;C语言学习之路 感谢遇见&#xff0c;我们一起学习进步&#xff01; 文章目录 指针的深入理解&#xff08;七&#xff09;前言一.常量字符串指针1.1常量字符串的理解1.2常量…

UDTF函数 explode

场景&#xff1a; 原hive数据形式 split 处理到一个Array 形式 使用explode炸开后的效果是 explode结合侧面视图达到targeType 目标形式&#xff1a; 一进多出 explode 将hive 中复杂的 array 炸成多行 因为炸开后&#xff0c; movie 列值少于categoryname 列所以这里为了达到…