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 介绍 ...
随机推荐
- vs code 体验
今天用了一下 vs code, 第一感觉非常棒.用过 sublime text 和 vs 的经验.对vs code有一种曾相识的感觉. 在界面体验上,比目前用的 sublime text的感觉要好,比 ...
- 《javascript高级程序设计》读书小延伸
这本书已经读了几章了,想着试试能不能做出点东西,就简单的练了把手.觉得对于初学者,自己试着练练,效果还不错的. 挥刀要从轻的开始,起初的原因是和同事谈起曾经的逝水年华(小时候干的坏事)时说起了曾经的一 ...
- BZOJ 3223: Tyvj 1729 文艺平衡树-Splay树(区间翻转)模板题
3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 6881 Solved: 4213[Submit][Sta ...
- usaco1.4.3等差数列
为这道苟题鼓掌 题目: 一个等差数列是一个能表示成a, a+b, a+2b,…, a+nb (n=0,1,2,3,…)的数列.在这个问题中a是一个非负的整数,b是正整数.写一个程序来找出在双平方数集合 ...
- Web应用渗透测试框架Arachni
Web应用渗透测试框架Arachni Arachni是一款Ruby语言编写的Web应用渗透测试框架.当用户指定目标后,该框架可以自动扫描网站页面,对页面中的链接.表单.Cookie.HTTP He ...
- 杭电oj 1000
今天开始和一个认识的学弟刷题. 学弟是个大牛,我还是个菜鸟.嘿嘿. 杭电第一题我就wrong了好几次. #include <iostream> using namespace std; i ...
- SetTimer()函数使用
在编程时,会经常使用到定时器.使用定时器的方法比较简单,通常告诉Windows一个时间间隔,然后WINDOWS以此时间间隔周期性触发程序.通常有两种方法来实现:发送WM_TIMER消息和调用应用程序定 ...
- CentOS 安装 Zookeeper 版本任选
Zookeeper下载地址各种版本自己选择: https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/ Zookeeper 3.4.13版本下载地址 ...
- small test on 5.30 morning T3
经典的等价类计数问题,我们设 f(x) 为环长为 x 的时候的花环种类,那么答案显然等于 1/n * Σf( gcd (i,n) * [gcd(i,n)!=1] * [i>=0&&a ...
- 【数论】【组合数】【快速幂】【乘法逆元】洛谷 P2265 路边的水沟
从左上角到右下角,共经过n+m个节点,从其中选择n各节点向右(或者m各节点向下),所以答案就是C(n+m,n)或者C(n+m,m),组合数暴力算即可,但是要取模,所以用了乘法逆元. #include& ...