为什么要使用DataProvider

  1. DataProvider可以实现类似Factory的数据驱动的测试,而且使用DataProvider的时候,被测试方法所在的类只被创建一次,只是方法被调用多次,所以比较省时省力
  2. DataProvider还可以实现懒加载,在需要测试大量数据的时候可以一条一条的加载数据,而不需要一次性把数据加载到内存中,避免了内存的浪费,和可能的内存不够用的危险

DataProvider的常规用法

  1. 定义一个函数,函数名随意取,使用@DataProvider注解,注解中用name给这个provider起名字,该函数返回一个二维数组
  2. 该函数返回的二维数组每一行就代表一次测试的参数,每一行的元素跟Test中需要的参数一一对应(通常情况下数组类型是Object,但是可以用其他自定义类型代替)
  3. 在需要使用provider的方法的Test注解上,用provider属性指向上面的DataProvider

例子

public class TestDataProvider {

        @DataProvider(name="provider")
public Object[][] provider(){
Object [][] provider = new Object [5][2];
for (int i = 0; i < provider.length; i++) {
provider[i][0] = "name"+i;
provider[i][1] = i+10;
} return provider;
} @Test(dataProvider="provider")
public void getName(String name,int age){
System.out.println(name+"_"+age); } }

运行这个Test,输出

[TestNG] Running:
C:\Users\Administrator\AppData\Local\Temp\testng-eclipse-1631420346\testng-customsuite.xml name0_10
name1_11
name2_12
name3_13
name4_14
PASSED: getName("name0", 10)
PASSED: getName("name1", 11)
PASSED: getName("name2", 12)
PASSED: getName("name3", 13)
PASSED: getName("name4", 14) ===============================================
Default test
Tests run: 5, Failures: 0, Skips: 0
===============================================

可以看到该测试方法运行了5次,每一次都把一个DataProvider提供的数组作为自己的参数输入然后执行了测试。

带Method参数的DataProvider

如果希望DataProvider对不同的Test方法使用不同的dataprovider,那么在DataProvider中可以使用Method参数

@Test(dataProvider = "provider")
public void getFirst(String name, int age) {
System.out.println("第一组"+name);
} @Test(dataProvider = "provider")
public void getSecond(String name, int age) {
System.out.println("第二组 " + name);
} @DataProvider(name = "provider")
public Object[][] provider(Method method) {
Object[][] objects;
if (method.getName().equals("getFirst")) { //如果调用该DataProvider的函数是getFirst,那么就返回这个数组
objects = new Object[][] { { "cq1", 20 }, { "cq2", 22 } };
} else if (method.getName().equals("getSecond")) {//如果调用该DataProvider的函数是getSecond,那么就返回这个数组
objects = new Object[][] { { "cq3", 20 }, { "cq4", 22 } };
} else { //如果调用该DataProvider的函数不是getFirst也不是getSecond,那么就返回这个数组
objects = new Object[][] { {"cq5",33}, {"cq6",34} };
} return objects;
}

这里根据调用DataProvider的函数名,返回了不同的参数。

由于没有指定运行顺序,所以Test会按照字母顺序执行,先执行getFirst,然后getSecond。

执行getFirst时发现有两组参数,就先把第一组参数传进去执行一遍,再把第二组参数传进去执行一遍。

执行getSecond时也是同样的顺序,所以最后的执行顺序是

①getFirst输入第一组参数

②getFirst输入第二组参数

③getSecond输入第一组参数

④getSecond输入第二组参数

带ITestContext的DataProvider

在Dataprovider中可以带一个ITestContext 参数,从这个参数中可以获取该方法执行时的一些上下文信息,比如context.getIncludeGroups就可以得到这个测试执行的分组,这样在不同的分组中就可以可以向测试执行类传递不同的参数了。

DataProvider的其他位置

在@Test标签中使用dataProvider属性时还可以额外指定一个dataProviderClass属性,这个属性可以定义dataProvider函数的位置类,如果不指定这个属性就会在@Test所在的类中寻找dataProvider,如果指定了就会在指定的类中寻找dataProvider。指定类中的dataProvider必须是static方法。

Tips:dataProvider调用后的方法,在TestNG插件或报告中的方法名后面会显示参数值,这样当运行出现问题后就可以知道哪组参数导致程序出现了异常。

TestNG中DataProvider的用法一的更多相关文章

  1. TestNG 中DataProvider 的用法

    使用DataProvider提供数据有两种形式: 第一种:一种是在测试代码和测试数据放在同一个类中: 第二种:把所有的数据提供都单独写在一个类里面,当测试数据比较多时,这种方法利于维护. DataPr ...

  2. TestNG中DataProvider的用法二:简单的数据驱动

    @DataProvider标记的方法除了可以返回数组外,还可以返回一个Iterator,这样的好处是不用把所有的测试数据都加载到内存中,而是需要的时候就读一条. 下面的例子就使用了Iterator,然 ...

  3. testNG中dataprovider使用的两种方式

    testNG的参数化测试有两种方式:xml和dataprovider.个人更喜欢dataprovider,因为我喜欢把测试数据放在数据库里. 一.返回类型是Iterator<Object[]&g ...

  4. TestNG中DataProvider的用法

    提供数据的一个测试方法.注解的方法必须返回一个Object[] [],其中每个对象 []的测试方法的参数列表中可以分配.该@Test 方法,希望从这个 DataProvider 的接收数据,需要使用一 ...

  5. TestNG中@Factory的用法一:简单的数据驱动

    为什么要使用@Factory注解呢,先来看下面这个例子 被测试类Person package ngtest; import org.testng.annotations.Parameters; imp ...

  6. TestNG中的数据源DataProvider概述

    http://blog.csdn.net/taiyangdao/article/details/52141711 在上一篇文章中,我们知道带参数的测试方法,可以在testng.xml配置文件中为其参数 ...

  7. TestNG中的DataProvider返回Iterator<Object[]>的妙用

    TestNG中使用DataProvider有个好处,就是: 1. 在执行用例的时候dataProvider迭代中的每组数据都是作为一个用例执行 2. 在测试数据有规律的情况下,免去了添加testXML ...

  8. 简单聊聊TestNG中的并发

    前言 最近在做项目里的自动化测试工作,使用的是TestNG测试框架,主要涉及的测试类型有接口测试以及基于业务实际场景的场景化测试.由于涉及的场景大多都是大数据的作业开发及执行(如MapReduce.S ...

  9. testng使用DataProvider+Excel实现DDT

    DDT,即数据驱动测试 Data Driver Test,我曾经记录了一篇关于python的DDT框架(Excel+DDT数据驱动实例),那么java中的DDT是怎么样的呢?在java中,可以用tes ...

随机推荐

  1. Hadoop 学习之路(七)—— HDFS Java API

    一. 简介 想要使用HDFS API,需要导入依赖hadoop-client.如果是CDH版本的Hadoop,还需要额外指明其仓库地址: <?xml version="1.0" ...

  2. Adboe Flash远程代码执行_CVE-2018-4878漏洞复现

    Adboe Flash远程代码执行_CVE-2018-4878漏洞复现 一.漏洞描述 该漏洞可针对windows用户发起定向攻击.攻击者可以诱导用户打开包含恶意Flash代码文件的Microsoft ...

  3. Spring Boot2从入门到实战:统一异常处理

    都说管理的精髓就是“制度管人,流程管事”.而所谓流程,就是对一些日常工作环节.方式方法.次序等进行标准化.规范化.且不论精不精髓,在技术团队中,对一些通用场景,统一规范是必要的,只有步调一致,才能高效 ...

  4. Python开发【第五篇】: 内置模块

    内容概要 二分查找.冒泡 random time os sys pickle json shelve re 1.二分查找和冒泡排序 01. 二分查找 二分查找也称折半查找(Binary Search) ...

  5. 通用shell函数库

    1.输出字体颜色库 #!/bin/bash export black='\E[0m\c' export boldred='\E[1;31m\c' export boldgreen='\E[1;32m\ ...

  6. 用 IQ分布模拟图来测试浏览器的性能

    今天天气太凉快,跟这个日历上属于夏天的那一页显得格格不入!就连我我床下那台废弃的ThinkPad,居然也十分透凉气,那外壳连我的体温高都没有,于是,我就开始想一个方法,让我那个废弃的电脑发热,顺便用它 ...

  7. Java并发包中线程池ThreadPoolExecutor原理探究

    一.线程池简介 线程池的使用主要是解决两个问题:①当执行大量异步任务的时候线程池能够提供更好的性能,在不使用线程池时候,每当需要执行异步任务的时候直接new一个线程来运行的话,线程的创建和销毁都是需要 ...

  8. Java 中的字符串(String)与C# 中字符串(string)的异同

    1. C# 中比较两个字符串字面量是否相等,可以使用 “==”比较运算符,是因为string 类型重写(override)了“==” 和 “!=” 运算符,在使用“==” 和 “!=” 进行字符串比较 ...

  9. S7-1200与S7-200 通信西门子链接

    只要这两从站的通讯格式时一样的,而且都为modbus rtu格式的话,是可以走modbus通讯.你在用主站在编程时直接调用modbus rtu通讯库.同时200做为从站,在程序里面将从站的程序写好. ...

  10. Docker笔记(一):什么是Docker

    原文地址: http://blog.jboost.cn/2019/07/13/docker-1.html  1. 前言 接触Docker也有两年多了,断断续续玩过一些应用场景,如安装一些常用工具服务, ...