TestNG中DataProvider的用法二:简单的数据驱动
@DataProvider标记的方法除了可以返回数组外,还可以返回一个Iterator,这样的好处是不用把所有的测试数据都加载到内存中,而是需要的时候就读一条。
下面的例子就使用了Iterator,然后在Iterator对象中保存了一个文件对象,在需要参数的时候就从文件中读一行数据出来。
这个例子主要由如下四个文件组成:
Person类被测试类TxtIterator类实现Iterator接口,用于从文件中读取数据,返回给被测试类testng.xmlTestNG配置文件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
===============================================
简单说一下上面的运行过程:
- 运行testng.xml,发现要运行的方法在Person类中,这就要构造一个Person类的对象,发现Person类的构造方法包含一个file参数,于是从testng.xml文件中把file参数的值取出来,传给了构造方法,创建了Person对象
- 开始执行测试,发现该测试方法需要一个DataProvider,于是在本类中找到了provider()方法,执行该方法,构造出Iterator对象,传递给测试方法。Iterator对象使用了Person对象中的dataFile成员变量的值构造出一个BufferedReader对象,每当测试方法需要一条数据时就由BufferedReader读一条数据出来,再拆分成数组,返回给测试方法调用。这样就实现了数据驱动和参数懒加载。
TestNG中DataProvider的用法二:简单的数据驱动的更多相关文章
- TestNG 中DataProvider 的用法
使用DataProvider提供数据有两种形式: 第一种:一种是在测试代码和测试数据放在同一个类中: 第二种:把所有的数据提供都单独写在一个类里面,当测试数据比较多时,这种方法利于维护. DataPr ...
- TestNG中DataProvider的用法
提供数据的一个测试方法.注解的方法必须返回一个Object[] [],其中每个对象 []的测试方法的参数列表中可以分配.该@Test 方法,希望从这个 DataProvider 的接收数据,需要使用一 ...
- TestNG中DataProvider的用法一
目录 为什么要使用DataProvider DataProvider的常规用法 带Method参数的DataProvider 带ITestContext的DataProvider DataProvid ...
- TestNG中group的用法
TestNG中的组可以从多个类中筛选组属性相同的方法执行. 比如有两个类A和B,A中有1个方法a属于组1,B中有1个方法b也属于组1,那么我们可以通过配置TestNG文件实现把这两个类中都属于1组的方 ...
- Java中Synchronized的用法(简单介绍)
简单介绍 synchronized是Java中的关键字,是一种同步锁.它修饰的对象有以下几种: 1. 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调 ...
- testNG中dataprovider使用的两种方式
testNG的参数化测试有两种方式:xml和dataprovider.个人更喜欢dataprovider,因为我喜欢把测试数据放在数据库里. 一.返回类型是Iterator<Object[]&g ...
- python中 yield 的用法 (简单、清晰)
首先我要吐槽一下,看程序的过程中遇见了yield这个关键字,然后百度的时候,发现没有一个能简单的让我懂的,讲起来真TM的都是头头是道,什么参数,什么传递的,还口口声声说自己的教程是最简单的,最浅显易懂 ...
- MVC中Cookie的用法(二)---CookieHelper
public class CookieHelper { /// <summary> /// 1.1添加Cookie /// </summary> /// <param n ...
- TestNG中的数据源DataProvider概述
http://blog.csdn.net/taiyangdao/article/details/52141711 在上一篇文章中,我们知道带参数的测试方法,可以在testng.xml配置文件中为其参数 ...
随机推荐
- express 中间件的理解
nodejs(这指express) 中间件 铺垫: 一个请求发送到服务器,要经历一个生命周期,服务端要: 监听请求-解析请求-响应请求,服务器在处理这一过程的时候,有时候就很复杂了,将这些复杂的业务拆 ...
- Hadoop 学习之路(八)—— 基于ZooKeeper搭建Hadoop高可用集群
一.高可用简介 Hadoop 高可用 (High Availability) 分为 HDFS 高可用和 YARN 高可用,两者的实现基本类似,但 HDFS NameNode 对数据存储及其一致性的要求 ...
- 【分页工具-spring boot】Mybatis PageHelper 集成Spring boot
官方文档:https://github.com/pagehelper/pagehelper-spring-boot 1.引入包,测试过以下版本兼容性还是比较好的 <!--Mybatis-Spri ...
- webpack中添加px2rem-loader
在buid->util.js const px2remLoader = { loader: 'px2rem-loader', options: { remUnit: 75 } } // gene ...
- kubernetes实战篇之helm完整示例
系列目录 构建一个 Helm Chart 下面我们通过一个完整的示例来学习如何使用 Helm 创建.打包.分发.安装.升级及回退Kubernetes应用. 创建一个名为 mychart 的 Chart ...
- Python生成word
Python生成word 使用python-docx-template库, 将html转为word. python-docx-template可以使用类似jinja2的模板语法. 依赖docx库, 安 ...
- 【Go】使用压缩文件优化io (二)
原文链接: https://blog.thinkeridea.com/201907/go/compress_file_io_optimization2.html 上一篇文章<使用压缩文件优化io ...
- 每天学点node系列-zlib
永不放弃,永不放弃又有两个原则,第一个原则是永不放弃,第二个原则就是:当你想放弃时回头看第一个原则. 概览 做过web性能优化的同学,对性能优化大杀器gzip应该不陌生.浏览器向服务器发起资源请求,比 ...
- scrapy基础知识之 使用FormRequest.from_response()方法模拟用户登录:
通常网站通过 实现对某些表单字段(如数据或是登录界面中的认证令牌等)的预填充 使用Scrapy抓取网页时,如果想要预填充或重写像用户名.用户密码这些表单字段, 可以使用 FormRequest.fro ...
- 动态代理模拟实现aop
AOP实现起来代码相当简单.主要核心是动态代理和反射. 一.接口类: public interface MethodDao { public void sayHello(); } 二.接口实现类: p ...