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配置文件中为其参数 ...
随机推荐
- JSON对象和JavaScript对象直接量的区别--不同之处
JSON对象和JS对象直接量 在工作当中,我们总是可以听到人说将数据转换为JSON对象,或者说把JSON对象转换为字符串之类的话,下面是关于JSON的具体说明. JSON对象并不是JavaScript ...
- spring源码深度解析— IOC 之 默认标签解析(下)
在spring源码深度解析— IOC 之 默认标签解析(上)中我们已经完成了从xml配置文件到BeanDefinition的转换,转换后的实例是GenericBeanDefinition的实例.本文主 ...
- 面试超火题 This的问题!!!
this问题 (1)this是js的一个关键字,指定一个对象,然后替代this: 函数中的this指向行为发生的主体,函数外的this都指向window,没有意义 (2)函数内的this跟函数在什么环 ...
- (1)Linux文件系统的目录组成
记忆秘诀:BBDEH OPRLM TLSUV 宝贝的恩惠 欧派入联盟 偷了suv,19 目录 英文释义 简写 详解 1 / 根目录 整个文件系统的唯一根目录 2 /bin Binary 普通命 ...
- 【HDU - 2612】Find a way
-->Find a way 直接上Chinese Descriptions: hsj和lsh最近迷上了pokemon go的游戏.在双十一大物期中考试来临之前,他们想抓一只稀有土拨鼠来攒攒人品 ...
- javascript——原型与原型链
一.prototype 在JavaScript中,每个函数都有一个prototype属性,这个属性指向函数的原型对象. 例如: function Person(age) { this.age = ag ...
- flume1.9 用户指南(中文版)
概述 Apache Flume是一个分布式,可靠且可用的系统,用于有效地从许多不同的source收集,聚合和移动大量日志数据到集中式数据存储. Apache Flume的使用不仅限于日志数据聚合.由于 ...
- JS高级程序设计第2章--精简版
前言:这次是二刷了,想暑假做一次完整的笔记,但用本子来写笔记的话太贵了,可能哪天还丢了..所以还是博客好== 第二章:在HTML中使用JavaScript 2.1 <script>元素: ...
- python的简介与简单使用
简介: python的诞生 创始人:Guido van Rossum(荷兰人:吉多) 时间:1989年 特点: 1.简单明了,容易上手 2.多平台,`全面发展,平衡发展, 3.胶水语言,有大量的库 其 ...
- HBase学习笔记一
HBase简介 HBase概念 HBase的原型是谷歌的Bigtable论文 HBase是一个高可靠性.高性能.面向列.可伸缩的分布式存储系统,利用HBase技术可在廉价PC上搭建起大规模结构化存储集 ...