selenium从入门到应用 - 8,selenium+testNG实现多线程的并发测试
本系列所有代码 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实现多线程的并发测试的更多相关文章
- Java自动化测试框架-11 - TestNG之annotation与并发测试篇 (详细教程)
1.简介 TestNG中用到的annotation的快速预览及其属性. 2.TestNG基本注解(注释) 注解 描述 @BeforeSuite 注解的方法只运行一次,在当前suite所有测试执行之前执 ...
- selenium从入门到应用 - 7,testNG的DataProvider
本系列所有代码 https://github.com/zhangting85/simpleWebtest 本文将介绍一个Java+TestNG+Maven+Selenium的web自动化测试脚本环境下 ...
- JMeter入门 | 第一个并发测试
JMeter入门 | 第一个并发测试 背景 近期我们组新来了一些新同事,之前从来没有用过JMeter做个并发测试,于是准备了一系列小教程去指引新同事,本章主要是新人入门体验教程,快速实现第一个接口并发 ...
- Selenium 2 入门
在多个浏览器中进行 Web 应用程序的端到端功能测试 Selenium 是一款有名的 Web 应用程序测试框架,用于进行功能测试.新版本 Selenium 2 结合了 Selenium 1 和 Web ...
- 元素(WebElement)-----Selenium快速入门(三)
上一篇<元素定位-----Selenium快速入门(二)>说了,如何定位元素,本篇说说找到的元素(WebElement)该怎么用. WebElement常用方法: 返回值 方法名 说 ...
- python爬虫入门(五)Selenium模拟用户操作
爬虫(Spider),反爬虫(Anti-Spider),反反爬虫(Anti-Anti-Spider) 之间恢宏壮阔的斗争... 小莫想要某站上所有的电影,写了标准的爬虫(基于HttpClient库), ...
- python selenium webdriver入门基本操作
python selenium webdriver入门基本操作 未经作者允许,禁止转载! from selenium import webdriver import time driver=webdr ...
- 隐式等待-----Selenium快速入门(九)
有时候,网页未加载完成,或加载失败,但是我们后续的代码就已经开始查找页面上的元素了,这通常将导致查找元素失败.在本系列Selenium窗口切换-----Selenium快速入门(六)中,我们就已经出现 ...
- selenium webdriver入门
写在前面:最近在研究UI自动化测试的过程中,发现公司里通常用的是AutomanX框架,而这个框架实际上是基于selenium webdriver框架的,所以在编写测试用例时,很多语法都是直接使用sel ...
随机推荐
- poj 1192(树形DP)
最优连通子集 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 2589 Accepted: 1382 Descriptio ...
- Eclipse,myeclipse安装 配置Maven
本文转自http://www.cnblogs.com/timeng/archive/2013/05/07/maven_install.html myeclipse自带了maven插件,但是和原生插件还 ...
- CentOS 7 安装PHP7+Nginx+Mysql5.7开发环境
安装PHP&PHP-FPM 首先更新一下CentOS7系统,对系统软件做一下升级,这里不升级内核. //使用root权限,注意这里使用upgrade,而不是update(它会升级内核,这里我们 ...
- jQuery 立即执行
;(function($){// 可以去掉开头的 ; (分号),国外的开发人员编写的插件时的一种习惯 $.fn.pluginName = function() { // Our plugin impl ...
- 使用 gulp 压缩 JS
使用 gulp 压缩 JS 请务必理解如下章节后阅读此章节: 安装 Node 和 gulp 压缩 js 代码可降低 js 文件大小,提高页面打开速度.在不利用 gulp 时我们需要通过各种工具手动完成 ...
- (八)MySQL索引操作
(1)准备环境 mysql> create table t1(id int,name varchar(50)); mysql> \d $$ mysql> create procedu ...
- STL模板整理 set
SET set作为一个容器也是用来存储同一数据类型的数据类型,并且能从一个数据集合中取出数据,在set中每个元素的值都唯一,而且系统能根据元素的值自动进行排序.应该注意的是set中数元素的值不能直接被 ...
- 认识createDocumentFragment
今天在看vue源码解析时候发现一个api没有见过,一查是原生的,赶紧补漏. DocumentFragments 是DOM节点.它们不是主DOM树的一部分.通常的用例是创建文档片段,将元素附加到文档片段 ...
- web前端读取文本文件内容
html5+js实现,参照xxyy888的CSDN博客文章<使用HTML+javascrpt读取txt文本文件>失败,将作者文章中的代码重新整理了下依然不行,文章代码存在的问题是括号错误, ...
- 【单调队列】【动态规划】bzoj3831 [Poi2014]Little Bird
f(i)=min{f(j)+(D(j)<=D(i))} (max(1,i-k)<=j<=i) 有两个变量,很难用单调队列,但是(引用): 如果fi<fj,i一定比j优秀.因为如 ...