本系列所有代码 https://github.com/zhangting85/simpleWebtest
本文将介绍一个Java+TestNG+Maven+Selenium的web自动化测试脚本环境下selenium和testNG的多线程并发测试的实现,并提供全部代码。

这里我的多线程的执行测试用例,目的首先是为了提高测试执行速度,然后是为做分布式测试提供技术基础。

testNG自带了多线程机制,那么为什么要我们还要自己写一些代码呢?

因为selenium webdriver本身不是线程安全的。比如说,我直接在一个testNG的case里新建两个webdriver,再做操作,他们就会冲突。然后其中一个会死掉。

如果我们直接用testNG的多线程,也会遇到类似的问题。

这里,我用thread local来解决线程安全问题:

在DriverManager类中,

ThreadLocal的泛型变量的声明如下:

 /**
* 每个DriverManager只管理一个driver,所以他是static的,但是我引入ThreadLocal来处理多线程
* shares the same web driver and use thread local to handle the multi-thread
*/
public static ThreadLocal<WebDriver> ThreadDriver=new ThreadLocal<WebDriver>() ;

之后是执行case时,要获取一个可用的WebDriver对象来执行测试,此时调用DriverManger.getDriver()方法来取得。

当当前进程未绑定driver时,创建一个driver,如果已绑定driver,则直接返回。所谓给当前进程绑定一个driver,使用的是ThreadDriver.set(driver)。

 /**
* 如果当前进程没有绑定driver,创建一个然后绑定上,如果已经有了就直接返回
* create a driver for this thread if not exist. or return it directly
*/
public static WebDriver getDriver(){
WebDriver driver= DriverManager.ThreadDriver.get();
if (driver==null){
if (browserType.equals("firefox")){
driver = new EventFiringWebDriver(new FirefoxDriver()).register(new LogEventListener());
ThreadDriver.set(driver);
//找东西前等三秒wait 3 second for every find by
DriverManager.getDriver().manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
}
//有需求的同学自己在这里添加IE等浏览器的支持
//you can add ie/chrome or other driver here
}
return driver;
}

这样添加完之后,我们的webdriver已经变成了线程安全的。

之后就可以执行并发的测试,这里用了testng的dataprovider的多线程功能:

     /**
* 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("--------------------------------");
} /**
* 用了DataProvider并且是并行的。但是这个是运行不通过的。因为WebDriver不是线程安全的。
* 稍后我会再修复这个。。。暂时先这样吧。
*
* 2014-4-20:更新了DriverManager,现在这个框架里的WebDriver是线程安全的了,所以这个脚本就可以并行执行4个测试数据了。
* 详见DriverManager类
*
*/
@DataProvider(name="product_to_search",parallel = true)
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});//加了一个FirefoxDriver进去哦
}
return data.iterator(); }

当dataprovider设置了parallel参数为true时,测试即会并发执行。这里的真实并发数受到CPU内核数限制。

具体代码详见我的github

另外,使用了这些代码将webdriver和现成绑定,并使用testng提供的多线程功能后,这个测试框架下的测试用例变得可以简单得移植到selenium grid上,实现分布式测试。只需要再改动一下启动driver的代码。

下期再见。

selenium从入门到应用 - 8,selenium+testNG实现多线程的并发测试的更多相关文章

  1. Java自动化测试框架-11 - TestNG之annotation与并发测试篇 (详细教程)

    1.简介 TestNG中用到的annotation的快速预览及其属性. 2.TestNG基本注解(注释) 注解 描述 @BeforeSuite 注解的方法只运行一次,在当前suite所有测试执行之前执 ...

  2. selenium从入门到应用 - 7,testNG的DataProvider

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

  3. JMeter入门 | 第一个并发测试

    JMeter入门 | 第一个并发测试 背景 近期我们组新来了一些新同事,之前从来没有用过JMeter做个并发测试,于是准备了一系列小教程去指引新同事,本章主要是新人入门体验教程,快速实现第一个接口并发 ...

  4. Selenium 2 入门

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

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

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

  6. python爬虫入门(五)Selenium模拟用户操作

    爬虫(Spider),反爬虫(Anti-Spider),反反爬虫(Anti-Anti-Spider) 之间恢宏壮阔的斗争... 小莫想要某站上所有的电影,写了标准的爬虫(基于HttpClient库), ...

  7. python selenium webdriver入门基本操作

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

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

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

  9. selenium webdriver入门

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

随机推荐

  1. hdu 1669(二分图多重匹配)

    Jamie's Contact Groups Time Limit: 15000/7000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/ ...

  2. 肖申克的救赎 -Hope

    典狱长诺顿高高在上,平时道貌岸然,对圣经倒背如流,实际上攫取利益时不择手段,残酷.阴险而贪婪.狱警长海利和其他警员,凶狠残暴,充当诺顿的打手,草菅囚犯的人命.他们是不是象极了我们现实中的掌权阶层?我称 ...

  3. 0103 最短Hamilton路径【状压DP】

    0103 最短Hamilton路径 0x00「基本算法」例题 描述 给定一张 n(n≤20) 个点的带权无向图,点从 0~n-1 标号,求起点 0 到终点 n-1 的最短Hamilton路径. Ham ...

  4. java 时间格式化中的模式字母

    java日期格式化中的模式字母有特定的意义,由于没有注意,今天在做工程的时候导致出现了奇怪的日期: 错误写法如下: 然而得到了错误的结果: 正确写法如下: 这样就得到了正确的结果 mm指的是分钟,MM ...

  5. 第1天-html快速入门

    开发工具:HBuilder 创建项目: 在电脑本地磁盘创建项目目录,如"D:\project" 打开HBuilder,这个工具默认会创建一个项目,我们删掉即可,然后新建项目:&qu ...

  6. HashCode()的作用

    在实现Hash算法的集合里面,例如HashSet,该集合不能存放相同的数据,HashSet会根据对象的equals()和hashCode()方法来判断要存放的数据是否已经存在.Hash算法把HashS ...

  7. 【匈牙利算法】BZOJ1059-[ZJOI2007]矩阵游戏

    [题目大意] 给出一个局部染色的矩阵,问能否通过交换行或者列使得最后又一条对角线全部被染色过? [思路] 无论如何交换,同一行的格子依然在同一行,同一列的格子依然在同一列.所以只需找出n个行号列号均不 ...

  8. 13test02:阶乘

    //假设32位int型变量y是表示最大人数的x的阶乘,即y=x!,当x最大值取什么时,y取最大值 //,且乘法不溢出. #include<iostream> using namespace ...

  9. Jquery radio选中

    radio选中$("input[name=test][value=34]").attr("checked",true);//value=34的radio被选中$ ...

  10. 设置MySQL数据库名不区分大小写

    Linux下的MySQL默认是区分表名大小写的,通过如下设置,可以让MySQL不区分表名大小写: 1.用root登录,修改 /etc/my.cnf: 2.在[mysqld]节点下,加入一行: lowe ...