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

下面的例子就使用了Iterator,然后在Iterator对象中保存了一个文件对象,在需要参数的时候就从文件中读一行数据出来。

这个例子主要由如下四个文件组成:

  1. Person类被测试类
  2. TxtIterator类实现Iterator接口,用于从文件中读取数据,返回给被测试类
  3. testng.xmlTestNG配置文件
  4. data.txt参数池文件

Person主类(被测试类)

package ngtest;

import java.io.File;
import java.io.IOException;
import java.util.Iterator; import org.testng.annotations.DataProvider;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test; /**
* @author Administrator
*
*/
public class Person { String dataFile; @Parameters({ "file" }) //parameter可以添加在类的构造方法上
public Person(String dataFile) {
super();
this.dataFile = dataFile;
} @Test(dataProvider = "provider") //被测试方法
public void getName(String name, String age) {
System.out.println(name + "_" + age);
} @DataProvider(name = "provider")
public Iterator<String[]> provider() throws IOException {
return new TxtIterator(new File(dataFile));
}
}

TxtIterator类

package ngtest;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Iterator; public class TxtIterator implements Iterator<String[]> {
File txtFile; //数据文件
BufferedReader bs;
String currentLine; public TxtIterator(File txtFile) throws IOException {
super();
this.txtFile = txtFile;
try {
bs = new BufferedReader(new FileReader(txtFile));
} catch (FileNotFoundException e) {
System.out.println("文件找不到");
e.printStackTrace();
}
currentLine = bs.readLine();
} @Override
public boolean hasNext() {
if (currentLine != null) {
return true;
} else {
return false;
}
} @Override
public String[] next() {
String returnLine = currentLine;
try {
currentLine = bs.readLine();
} catch (IOException e) {
e.printStackTrace();
}
return returnLine.split(",");
} }

TestNG配置文件testng.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite">
<parameter name="file" value="data.txt"/><!--数据文件的路径-->
<test name="Test1">
<classes>
<class name="ngtest.Person" />
</classes>
</test>
</suite>

数据文件data.txt

Liming,12
HanMeimei,13
Lily,11
Lucy,12

执行后输出

[TestNG] Running:
D:\workspace\tester\testng.xml Liming_12
HanMeimei_13
Lily_11
Lucy_12 ===============================================
Suite
Total tests run: 4, Failures: 0, Skips: 0
===============================================

简单说一下上面的运行过程:

  1. 运行testng.xml,发现要运行的方法在Person类中,这就要构造一个Person类的对象,发现Person类的构造方法包含一个file参数,于是从testng.xml文件中把file参数的值取出来,传给了构造方法,创建了Person对象
  2. 开始执行测试,发现该测试方法需要一个DataProvider,于是在本类中找到了provider()方法,执行该方法,构造出Iterator对象,传递给测试方法。Iterator对象使用了Person对象中的dataFile成员变量的值构造出一个BufferedReader对象,每当测试方法需要一条数据时就由BufferedReader读一条数据出来,再拆分成数组,返回给测试方法调用。这样就实现了数据驱动和参数懒加载。

TestNG中DataProvider的用法二:简单的数据驱动的更多相关文章

  1. TestNG 中DataProvider 的用法

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

  2. TestNG中DataProvider的用法

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

  3. TestNG中DataProvider的用法一

    目录 为什么要使用DataProvider DataProvider的常规用法 带Method参数的DataProvider 带ITestContext的DataProvider DataProvid ...

  4. TestNG中group的用法

    TestNG中的组可以从多个类中筛选组属性相同的方法执行. 比如有两个类A和B,A中有1个方法a属于组1,B中有1个方法b也属于组1,那么我们可以通过配置TestNG文件实现把这两个类中都属于1组的方 ...

  5. Java中Synchronized的用法(简单介绍)

    简单介绍 synchronized是Java中的关键字,是一种同步锁.它修饰的对象有以下几种: 1. 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调 ...

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

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

  7. python中 yield 的用法 (简单、清晰)

    首先我要吐槽一下,看程序的过程中遇见了yield这个关键字,然后百度的时候,发现没有一个能简单的让我懂的,讲起来真TM的都是头头是道,什么参数,什么传递的,还口口声声说自己的教程是最简单的,最浅显易懂 ...

  8. MVC中Cookie的用法(二)---CookieHelper

    public class CookieHelper { /// <summary> /// 1.1添加Cookie /// </summary> /// <param n ...

  9. TestNG中的数据源DataProvider概述

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

随机推荐

  1. express 中间件的理解

    nodejs(这指express) 中间件 铺垫: 一个请求发送到服务器,要经历一个生命周期,服务端要: 监听请求-解析请求-响应请求,服务器在处理这一过程的时候,有时候就很复杂了,将这些复杂的业务拆 ...

  2. Hadoop 学习之路(八)—— 基于ZooKeeper搭建Hadoop高可用集群

    一.高可用简介 Hadoop 高可用 (High Availability) 分为 HDFS 高可用和 YARN 高可用,两者的实现基本类似,但 HDFS NameNode 对数据存储及其一致性的要求 ...

  3. 【分页工具-spring boot】Mybatis PageHelper 集成Spring boot

    官方文档:https://github.com/pagehelper/pagehelper-spring-boot 1.引入包,测试过以下版本兼容性还是比较好的 <!--Mybatis-Spri ...

  4. webpack中添加px2rem-loader

    在buid->util.js const px2remLoader = { loader: 'px2rem-loader', options: { remUnit: 75 } } // gene ...

  5. kubernetes实战篇之helm完整示例

    系列目录 构建一个 Helm Chart 下面我们通过一个完整的示例来学习如何使用 Helm 创建.打包.分发.安装.升级及回退Kubernetes应用. 创建一个名为 mychart 的 Chart ...

  6. Python生成word

    Python生成word 使用python-docx-template库, 将html转为word. python-docx-template可以使用类似jinja2的模板语法. 依赖docx库, 安 ...

  7. 【Go】使用压缩文件优化io (二)

    原文链接: https://blog.thinkeridea.com/201907/go/compress_file_io_optimization2.html 上一篇文章<使用压缩文件优化io ...

  8. 每天学点node系列-zlib

    永不放弃,永不放弃又有两个原则,第一个原则是永不放弃,第二个原则就是:当你想放弃时回头看第一个原则. 概览 做过web性能优化的同学,对性能优化大杀器gzip应该不陌生.浏览器向服务器发起资源请求,比 ...

  9. scrapy基础知识之 使用FormRequest.from_response()方法模拟用户登录:

    通常网站通过 实现对某些表单字段(如数据或是登录界面中的认证令牌等)的预填充 使用Scrapy抓取网页时,如果想要预填充或重写像用户名.用户密码这些表单字段, 可以使用 FormRequest.fro ...

  10. 动态代理模拟实现aop

    AOP实现起来代码相当简单.主要核心是动态代理和反射. 一.接口类: public interface MethodDao { public void sayHello(); } 二.接口实现类: p ...