selenium从入门到应用 - 7,testNG的DataProvider
本系列所有代码 https://github.com/zhangting85/simpleWebtest
本文将介绍一个Java+TestNG+Maven+Selenium的web自动化测试脚本环境下testNG的Dataprovider的使用和数据驱动的自动化测试的实现,并提供全部代码。
首先,DataProvider是什么?
这是testNG提供的一个做数据驱动的自动化测试时用到的标签。详见testNG官网文档。
很多人会在使用testNG的时候把测试数据文件独立出来,有的人会自己去写读文件的方法,在测试方法里去调用。这样写不一定不好,但有时我们如果了解testNG提供的方法,就多了一种选择。而且通常DataProvider是比较好的一种选择。
DataProvider有两种写法:
一种是返回一个Iterator的泛型对象,代码如下:
package simplewebtest.test.testcases.sample.jd; import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List; import org.testng.annotations.DataProvider;
import org.testng.annotations.Test; import simplewebtest.core.TestCase;
import simplewebtest.core.page.sample.jd.JDHomepage; public class TestJDDataDriven extends TestCase { /**
* JD首页上搜索一个商品 主要介绍定位某个商品名称的N种写法
* 这里用了DataProvider
* (不会用DataProvier不要说自己懂testNG)
*/
@Test(dataProvider="product_to_search")
public void searchProduct(String keyword) throws InterruptedException { log.info("keyword="+keyword);
//方法链。方法链并不会导致调试困难,因为我是先写线性脚本后重构成这种脚本this is a method chain
String actual_procut_name= new JDHomepage().init().searchHeader.search(keyword).getProductNameByIndexMethodTwo(1);
log.info("actual_procut_name="+actual_procut_name);
assert(actual_procut_name.contains(keyword));
log.info("--------------------------------");
} /**
* 一个返回iterator的的DataProvider
*/
@DataProvider(name="product_to_search")
public Iterator<Object[]> createData1() {
//一个Array
String[] astringarray={"巧克力","饼","糕","蛋"};
//转成一个String的List
List<String> lines=Arrays.asList(astringarray); //一个Object的空的List
List<Object[]> data = new ArrayList<Object[]>(); //往空List里放东西,然后返回
for (String line :lines )
{
data.add(new Object[]{line});
}
return data.iterator(); } }
另一种是返回一个Object的二维数组,代码如下:
package simplewebtest.test.testcases.sample.jd; import org.testng.annotations.DataProvider;
import org.testng.annotations.Test; import simplewebtest.core.TestCase;
import simplewebtest.core.page.sample.jd.JDHomepage; public class TestJDDataDriven2 extends TestCase { /**
* JD首页上搜索一个商品 主要介绍定位某个商品名称的N种写法
* 这里用了DataProvider
* (不会用DataProvier不要说自己懂testNG)
*/
@Test(dataProvider="product_to_search")
public void searchProduct(String keyword) throws InterruptedException { log.info("keyword="+keyword);
String actual_procut_name= new JDHomepage().init().searchHeader.search(keyword).getProductNameByIndexMethodTwo(1);
log.info("actual_procut_name="+actual_procut_name);
assert(actual_procut_name.contains(keyword));
log.info("--------------------------------");
} /**
* 一个返回Object2维数组的DataProvider
*/
@DataProvider(name="product_to_search")
public Object[][] createData1() {
return new Object[][] {
{ "巧克力" },
{ "饼"},
{ "核桃"},
};
} }
这两种写法都可以,随个人喜好选择吧。第二种方法更古老一点,在没有泛型的年代就只能用它了。
另外,DataProvider还支持并行执行。
比如,
@DataProvider(name="product_to_search",parallel = true)
parallel属性为true时,testNG会并行执行这个DataProvider提供的测试数据。
如此,我们的测试执行速度也会大幅提升(如果你的电脑有多个CPU,速度提升更明显)。下期介绍testNG中的并行测试执行时会给出例子。
有人问,我要把测试数据放到独立文件里去的话,怎么做?
这个问题其实很简单,我们仍旧使用DataProvider,在DataProvider里调用负责文件读取的方法,然后把文件内容存入我们DataProvider的返回值中。例子就不给了,请自己动手写吧。
但是呢,测试数据和测试用例分开放虽然有他的好处,新的问题却会产生:程序的读者(需要阅读或维护你代码的人)怎么知道哪个用例对应哪个数据?我亲眼见过有的人把上百个测试用例的数据放在一个txt文件里。其结构之混乱,对程序读者来说,无疑是一场灾难。请不要这么做!请在写代码时,考虑读者的感受,读者每次读到一个蹩脚的设计时是多么地难受啊。
有人问,我要把DataProvider独立到一个专门的类里去,行不行?
你可以自己试试哦,我记得是可以的。同样,请在做这种设计前考虑一下读者的感受,我不希望在一个巨大的包含几百个方法的类里寻找我用到的测试方法的DataProvider,请不要这么设计。
有人问,我一个DataProvider可不可以为多个测试方法提供数据?
完全可以哦,DataProvider上是可以跟一个传入参数Method的,用来表示调用这个DataProvider的方法名称。你可以在后续的代码里判断这个Method的值,根据不同的方法名为方法提供不同的数据。官网有例子哦,请看官网啊亲。或者自己试试写吧。这个系列里关于testNG的东西我就简单带过了,主要讲selenium嘛。
selenium从入门到应用 - 7,testNG的DataProvider的更多相关文章
- selenium从入门到应用 - 8,selenium+testNG实现多线程的并发测试
本系列所有代码 https://github.com/zhangting85/simpleWebtest本文将介绍一个Java+TestNG+Maven+Selenium的web自动化测试脚本环境下s ...
- Selenium 2 入门
在多个浏览器中进行 Web 应用程序的端到端功能测试 Selenium 是一款有名的 Web 应用程序测试框架,用于进行功能测试.新版本 Selenium 2 结合了 Selenium 1 和 Web ...
- 元素(WebElement)-----Selenium快速入门(三)
上一篇<元素定位-----Selenium快速入门(二)>说了,如何定位元素,本篇说说找到的元素(WebElement)该怎么用. WebElement常用方法: 返回值 方法名 说 ...
- python selenium webdriver入门基本操作
python selenium webdriver入门基本操作 未经作者允许,禁止转载! from selenium import webdriver import time driver=webdr ...
- 隐式等待-----Selenium快速入门(九)
有时候,网页未加载完成,或加载失败,但是我们后续的代码就已经开始查找页面上的元素了,这通常将导致查找元素失败.在本系列Selenium窗口切换-----Selenium快速入门(六)中,我们就已经出现 ...
- selenium webdriver入门
写在前面:最近在研究UI自动化测试的过程中,发现公司里通常用的是AutomanX框架,而这个框架实际上是基于selenium webdriver框架的,所以在编写测试用例时,很多语法都是直接使用sel ...
- selenium从入门到应用 - 4,页面对象设计模式的实现
本系列所有代码 https://github.com/zhangting85/simpleWebtest 本文将介绍一个Java+TestNG+Maven+Selenium的web自动化测试脚本环境下 ...
- Selenium | 基础入门 | 截屏并保存于本地
可先参考 Selenium | 基础入门 | 利用Xpath寻找用户框 核心代码: //截屏操作 File srcFile = ((TakesScreenshot)driver).getScree ...
- Python+Selenium基础入门及实践
Python+Selenium基础入门及实践 32018.08.29 11:21:52字数 3220阅读 23422 一.Selenium+Python环境搭建及配置 1.1 selenium 介绍 ...
随机推荐
- hadoop3.1伪分布式部署
1.环境准备 系统版本:CentOS7.5 主机名:node01 hadoop3.1 的下载地址: http://mirror.bit.edu.cn/apache/hadoop/common/hado ...
- Go简单的Goroutine示例
最简单的,接下来,会是竞争,加锁... package main import ( "fmt" "runtime" "sync" ) var ...
- AC日记——病毒侵袭 hdu 2896
2896 思路: 好题: 代码: #include <queue> #include <cstdio> #include <cstring> using names ...
- HDU 1039.Easier Done Than Said?-条件判断字符串
Easier Done Than Said? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/O ...
- POJ 3126 Prime Path【从一个素数变为另一个素数的最少步数/BFS】
Prime Path Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 26475 Accepted: 14555 Descript ...
- The 15th Zhejiang Provincial Collegiate Programming Contest Sponsored by TuSimple - M Lucky 7
Lucky 7 Time Limit: 1 Second Memory Limit: 65536 KB BaoBao has just found a positive integer se ...
- 【树上莫队】【带修莫队】bzoj3052 [wc2013]糖果公园
#include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using ...
- python3中的range函数
奇怪的现象 在paython3中 print(range(10)) 得出的结果是 range(0,10) ,而不是[0,1,2,3,4,5,6,7,8,9] ,为什么呢? 官网原话: In many ...
- 配置.net程序集搜索路径
默认情况下,.net程序对外部程序集dll的搜索路径是exe文件所在的目录,虽然这种方式没有什么太多不好的地方,但是当我们引用外部程序集较多的时候显得非常杂乱.一种比较常用的解决方式是通过配置在app ...
- windbg学习—-.ecxr
.ecxr 命令定位当前异常的上下文信息,并显示指定记录中的重要寄存器 0:000> .ecxr eax=10000000 ebx=7ffd9000 ecx=77386500 edx=002 ...