pytest结合selenium grid实现web自动化测试并发执行

image.png

pytest、selenium分别是自动化测试领域使用非常频繁的单元测试框架、web测试框架,当团队自动化用例达到一定数量后,如果仅在一台执行机上执行,执行时间就可能会达到几个小时以上,无法满足版本发布节点的时间要求,如何减少总的自动化用例执行时间就是不得不解决的问题,本文介绍采用pytest、selenium grid实现自动化用例的并发分布式执行方案,针对pytest和selnium本身不做详细讲解,阅读本文前你需要有pytest和selenium使用经验。

什么是selenium grid?

selenium grid是开源selenium工具集的一部分,允许你在多台机器的多个浏览器上并行的进行测试,也就是说,你可以同时运行多个测试。本质上来说就是,selenium grid支持分布式的测试执行。它可以让你的测试在一个分布式的执行环境中运行。

通常,以下两种情况你会需要使用 selenium grid:

  • 在多个浏览器中运行测试,在多个版本的浏览器中进行测试,或在不同操作系统的浏览器中进行测试。

  • 减少测试运行时间。

selenium grid由一个中心Hub节点和大于等于1个的Node节点组成,所有的Node节点都要注册到Hub节点。测试执行时所有的请求发送到Hub节点,Hub节点再将执行指令分发到多个注册的Node节点,Node节点是真正执行Web测试的节点,就相当于selenium本机执行一样,Node节点也需要事先配置好Webdriver并将Webdriver路径加入到环境变量中。这里有几点需要重点澄清:

  • selenium grid只是将webdriver分发到多个分布式Node节点执行,就相当于只是借用Node节点的浏览器而已,仅此而已,整体运行流程和单个执行机执行没有区别。

  • selenium grid只是具备分布式运行能力,但是本身运行并不是并发的,也就是说默认情况下即使使用了selenium grid,用例仍然是按照顺序执行完毕一个才会执行下一个,总的执行时间并不会减少,还需要配合其他的并发机制来做到降低执行时间。

  • Hub和Node节点可以部署在同一台执行机上,也可以部署在不同的执行机上;同一台执行机也可以支持启动多个Node节点。往往自动化用例执行期间对系统资源的消耗并不高,如果一台服务器只开启一个运行实例必然造成资源的浪费,况且在实际情况下,团队往往也不可能提供足够充裕的执行机用于自动化测试,因此在一台执行机上启动多个运行实例就非常有用,可以大大减少硬件资源的投入。

selenium grid的部署

1. 下载selenium grid

我调测下载的是selenium grid3版本

www.selenium.dev

图片

2. 因为我只有一台电脑用来调测,所以Hub和Node节点我都部署在一台执行机上,规划如下

| Hub节点 | 192.168.31.200:4444 |
| Node节点1 | 192.168.31.200:5555 |
| Node节点2 | 192.168.31.200:5556 |

3. 打开cmd窗口,启动Hub节点

java -jar selenium-server-standalone-3.141.59.jar -role hub -port 4444
图片

4. 打开两个新的cmd窗口,启动Node1、Node2节点

注:Node节点需要下载正确的webdriver,并将webdriver路径加入到系统环境变量中,本文仅以chrome webdriver进行举例,如需其他浏览器执行用例,请类比自行完成相关配置。

java -jar selenium-server-standalone-3.141.59.jar -role node  -hub http://192.168.31.200:4444/grid/register/ -browser "browserName=chrome,maxinstance=5,platform=WINDOWS" -port 5555java -jar selenium-server-standalone-3.141.59.jar -role node  -hub http://192.168.31.200:4444/grid/register/ -browser "browserName=chrome,maxinstance=5,platform=WINDOWS" -port 5556
图片
图片

5. 浏览器访问URL:192.168.31.200:4444/gri 可以看到两个Node节点已正常注册,至此selenium grid部署完成。实际情况下,Node节点往往需要部署到多个不同的服务器或虚拟机上,单台服务器或虚拟机往往也有必要部署多个Node节点以节省硬件资源需求。

图片

pytest-xdist实现并发执行测试用例

本文前面提到selenium grid执行并不是并发的,要实现并发执行测试用例还需要多线程机制配和,pytest-xdist插件支持多线程并发执行测试用例,首先使用pip安装pytest-xdist插件。

pip install pytest-xdist

安装成功后,执行如下命令即可实现并发执行,其中-n后面的参数表示cpu的数量,也可以指定为auto,它会自动检测cpu核数并发运行用例。

pytest -n 6pytest -n auto

另外,selenium需要通过Remote方式执行,以chrome为例,关键部分的代码如下:

from selenium import webdriverdriver = webdriver.Remote(command_executor="http://192.168.31.200:4444/wd/hub"),                          desired_capabilities={                             "browserName": "chrome",                             "javascriptEnabled": True                          })driver.get("https://www.baidu.com")driver.find_element_by_id("kw").send_keys("search content")driver.find_element_by_xpath('//input[@type="submit"]').click()

相比于非Remote方式,仅仅是新建webdriver实例的方式不同,如果以前的测试代码是以本地方式执行,则仅需将webdriver.Chrome创建实例方法修改为webdriver.Remote方法,其中command_executor参数仅需传入Hub节点的连接,实际执行时Hub节点会自动选择已注册的Node节点进行执行,同时Hub节点也会自动检测到失效的节点并及时将其剔除。

pytest结合selenium grid进行并发执行结果参考如下:

图片

你可能感兴趣的:(pytest结合selenium grid实现web自动化测试并发执行)