-
TestNG数据驱动
2019-07-31 18:35:41TestNG数据驱动 testng的功能很强大,利用@DataProvider可以做数据驱动,数据源文件可以是EXCEL,XML,YAML,甚至可以是TXT文本。 @DataProvider注解简介: @DataProvider标记专门为测试方法提供参数的方法。这类...TestNG数据驱动
testng的功能很强大,利用@DataProvider可以做数据驱动,数据源文件可以是EXCEL,XML,YAML,甚至可以是TXT文本。
@DataProvider注解简介:
@DataProvider标记专门为测试方法提供参数的方法。这类方法必须返回Object[ ][ ]类型的二维数组或者Iterator<Object>[],每一行的Object[],都是测试方法的一个测试数据集,测试方法会为每个测试数据集执行一次。如果没有指定参数的名称,则默认为方法的名称,方法的名称没有限制。
@DataProvider的小例子:
import java.lang.reflect.Method;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
public class test {
@DataProvider(name = "user")
public Object[][] createUser(Method m) {
System.out.println(m.getName());
return new Object[][] { { "root", "root" }, { "test", "root" }, { "test", "test" } };
}
@Test(dataProvider = "user")
public void verifyUser(String username, String password) {
System.out.println("Verify User : " + username + ":" + password);
assert username.equals(password);
}
}
如上所示@DataProvider注解了createUser方法,返回的二位数组里有三行数据,每行两列。所以@Test(dataProvider = "user")注解的verifyUser方法有两个参数,用来接收每一行的两个数据,如果createUser返回的数据数组的列数和verifyUser的参数个数不同就会报错的。因为返回的有三行,所以verifyUser会被执行三次。结果如下:
PASSED: verifyUser("root", "root")
FAILED: verifyUser("test", "root")
PASSED: verifyUser("test", "test")
CSV文件数据读取和@DataProvider
我自己做了一个以csv为例的测试架子,部分代码可通用。
CSV文件读取类(可通用,目录自己可以修改,也可改变成读取EXCEL、TXT等文件):
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import java.util.regex.Matcher;
public class CSVData implements Iterator<Object[]> {
private BufferedReader br = null;
//行数
private int rowNum = 0;
//获取次数
private int curRowNo = 0;
//列数
private int columnNum = 0;
//key名
private String[] columnName;
//csv中所有行数据
private List<String> csvList;
//实际想要的行数据
private List<String> csvListNeed;
/*
* 在TestNG中由@DataProvider(dataProvider = "name")修饰的方法
* 取csv时,调用此类构造方法(此方法会得到列名并将当前行移到下以后)执行后,转发哦
* TestNG自己的方法中去,然后由它们调用此类实现的hasNext()、next()方法
* 得到一行数据,然后返回给由@Test(dataProvider = "name")修饰的方法,如此
* 反复到数据读完为止
*
*
* @param filepath CSV文件名
* @param casename 用例名
*/
public CSVData(String fileName, String caseId) {
try {
File directory = new File(".");
String ss = "resources.";
File csv = new File(directory.getCanonicalFile() + "\\src\\test\\" + ss.replaceAll("\\.", Matcher.quoteReplacement("\\"))
+ fileName + ".csv");
br = new BufferedReader(new FileReader(csv));
csvList = new ArrayList<String>();
while (br.ready()) {
csvList.add(br.readLine());
this.rowNum++;
}
String stringValue[] = csvList.get(0).split(",");
this.columnNum = stringValue.length;
columnName = new String[stringValue.length];
for (int i = 0; i < stringValue.length; i++) {
columnName[i] = stringValue[i].toString();
}
this.curRowNo++;
csvListNeed = new ArrayList<String>();
for (int i = 1; i < rowNum; i++) {
String values[] = csvList.get(i).split(",");
if (caseId.equals(values[0])) {
csvListNeed.add(csvList.get(i));
}
}
this.rowNum = 2;//就取一行
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public boolean hasNext() {
if (this.rowNum == 0 || this.curRowNo >= this.rowNum) {
try {
br.close();
} catch (Exception e) {
e.printStackTrace();
}
return false;
} else {
return true;
}
}
@Override
public Object[] next() {
/*
* 将数据放入map
*/
Map<String, String> s = new TreeMap<String, String>();
String csvCell[] = csvListNeed.get(0).split(",");
for (int i = 0; i < this.columnNum; i++) {
String temp = "";
try {
temp = csvCell[i].toString();
} catch (ArrayIndexOutOfBoundsException ex) {
temp = "";
}
s.put(this.columnName[i], temp);
}
Object r[] = new Object[1];
r[0] = s;
this.curRowNo++;
return r;
}
@Override
public void remove() {
throw new UnsupportedOperationException("remove unsupported");
}
}
这个类实现了Iterator<Object[]>迭代器,TestNG调用此类实现的hasNext()、next()方法得到一行数据,在next()方法中可以看到,我把数据是放在Map<String, String>中的,再把map放在Object[]里,所以测试方法的参数就必须是一个Map<String, String>。我这里改成了只读取一行,因为一个csv文件的一个caseId只应该有一行。
数据驱动类:
import java.lang.reflect.Method;
import java.util.Iterator;
import org.testng.annotations.DataProvider;
public class DataProviderTest {
/**
* @DataProvider的返回值类型只能是Object[][]与Iterator<Object>[]
*
* @param method
* @return
*/
@DataProvider
public Iterator<Object[]> dataSource(Method method) {
return (Iterator<Object[]>) new CSVData(method.getDeclaringClass().getSimpleName(), method.getName());
}
}
Method方法是通过反射获取的,总之哪个方法调用我Method就是那个方法。
method.getDeclaringClass().getSimpleName()可以获取方法所属的类的类名。
我这里规定了csv的文件名就是测试类的类名,用例名就是方法名。
return (Iterator<Object[]>) new CSVData(…)就是将CSV读取类读取的结果返回,返回的类型是Iterator<Object[]>的,符合@DataProvider的返回值类型要求。当@Test(dataProvider = "dataSource")注解的测试方法执行时就会调用Iterator的hasNext()判断是否有数据和next()获取数据。
测试类:
import java.util.Map;
import org.testng.annotations.Test;
public class DataTest extends DataProviderTest {
@Test(dataProvider = "dataSource")
public void id2(Map<String, String> data) {
System.out.println(data);
}
@Test(dataProvider = "dataSource")
public void id1(Map<String, String> data) {
System.out.println(data);
}
}
DataTest.csv文件如下:
输出结果如下:
PASSED: id1({caseId=id1, flag=Y, property=flowModel, type=com.mybank.bkloanapply.core.model.BaseModel, value=BaseModel.csv@1})
PASSED: id2({caseId=id2, flag=M, property=context, type=java.util.Map, value=a:Object.csv@1})
总结
通过以上例子可以看到,无论@DataProvider注解的方法返回的是Object[ ][ ]还是Iterator<Object>[],最后测试方法获得的参数都是Object[ ]里放的东西,第一个例子里放了两列String,第二个例子里放了Map<String, String>,所以第一个测试类的测试方法的参数是两个String,第二个测试类的测试方法的参数是Map<String, String>,必须保持一致才行。
-
数据驱动?什么是数据驱动??
2018-12-09 20:57:44”,我把毕设题目给师兄看了,师兄说:“数据驱动啊”。我突然有点懵,我做的不是深度学习吗?怎么变成了数据驱动。可能是因为我知道的太少了吧! 目前个人的理解是:深度学习是机器学习的子集,数据驱动是大数据?...前几天和一个博士师兄聊天,师兄说:“你毕设做什么题目?”,我把毕设题目给师兄看了,师兄说:“数据驱动啊”。我突然有点懵,我做的不是深度学习吗?怎么变成了数据驱动。可能是因为我知道的太少了吧!
目前个人的理解是:深度学习是机器学习的子集,数据驱动是大数据?可能各有各的说法,但是都是属于人工智能的领域。
让我们通过一个小例子来简单理解一下什么是数据驱动
假设有A和B两家订票网站:
A公司将从网站收集到的数据进行分析,通过数据分析结果认为十一是出行高峰期,所以在十一前后提高价格,并手动在后头调整了十一前后的机票价格和酒店价格。(依靠人为来决定价格)
B公司则通过自动化手段实时收集数据,在线分析相关信息,总结规律,形成数据建模,当用户搜索时自动根据模型对价格进行调整。(可以说B公司进行了“数据采集——数据分析——得到模型”这样的一个过程)
这两个公司,哪家是数据驱动的公司呢?
显而易见,公司B是数据驱动型的公司,而公司A则是一家“以数据为中心来进行决策”的公司。
总的来说,数据驱动就是处理数据,跟数据相关吧!
以上仅为个人理解
-
数据驱动和模型驱动的区别
2019-12-29 14:46:12数据驱动和模型驱动的区别 自己的理解,不对望纠正。 模型驱动 在以前的基于数学的时期时,因为不可能对大量的数据做处理,所以只能依靠在少量数据中例如数学中正态分布等等的假定来做假定的数学模型,进行手工计算...数据驱动和模型驱动的区别
自己的理解,不对望纠正。
模型驱动
在以前的基于数学的时期时,因为不可能对大量的数据做处理,所以只能依靠在少量数据中例如数学中正态分布等等的假定来做假定的数学模型,进行手工计算,并推导出一些由这些模型所得结果的性质,模型驱动就是让数据去贴合某个模型,拿出一组数据来,对比更适合哪个模型。
数据驱动
数据驱动是目前比较火的研究方法,是指在得到一组数据后,如果想要得到某种效果和对数据做某些操作,让模型去贴合数据,从而改变该模型,以达到效果。
区别
模型驱动和数据驱动的区别在于对数据的操作,如果操作并不改变模型本身,就是模型驱动,如果操作改变了模型,让模型去贴合数据,就是数据驱动的研究方法。
-
数据驱动与关键字驱动
2018-02-20 14:46:47数据驱动:数据驱动从数据文件读取输入数据,通过变量的参数化将测试数据传入测试脚本,不同的数据文件对应不同的测试用例,数据和脚本分离。数据来控制测试的业务流。 比如你测一个WEB程序,有很多页面,你可以通过...数据驱动:数据驱动从数据文件读取输入数据,通过变量的参数化将测试数据传入测试脚本,不同的数据文件对应不同的测试用例,数据和脚本分离。数据来控制测试的业务流。 比如你测一个WEB程序,有很多页面,你可以通过一个数据来控制每次是再哪个页面下工作的(即通过数据来导航到相应的页面)。它是关键字驱动的低级版本,他控制的是函数级的,而关键字是控制动作级的。所以数据驱动应该是可以控制整个测试的关键字驱动:可以认为是对数字驱动的逻辑扩张。将测试逻辑按照关键字进行分解,关键字对应封装的逻辑业务。主要关键字包括三类:被操作对象(Item)、操作(operation)和值(value),利用面向对象的方式可以将其表现为Item.Operation(value)。 -
《数据驱动 从方法到实践》之 数据驱动的环节 学习总结
2019-05-25 17:48:44详解大数据本质、理念与现状,围绕数据驱动四环节—采集、建模、分析、指标,深入浅出地讲述企业如何将数据驱动方案落地,并指出数据驱动的价值在于“数据驱动决策”、“数据驱动产品智能”。最后通过互联网金额、... -
数据驱动测试一:使用TestNG进行数据驱动
2016-07-24 10:47:03使用TestNG中@DataProvider注解定义当前方法中的返回对象作为测试脚本的测试数据集进行数据驱动 -
数据驱动测试框架
2018-04-02 19:42:19如果测试过程中会遇到下列问题:测试需要针对许多具有类似结构的数据来执行实际的测试逻辑是一样的,发生改变的仅仅是数据数据可以被一组不同的人修改 这种类型的测试通常有很好的处理方法,即所谓的“数据驱动测试... -
数据驱动的理解
2019-04-02 12:14:35数据驱动 数据与规则 数据驱动,其根本在数据。一切一切的前提在于数据一定是要真实的,虚假的数据就算再能拟合某个算法或者模型,总归还是一句梦呓。 不能转化为规律数据是驳杂的,毫无意义的。但是如果没有数据作... -
数据驱动与模型驱动
2014-11-19 14:28:31今天看到一篇大数据GIS的文章,文章中讲到了数据驱动 -
请问领域驱动,模型驱动,数据驱动,属性驱动都有什么关联吗?
2015-02-24 05:08:55请问领域驱动,模型驱动,数据驱动,属性驱动都有什么关联吗? 是不是领域驱动和数据驱动都包括了模型驱动? -
数据驱动测试技术
2017-03-09 17:27:32数据驱动测试的概念 数据驱动测试是从数据文件(excel 文本文件 XML 文件 或者数据库)中读取测试数据,然后通过变量传入脚本中,既可以当测试数据的输入 也可以当输出数据的验证。测试数据在文件中, 测试脚本负责... -
数据驱动到底是什么?如何驱动,又能驱动什么?
2017-12-28 14:15:51人人都在谈数据驱动,如数据化管理、数据驱动的运营、或者数据驱动的测试等,关于数据驱动的应用的讨论很多,但关于数据驱动基本原理的讨论较少,本文试图追根溯源,谈一谈数据驱动的基本原理:数据如何驱动?... -
什么是数据驱动测试?学习创建框架
2020-09-14 07:30:00数据驱动测试数据驱动测试是一种软件测试方法,其中测试数据以表或电子表格格式存储。数据驱动的测试允许测试人员输入单个测试脚本,该脚本可以对表中的所有测试数据执行测试,并期望测试输出在同一表... -
Unity3D笔记——数据驱动模型之bvh动作数据驱动3D模型跳舞
2018-08-14 10:37:38Unity3D笔记——数据驱动模型之bvh动作数据驱动3D模型跳舞 话说这个方面的东西真是要命啊。。。最大的问题是。。。不会用unity3d。。。。 实际上,bvh是不能直接在unity3D里面使用,需要转成bvh。怎么转呢?这个就... -
提升数据驱动能力的意义
2019-07-12 16:34:19人人都在谈数据驱动,如数据化管理、数据驱动的运营、或者数据驱动的测试等,关于数据驱动的应用的讨论很多,那么,数据到底如何驱动?能够驱动什么?数据驱动能力如何提升? 提高数据驱动能力能够做到哪些事? 如果... -
QTP数据驱动和关键字驱动
2013-10-14 17:08:22原文地址:[转]QTP数据驱动和关键字驱动作者:Cheers_Lee 原文地址:http://blog.sina.com.cn/s/blog_4d54c07a0100gk41.html 关键字驱动: 数据驱动技术可以将用户使用工具的关注点放在对测试数据的构建... -
数据驱动测试二:使用TestNG和CSV文件进行数据驱动
2016-07-24 11:32:151、使用@DataProvider注解定义当前方法中的返回对象CSV文件(存放测试数据)作为测试脚本的测试数据集进行数据驱动。 2、使用带缓冲区的字符输入流BufferedReader读取文件内容 3、代码在搜索完成后使用显式等待方式... -
数据分析是模型驱动还是数据驱动?
2014-12-13 19:29:01在讨论这个问题之前,需要理解清楚模型驱动与数据驱动两个词的含义。到底什么是模型驱动?从认识世界的角度来讲,我们理解的制度、礼仪、道德等等,基本上都可以理解为模型,通过这些模型,我们可以清楚地明白哪些是... -
Unreal Cookbook:数据驱动
2016-07-14 13:25:05在虚幻4引擎中使用数据驱动的两种方式:CSV数据表格和DataAsset -
python数据驱动-ddt
2018-05-10 00:31:10一、数据驱动介绍 二、DDT基本使用介绍 2.0 测试基类 2.1 使用步骤 2.1 ddt读取单个数据 2.2.1 案例 2.2 ddt读取组合中的数据(@unpack) 2.2.1 加unpack 2.2.2 不加unpack 2.3 读取字典 三、DDT和Excel结合 ... -
js:浅谈js的事件驱动和数据驱动
2019-08-13 10:15:37随着大前端时代的到来,我们从 jquery 到 react,vue 等框架的转变,其实就是事件驱动到数据驱动的思维模式的转变 事件驱动 事件:用户点击按钮就是一个事件 构建页面:设计DOM => 生成DOM => 绑定事件 监听... -
菜鸟理解关于数据驱动和关键字驱动区别
2017-07-15 20:11:45做手工测试的时间久了,一直想往自动化的方向发展,看了论坛上各种文章,众说云云,说从数据驱动到关键字驱动,把数据驱动贬得一无是处,把关键字驱动说得那么神化,但我感觉都是一样的啊,都是把对象参数化,然后把... -
基于testNG数据驱动测试
2017-03-24 13:32:14数据驱动概念: 数据驱动测试是相同的测试脚本使用不同的测试数据执行,测试数据和测试行为 完全分离 数据驱动测试用设计步骤: 编写测试脚本,脚本需要支持程序对象、文件或者数据库读入测试数据。 将测试脚本... -
元数据驱动
2014-08-20 21:07:24... +个组织。个别企业和商业软件即服务(SaaS)供应商相信该平台可以提供...为了满足其庞大的用户人口要求,Force.com以元数据驱动的软件架构为基础,构建多租户应用。本文阐述了这项专利技术,它使Force.com平台对 -
数据驱动编程之表驱动法
2011-11-13 22:02:50之前介绍过数据驱动编程《什么是数据驱动编程》。里面介绍了一个简单的数据驱动手法。今天更进一步,介绍一个稍微复杂,更加实用的一点手法——表驱动法。关于表驱动法,在《unix编程艺术》中有提到,更详细的描述... -
实现python pytest excel数据驱动
2020-05-22 12:41:45pytest支持数据驱动 基础举例: import pytest @pytest.mark.parametrize("a,b,c",[[1,2,3],[3,4,7]]) def test_add(a,b,c): assert a+b==c 执行时,将分别使用上面两组数据,执行两个test。 实际中我们... -
Pytest 参数化(数据驱动)
2019-12-24 22:30:18其实也就是数据驱动的概念。 在 Unittest 中,我们讲过使用 ddt 库配合 unittest 实现数据驱动。在 Pytest 中并不需要额外的库,通过 pytest.mark.parametrize()即可实现参数化。 单个参数 在使用pytest.mark.... -
数据驱动故障诊断方法汇总
2018-10-09 17:54:23最近在看数据驱动故障诊断方面的论文,然后做了一个方法的汇总。 -
数据驱动测试框架DDT的使用
2019-11-05 18:04:29数据驱动测试框架DDT的使用 DDT测试框架的介绍 DDT全程为Data Driver Test数据驱动测试,是由测试数据驱动测试用例的执行,加入ddt框架,可以实现用例的重复执行以及代码的重复使用,减少工作量。数据代码分离为... -
使用ddt执行数据驱动测试
2018-05-13 07:00:59所谓数据驱动测试,简单的理解为数据的改变从而驱动自动化测试的执行,最终引起测试结果的改变。通过使用数据驱动测试的方法,可以在需要验证多组数据测试场景中,使用外部数据源实现对输入输出与期望值的参数化,...