本系列所有代码 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的更多相关文章

  1. selenium从入门到应用 - 8,selenium+testNG实现多线程的并发测试

    本系列所有代码 https://github.com/zhangting85/simpleWebtest本文将介绍一个Java+TestNG+Maven+Selenium的web自动化测试脚本环境下s ...

  2. Selenium 2 入门

    在多个浏览器中进行 Web 应用程序的端到端功能测试 Selenium 是一款有名的 Web 应用程序测试框架,用于进行功能测试.新版本 Selenium 2 结合了 Selenium 1 和 Web ...

  3. 元素(WebElement)-----Selenium快速入门(三)

    上一篇<元素定位-----Selenium快速入门(二)>说了,如何定位元素,本篇说说找到的元素(WebElement)该怎么用. WebElement常用方法:  返回值  方法名  说 ...

  4. python selenium webdriver入门基本操作

    python selenium webdriver入门基本操作 未经作者允许,禁止转载! from selenium import webdriver import time driver=webdr ...

  5. 隐式等待-----Selenium快速入门(九)

    有时候,网页未加载完成,或加载失败,但是我们后续的代码就已经开始查找页面上的元素了,这通常将导致查找元素失败.在本系列Selenium窗口切换-----Selenium快速入门(六)中,我们就已经出现 ...

  6. selenium webdriver入门

    写在前面:最近在研究UI自动化测试的过程中,发现公司里通常用的是AutomanX框架,而这个框架实际上是基于selenium webdriver框架的,所以在编写测试用例时,很多语法都是直接使用sel ...

  7. selenium从入门到应用 - 4,页面对象设计模式的实现

    本系列所有代码 https://github.com/zhangting85/simpleWebtest 本文将介绍一个Java+TestNG+Maven+Selenium的web自动化测试脚本环境下 ...

  8. Selenium | 基础入门 | 截屏并保存于本地

    可先参考   Selenium | 基础入门 | 利用Xpath寻找用户框 核心代码: //截屏操作 File srcFile = ((TakesScreenshot)driver).getScree ...

  9. Python+Selenium基础入门及实践

    Python+Selenium基础入门及实践 32018.08.29 11:21:52字数 3220阅读 23422 一.Selenium+Python环境搭建及配置 1.1 selenium 介绍 ...

随机推荐

  1. 使用python获取整月每一天的系统监控数据生成报表

    1.安装阿里开源监控工具tsar tsar官方网站 wget -O tsar.zip https://github.com/alibaba/tsar/archive/master.zip --no-c ...

  2. 使用bottle进行web开发(4):HTTPError

    from bottle import error @error(404) def error404(error): return 'Nothing here, sorry' 上述代码,是对404的定义 ...

  3. Spring:与Redis的集成

    一个月没写过博客了,一直想记录一下之前学习的Redis的有关知识,但是因为四月太过于慵懒和忙碌,所以一直没有什么机会,今天就来讲讲,如何使用Spring当中的Spring-data-redis去与Re ...

  4. 【转.解析清晰】你真明白 Python 装饰器么?

      原文出处: 武沛齐    装饰器是程序开发中经常会用到的一个功能,用好了装饰器,开发效率如虎添翼,所以这也是Python面试中必问的问题,但对于好多小白来讲,这个功能 有点绕,自学时直接绕过去了, ...

  5. [UML] 如何找参与者、找用例

    如何找参与者 1.谁会来使用这个系统? 2.谁会来安装这个系统? 3.谁会来启动这个系统? 4.谁会来维护这个系统? 5.谁会来关闭这个系统? 6.哪些系统会来使用这个系统? 7.谁会从这个系统获取信 ...

  6. (13)python 正则表达式

    匹配单个字符 f. o    f和o之间是任意字符   例如:fbo123 .. 任意两个字符 \.用来匹配. 边界匹配 the     表示包含the的任何字符串 ^from 表示以from开头的所 ...

  7. 利用PyPDF2删除PDF文件首页

    前话:有个朋友让我给他编辑他们公司的PDF文件,签名的日期时间不对,需要进(nong)行(xu)优(zuo)化(jia).而我手上只有两个管理pdf的软件,一个福晰阅读器,还有一个福晰编辑器.但是阅读 ...

  8. Counting Haybales (线段树)

    Counting Haybales 时间限制: 50 Sec  内存限制: 256 MB提交: 52  解决: 18[提交][状态][讨论版] 题目描述 Farmer John is trying t ...

  9. ASP.NET Core 2.2 基础知识(十八) 托管和部署 概述

    为了方便演示,以 .NET Core 控制台应用程序讲解. 我们新建一个控制台应用程序,安装 "Newtonsoft.Json" Nuget 包,然后右键点击该项目,选择" ...

  10. leetcode191 Number of 1 Bit

    题意:一个int类型正整数,求它的二进制形式有多少个1 思路:除2递归,可以解出,看了discuss里面有个解更牛,一行结束战斗,是用n&(n-1)再递归,其实并不是很懂怎么想出来这么做的,可 ...