本系列所有代码 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嘛。

最新文章

  1. 【探索】机器指令翻译成 JavaScript
  2. oracle一次给多表添加相同字段
  3. Linux服务器模型及其对应的程序流程
  4. 第九章 硬件抽象层:HAL
  5. toUnsignedString详解
  6. Linux下调试程序方法
  7. Hibernate+jsp+struts+spring做增删该查,
  8. 第 12 章 CSS 入门
  9. F5负载均衡的初识和基本配置
  10. cs11_c++_lab1
  11. Java 中的instanceof简单讲解
  12. 无线路由器的设置_不能通过wifi进行设置
  13. java中ArrayList 、LinkList区别
  14. OLAP、OLTP的介绍和比较 via csdn
  15. ThreadPool.QueueUserWorkItem的性能问题
  16. JS 冒泡排序从学到优化
  17. 单源最短路径 dijkstra算法实现
  18. unix命令自我总结
  19. Oracle + Mybatis批量插入数据,xml.mapper种的写法
  20. sql 储存过程的使用

热门文章

  1. Selenium2+python自动化26-js处理内嵌div滚动条【转载】
  2. Django组件之contenttype的应用
  3. c#读取LOG文件并解决读取提示被其他进程占用问题
  4. AC日记——病毒侵袭 hdu 2896
  5. 洛谷 P1177 【模板】快速排序 【快速排序/multiset排序】
  6. Codeforces Round #442 A Alex and broken contest【字符串/常量数组/string类】
  7. Problem I: 打印金字塔
  8. Scala实战高手****第2课:Scala零基础实战入门的第一堂课及如何成为Scala高手
  9. Windows 系统下设置Nodejs NPM全局路径和环境变量配置
  10. HDU 4606 Occupy Cities (计算几何+最短路+二分+最小路径覆盖)