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配置文件中为其参数 ...
随机推荐
- Hadoop编程踩坑
Hadoop踩坑 在hadoop所有组件编程中,遇到在Windows下运行程序出现 java.io.IOException: Could not locate executable null\bin\ ...
- 教妹子用IDEA创建web应用,部署到Tomcat服务器
自从上一篇原创发表之后,粉丝反应热烈.主要分两派,一派关注技术的,觉得看了那么多的公众号文章,终于找到一篇能看懂的了,于是沾沾自喜.另一派是关注妹子的,感叹自己空有一身绝技,公司里却无妹子可教,大喊可 ...
- 阅读HashMap——jdk7时遇到的问题记录
今天看hashMapJDK7版,水很深,看的也痛苦~推一个博主:http://www.cnblogs.com/xrq730/ 看了源码,才发现自己基础真的很薄弱,虽然当初也是下了很多的经历,但是毕竟大 ...
- springboot-redis-crda example
springboot-redis-crda example 1. 从 https://github.com/XLuffyStory/springboot-redis-crdu 拿到源码之后,导入到ST ...
- 使用docker启动mysql
安装docker 查询mysql版本, docker search mysql 拉取指定版本的镜像 docker pull NAME 启动镜像, 第一次启动最少需要指定MYSQL_ROOT_PASSW ...
- centos7.3 格式化和挂载数据盘
本文使用 fdisk 命令对小于 2 TiB 的数据盘执行分区操作. 1. 运行 fdisk -l 命令查看实例是否有数据盘 2. 创建一个单分区数据盘,依次执行以下命令: 运行 fdisk /d ...
- Codeforces Gym101246G:Revolutionary Roads(DFS+思维)
http://codeforces.com/gym/101246/problem/G 题意:有一个n个点m条边的有向图,现在可以修改某一条有向边使得其为无向边,问修改哪些边可以使得修改后的强连通分量的 ...
- Codeforces 730B:Minimum and Maximum(交互式问题)
http://codeforces.com/problemset/problem/730/B 题意:一个交互式问题,给出一个n代表有n个数字,你可以问下标为x和y的数的大小,会给出"> ...
- NioEventLoop启动流程源码解析
NioEventLoop的启动时机是在服务端的NioServerSocketChannel中的ServerSocketChannel初始化完成,且注册在NioEventLoop后执行的, 下一步就是去 ...
- [POI2008]枪战Maf题解
问题 C: [POI2008]枪战Maf 时间限制: 1 Sec 内存限制: 256 MB 题目描述 有n个人,每个人手里有一把手枪.一开始所有人都选定一个人瞄准(有可能瞄准自己).然后他们按某个顺 ...