TestNG中的DataProviders(@DataProvider annotation)

目录

什么是数据提供者?

数据提供程序及其返回的内容

DataProvider语法

@DataProvider注释的方法可以返回什么?

使用数据提供程序的测试用例

如何在测试用例中使用数据提供程序?

其他类中的数据提供程序

在@DataProvider带注释的方法中将方法作为参数传递

使用数据提供程序并行执行

使用数据提供程序的并行执行


TestNG为我们提供了许多特性来帮助我们简化自动化测试。其中一个特性是在TestNG中使用数据提供程序。

如果你想用不同的测试数据多次运行一个测试,你必须多次复制你的测试用例,并传递不同的数据给它。这将增加维护不同测试用例的复杂性。

@Test
public void test1() {
    // with first test data
    // do something
}
 
@Test
public void test2() {
    // with second test data
    // do something
}
 
@Test
public void test3() {
    // with third test data
    // do something
}

但是使用数据提供程序,我们可以使用不同的数据集多次运行单个案例。这将使我们的案件看起来更干净,更容易维护。

这篇文章将讨论以下主题-

  • 什么是数据提供者?
  • 数据提供程序及其返回的内容
  • 使用数据提供程序的测试用例
  • 其他类中的数据提供程序
  • 在@DataProvider带注释的方法中将方法作为参数传递
  • 使用数据提供程序并行执行

让我们一个一个来看。

什么是数据提供者?

TestNG中的数据提供程序是一种将参数传递到测试方法或测试用例中的方法。数据提供程序允许我们传递复杂的参数或复杂的对象(从属性文件或数据库读取的对象等)。

我们可以使用数据提供程序来提供测试所需的值。Data Provider是我们类中的一个方法,它使用@DataProvider注释进行注释,并返回一个对象数组的数组,或者我们可以说是一个2D数组。

数据提供程序及其返回的内容
DataProvider语法
@DataProvider(name = "dataprovider_name")
public Object[][] dataProviderMethod() {
        return new Object[][] { { } };
}
  • 如前所述,数据提供者是一个带@DataProvider注释的方法。
  • @DataProvider annotation有一个name属性。
  • name属性的值将成为数据提供程序的名称。
  • 我们保留“dataprovider_name”作为数据提供者的名称。你可以保留任何你想要的名字。
  • 如果我们不指定name属性,那么方法的名称将自动成为数据提供者的名称。
@DataProvider
public Object[][] dataProviderMethod() {
        return new Object[][] { {  } };
}
@DataProvider注释的方法可以返回什么?

它可以有两种返回类型-

  • 一个是对象数组的数组或2维数组(Object[][])。这是创建数据提供程序时最常用的返回类型。
  • 另一个是Iterator<Object[]>。

这篇文章将只讨论2维数组。

在一个2维数组中,行数表示一个测试用例应该运行多少次,列数表示一个测试用例运行的不同测试数据。

让我们创建一个数据提供器方法,它返回一个带有一些值的2维数组。

@DataProvider(name = "dataprovider_name")
public Object[][] dataProviderMethod() {
    return new Object[][] { 
                            { "first", 2, 3 },
                            { "second", 5, 6 }, 
                            { "third", 8, 9 }, 
                            { "fourth", 11, 12 } 
                        };
}

使用上述数据提供程序的测试用例将执行4次,如行数所示。单行包含要作为测试用例参数传递的测试数据。

使用数据提供程序的测试用例

到目前为止,我们制作了一个数据提供者,但还没有使用过,所以,我们将使用上面的数据提供者制作一个测试方法。

如何在测试用例中使用数据提供程序?
  • 所有测试方法都将使用@Test注释进行注释。
  • @Test注释有一个名为“dataProvider”的属性。
  • 我们可以在该属性中提供要使用的数据提供程序的名称。
  • 2维数组列中的数据将成为我们测试用例的参数。

A test case using the data provider

整个代码应该是这样的-

import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
 
public class CodekruTest {
 
    @DataProvider(name = "dataprovider_name")
    public Object[][] dataProviderMethod() {
        return new Object[][] { 
                                { "first", 2, 3 },
                                { "second", 5, 6 }, 
                                { "third", 8, 9 }, 
                                { "fourth", 11, 12 } 
                            };
    }
     
    @Test(dataProvider = "dataprovider_name")
    public void test(String str, int a, int b) {
        System.out.println("str = " + str + ", a = " + a + ", b = " + b);
    }
}

test()方法现在将使用每行中提到的数据执行4次。下面是运行上述类后的输出。

str = first, a = 2, b = 3
str = second, a = 5, b = 6
str = third, a = 8, b = 9
str = fourth, a = 11, b = 12
PASSED: test("fourth", 11, 12)
PASSED: test("second", 5, 6)
PASSED: test("third", 8, 9)
PASSED: test("first", 2, 3)
其他类中的数据提供程序

在我们前面的例子中,测试用例和数据提供者在同一个类中,但是如果不是这样呢?如果数据提供程序在另一个类中怎么办?

下面是我们的项目结构

Demo
  |_ _ CodekruTest
  |_ _ DataProviderClass

Demo是包的名称,而CodekruTest包含测试用例,DataProviderClass包含数据提供程序。

如果数据提供程序在另一个类中,则它应满足以下条件之一,以便在另一个类的测试用例中使用。

  • @DataProvider注释的方法应该是静态的。
  • 或者,具有数据提供程序的类应该具有无参数构造函数。

如果一个方法不满足上述任何一个条件,它就不能在其他类的测试用例中用作数据提供者。

下面是我们的DataProviderClass,它有一个带@DataProvider注释的静态方法。

public class DataProviderClass {
     
    @DataProvider(name = "dataprovider_name")
    public static Object[][] dataProviderMethod() {
        return new Object[][] { 
                                { "first", 2, 3 },
                                { "second", 5, 6 }, 
                                { "third", 8, 9 }, 
                                { "fourth", 11, 12 } 
                            };
    }
     
}

使用上述数据提供程序的测试用例现在必须使用数据提供程序名称来提及数据提供程序类,如下所示。

@Test(dataProvider = "dataprovider_name", dataProviderClass = Demo.DataProviderClass.class)
public void test(String str, int a, int b) {
}

“dataProviderClass”属性采用实际数据提供程序方法所在的类名。

类名通常采用语法packageName1.packageName2.ClassName.class。在我们的例子中,类位于Demo包下,所以我们编写了Demo.DataProviderClass.class。

这是我们两个类。

public class CodekruTest {
 
@Test(dataProvider = "dataprovider_name", dataProviderClass = Demo.DataProviderClass.class)
    public void test(String str, int a, int b) {
        System.out.println("str = " + str + ", a = " + a + ", b = " + b);
    }
}
public class DataProviderClass {
     
    @DataProvider(name = "dataprovider_name")
    public static Object[][] dataProviderMethod() {
        return new Object[][] { 
                                { "first", 2, 3 },
                                { "second", 5, 6 }, 
                                { "third", 8, 9 }, 
                                { "fourth", 11, 12 } 
                            };
    }
     
}

在执行CodekruTest类的测试用例后,我们将得到以下结果。

str = first, a = 2, b = 3
str = second, a = 5, b = 6
str = third, a = 8, b = 9
str = fourth, a = 11, b = 12
PASSED: test("fourth", 11, 12)
PASSED: test("second", 5, 6)
PASSED: test("third", 8, 9)
PASSED: test("first", 2, 3)

我们得到了和之前一样的结果。

在@DataProvider带注释的方法中将方法作为参数传递

到目前为止,我们还没有在@DataProvider注释的方法中传递任何参数。我们可以传递一个包含方法信息(如名称)的方法实例,并在@DataProvider注释的方法中访问它。

@DataProvider(name = "dataprovider_name")
public static Object[][] dataProviderMethod(Method method){
}

方法类属于java.lang.reflect包。

public class CodekruTest {
 
    @DataProvider(name = "dataprovider_name")
    public Object[][] dataProviderMethod(Method method) {
        System.out.println("Method name: "+method.getName());
        return new Object[][] { 
                                { "first", 2, 3 },
                                { "second", 5, 6 }, 
                                { "third", 8, 9 }, 
                                { "fourth", 11, 12 } 
                            };
    }
     
    @Test(dataProvider = "dataprovider_name")
    public void test1(String str, int a, int b) {
        System.out.println("str = " + str + ", a = " + a + ", b = " + b);
    }
     
    @Test(dataProvider = "dataprovider_name")
    public void test2(String str, int a, int b) {
        System.out.println("str = " + str + ", a = " + a + ", b = " + b);
    }
}

执行上述方法后的输出-

Method name: test1
str = first, a = 2, b = 3
str = second, a = 5, b = 6
str = third, a = 8, b = 9
str = fourth, a = 11, b = 12
Method name: test2
str = first, a = 2, b = 3
str = second, a = 5, b = 6
str = third, a = 8, b = 9
str = fourth, a = 11, b = 12

我们可以看到方法名打印在这里。Method类提供了许多有用的方法,您可以根据需要使用它们。

使用数据提供程序并行执行

我们可以使用数据提供程序在不同的数据集上多次执行单个测试用例。默认情况下,数据提供程序将连续运行每个用例,这意味着直到最后一个用例没有完成,测试用例才会开始执行。

但是,如果我们谈论的是多个案例,执行所有案例可能需要时间。因此,为了加快执行速度,我们可以并行运行数据提供程序,这样2D数组的每一行都将并行运行。

使用数据提供程序的并行执行

我们必须使用@DataProvider注释的parallel属性,值为“true”。

@DataProvider(name = "dataprovider_name", parallel = true)
public Object[][] dataProviderMethod() {
   return new Object[][] {{}};
}

这将并行处理这些案件。默认情况下,它可以并行运行10个案例。

如果我们想覆盖默认行为,我们必须在testng.xml文件中用“data-provider-thread-count”属性定义它。

下面是XML文件,其中我们将“data-provider-thread-count”值保持为2,这将只并行运行2个案例。

<suite name="codekru"  data-provider-thread-count = "2">
    <test name="codekruTest">
        <classes>
            <class name="Demo.CodekruTest" />
        </classes>
    </test>
</suite> 

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

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

相关文章

深度强化学习(王树森)笔记11

深度强化学习&#xff08;DRL&#xff09; 本文是学习笔记&#xff0c;如有侵权&#xff0c;请联系删除。本文在ChatGPT辅助下完成。 参考链接 Deep Reinforcement Learning官方链接&#xff1a;https://github.com/wangshusen/DRL 源代码链接&#xff1a;https://github.c…

植物病害检测YOLOV8,OPENCV调用

【免费】植物病害检测&#xff0c;10种类型&#xff0c;YOLOV8训练&#xff0c;转换成ONNX&#xff0c;OPENCV调用资源-CSDN文库 植物病害检测&#xff0c;YOLOV8NANO&#xff0c;训练得到PT模型&#xff0c;然后转换成ONNX&#xff0c;OPENCV的DNN调用&#xff0c;支持C,PYTH…

算法——线性代数——逆序数奇偶

一、逆序数奇偶 分析&#xff1a; 概念&#xff1a; 求一个排列的逆序数奇偶性有两种方法&#xff0c;一种是从前往后遍历数组&#xff0c;另一种是从后往前遍历数组从前往后时&#xff0c;当前数字前面大于它的数字的个数即为它的逆序数个数从后往前时&#xff0c;当前数字前…

Docker的使用方式

一、Docker概念 Docker类似于一个轻量的虚拟机。 容器和镜像是Docker中最重要的两个概念&#xff0c;镜像可以保存为tar文件&#xff0c;Dockerfile是配置文件&#xff0c;仓库保存了很多第三方已经做好的镜像。 基本指令 查找镜像 docker search nginx 拉取nginx镜像 do…

Yalmip学习笔记

这里写自定义目录标题 基本用法变量定义关于大MBilevel programming 注&#xff1a;这篇文章主要是留给自己查漏补缺的&#xff0c;所以从来没有使用过yalmip的读者看着会觉得跳来跳去。 基本用法 建模开始前&#xff0c;使用yalmip(clear)清空Yalmip的内部数据库。 下面是一个…

少儿编程教育:培养未来创新者

在这个数字化飞速发展的时代&#xff0c;编程已经成为了一门新的通用语言。随着科技的不断进步&#xff0c;编程教育正逐渐从高等教育领域向中小学乃至幼儿园渗透。6547网认为少儿编程不仅是一种技能的培养&#xff0c;更是对孩子们逻辑思维、解决问题能力和创造力的锻炼。图形…

Spring 中获取 Bean 对象的三种方式

目录 1、根据名称获取Bean 2、根据Bean类型获取Bean 3、根据 Bean 名称 Bean 类型来获取 Bean&#xff08;好的解决方法&#xff09; 假设 Bean 对象是 User&#xff0c;并存储到 Spring 中&#xff0c;注册到 xml 文件中 public class User {public String sayHi(){retur…

Mac安装及配置MySql及图形化工具MySQLworkbench安装

Mac下载配置MySql mysql下载及安装 下载地址&#xff1a;https://dev.mysql.com/downloads/mysql/ 根据自己电脑确定下载x86还是ARM版本的 如果不确定&#xff0c;可以查看自己电脑版本&#xff0c;终端输入命令 uname -a 点击Download下载&#xff0c;可跳过登录注册&…

Oracle 面试题 | 01.精选Oracle高频面试题

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

python统计分析——中心极限定理

参考资料&#xff1a;用python动手学统计学 对于任意总体分布&#xff0c;样本容量越大&#xff0c;随机变量的和的分布越接近正态分布&#xff0c;这就是中心极限定理定理。 以掷硬币为例讲解。模拟投硬币1万次中&#xff0c;正面朝上的次数的分布。 import numpy as np impo…

Redis -- 开篇热身,常用的全局命令

目录 Redis重要文件 启动停止脚本 配置文件 持久化文件存储目录 核心命令 set get 全局命令 keys exists del expire ttl 过期策略是如何实现的 定时器 type 小结 Redis重要文件 启动停止脚本 /usr/bin/redis-benchmark &#xff1a; 用于对Redis做性能基准…

操作系统A-第四和五章(存储器)作业解析

目录 1、在请求分页系统中&#xff0c;某用户程序的逻辑地址空间为 16 页&#xff0c;每页 1KB&#xff0c;分配的内存空间为 8KB。假定某时刻该用户的页表如下表所示。 试问&#xff1a;(1)逻辑地址 184BH 对应的物理地址是多少&#xff1f;&#xff08;用十六进制表示&…

【个人博客搭建】Hexo安装部署

目录 一、本地构建Hexo (一) 安装前提 1. Node.js 2. Git 3. Hexo (二) 初始化Hexo 1. 初始化博客目录 2. 配置网站基本信息 (三) 主题配置 1. 选择主题 2. 下载主题 (四) 本地启动Hexo 1. 生成静态文件 2. 启动服务 二、部署 (一) 部署到Github Pages 1. 新建…

Session

Session的基本使用 1.概念 Session&#xff1a;服务端会话跟踪技术&#xff1a;将数据保存到服务端。 Session是存储在服务端而Cookie是存储在客户端 存储在客户端的数据容易被窃取和截获&#xff0c;存在很多不安全的因素 存储在服务端的数据相比于客户端来说就更安全 2…

人工智能(pytorch)搭建模型23-pytorch搭建生成对抗网络(GAN):手写数字生成的项目应用

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能(pytorch)搭建模型23-pytorch搭建生成对抗网络(GAN):手写数字生成的项目应用。生成对抗网络&#xff08;GAN&#xff09;是一种强大的生成模型&#xff0c;在手写数字生成方面具有广泛的应用前景。通过生成…

【RT-DETR有效改进】Bi-FPN高效的双向特征金字塔网络(附yaml文件+完整代码)

👑欢迎大家订阅本专栏,一起学习RT-DETR👑 一、本文介绍 本文给大家带来的改进机制是BiFPN双向特征金字塔网络,其是一种特征融合层的结构,也就是我们本文改进RT-DETR模型中的Neck部分,它的主要思想是通过多层级的特征金字塔和双向信息传递来提高精度。本文给大家带…

走迷宫-bfs

package Test;import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader;public class Main {static int N 110,hh 0,tt -1,n,m;static int[][] g new int[N][N]; //用来存储迷宫static int[][] d new int[N][N]; //用来存储d[i…

yarn 现代的包管理工具 介绍

一、前言 yarn 是一个现代的包管理工具&#xff0c;它是 npm&#xff08;Node Package Manager&#xff09;的一个替代品。yarn 由 Facebook 开发&#xff0c;并在 2016 年发布。它解决了当时 npm 的一些问题&#xff0c;尤其是在性能和安全性方面。 yarn 主要用于以下几个方面…

bat脚本:批量生成创建数据库的SQL语句

需求来源&#xff1a;使用 Navicat等数据库工具点击“转储SQL文件”会生成一个 xxx.sql 的文件&#xff0c;xxx是导出的数据库名。导出的数据库多了&#xff0c;就会一次性生成很多这样的SQL文件&#xff0c;所以需要写个脚本根据这些SQL脚本文件来批量生成创建数据库的SQL语句…

DX-11A DC0.075A 型信号继电器 柜内安装,板前接线

DX-11信号继电器&#xff1b; DX-11A信号继电器&#xff1b; DX-11B信号继电器&#xff1b; DX-11C信号继电器&#xff1b; DX-11Q信号继电器&#xff1b; DX-11A/Q信号继电器&#xff1b; DX-11B/Q信号继电器&#xff1b; DX-11C/Q信号继电器&#xff1b; 一. 用途 DX-11/0.…