首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

UI 自动化分布式测试 -Docker Selenium Grid

  • 25-03-08 00:42
  • 3153
  • 7109
blog.csdn.net

Docker 和 Selenium Grid 的结合为分布式 UI 自动化测试提供了一种高效、可扩展且易于管理的方法。通过使用 Docker 容器化技术,测试环境的设置和配置变得更加简便和一致;而 Selenium Grid 则允许在多个节点上并行运行分布式测试,从而大大提升测试的速度和覆盖范围。

分布式测试Selenium Grid

对于大型项目或者有大量测试用例的项目,单机的测试环境往往无法快速完成所有测试用例的执行,此时自动化测试执行效率将会成为最大的瓶颈,Selenium Grid 可以通过多机的分布式架构允许测试用例并行运行,大大缩短了测试时间。

Selenium Grid 提供了多种运行模式,满足不同的测试需求和使用场景。包括Standalone模式、Selenium Grid模式。这些模式的选择取决于测试的规模、复杂度和并行执行的需求。

  • 传统部署:Hub和Node节点分别运行在不同物理机/虚拟机上,这种方式需要手动安装对应主机的各种依赖环境(比如JDK、浏览器、浏览器驱动等)

  • Docker容器部署:Hub和Node节点分别运行在不同主机的docker容器中,通过Docker-Selenium开源项目所提供的Hub和Node节点镜像可以快速启动对应的节点,而不需要配置任何的环境。

  • 与Kubernetes集成:在更大规模和复杂的环境中,可以使用K8S来动态扩展和管理Selenium Grid。Kubernetes提供了更强大的调度和扩展能力,适合企业级应用。

  • Standalone模式:适用于简单的单机测试场景,Selenium Grid所有节点都是在同一个进程中执行。这种模式设置简单,只适合进行小规模测试。

  • Hub and Nodes模式:通过Hub和多个Node实现并行执行,适合大规模测试场景,能够有效提高测试效率。企业级应用中一般我们会采取该模式,在此模式下有不同的部署方式:

Docker-Selenium介绍

Docker-Selenium 是一种将 Selenium Grid 与 Docker 容器技术结合的解决方案,能够简化 Selenium Grid 的部署和管理。通过使用 Docker 容器,用户可以快速创建和销毁 Selenium Grid 环境,而不需要手动配置每个节点,极大地提高了测试环境的可移植性和可扩展性

项目地址:https://github.com/SeleniumHQ/docker-selenium/

具备的优势:

  1. 简化部署:使用 Docker,可以在几分钟内启动完整的 Selenium Grid 环境,而不需要复杂的安装和配置过程。

  2. 环境隔离:每个 Docker 容器都运行在独立的环境中,确保测试之间互不干扰。

  3. 可移植性:Docker 镜像可以在任何支持 Docker 的平台上运行,使得测试环境具有高度的一致性和可移植性。

  4. 扩展性:通过 Docker Compose 等工具,可以轻松扩展或缩减节点数量,以满足测试需求。

启动hub节点

docker run -d -p 4442-4444:4442-4444 --name selenium-hub selenium/hub:latest

参数-p 4442-4444:4442-4444 分别映射主机到容器内部端口(4442、4442、4444)

  • 4442端口是Selenium Grid 事件总线发布事件的端口(必须开放出来)

  • 4443端口是Selenium Grid 组件订阅事件的端口(必须开放出来)

  • 4444端口是Selenium Grid 控制台访问端口

输入对应地址即可访问Selenium Grid控制台 http:<你的hub节点主机IP地址>:4444

图片

此时控制台并没有什么信息,是因为我们的node节点还没有启动注册到hub节点

启动node节点

启动node1节点 - chrome浏览器环境
docker run -d -p 5900:5900 -p 5555:5555 \    --shm-size="2g" \    -e SE_EVENT_BUS_HOST=192.168.10.100 \    -e SE_EVENT_BUS_PUBLISH_PORT=4442 \    -e SE_EVENT_BUS_SUBSCRIBE_PORT=4443 \    -e SE_NODE_HOST=192.168.10.101 \    -e SE_NODE_MAX_SESSIONS=6 \    -e SE_NODE_OVERRIDE_MAX_SESSIONS=true \    -e SE_VNC_NO_PASSWORD=1 \    --name node1 selenium/node-chrome:latest

参数解释:

  • -p 5900:5900 5900端口是容器VNC服务的访问端口,使用VNC服务可以连接到容器内部观察容器的运行情况

  • -p 5555:5555 5555端口负责hub与node节点之间的注册和通讯

--shm-size:设置容器的共享内存大小

--shm-size="2g"参数的必要性:

This is a known workaround to avoid the browser crashing inside a docker container, here are the documented issues for Chrome and Firefox. The shm size of 2gb is arbitrary but known to work well, your specific use case might need a different value, it is recommended to tune this value according to your needs.

  • SE_EVENT_BUS_HOST:hub节点的IP地址

  • SE_EVENT_BUS_PUBLISH_PORT:hub节点的事件总线发布事件的端口,与前面hub节点配置对应

  • SE_EVENT_BUS_SUBSCRIBE_PORT:hub节点的组件订阅事件的端口,与前面hub节点配置对应

  • SE_NODE_HOST:当前node节点的IP地址

  • SE_NODE_MAX_SESSIONS:node节点支持的最大会话数,该配置在并发测试时十分关键,比如值为3时代表支持最大并发测试数为3

  • SE_NODE_OVERRIDE_MAX_SESSIONS:当设置上述的SE_NODE_MAX_SESSIONS参数时,该参数也需要一并指定

  • SE_VNC_NO_PASSWORD:设置VNC访问时不需要密码,这样调试更加方便

启动node2节点 - firefox浏览器环境
docker run -d -p 5900:5900 -p 5555:5555 \    --shm-size="2g" \    -e SE_EVENT_BUS_HOST=192.168.10.100 \    -e SE_EVENT_BUS_PUBLISH_PORT=4442 \    -e SE_EVENT_BUS_SUBSCRIBE_PORT=4443 \    -e SE_NODE_HOST=192.168.10.102 \    -e SE_NODE_MAX_SESSIONS=6 \    -e SE_NODE_OVERRIDE_MAX_SESSIONS=true \    -e SE_VNC_NO_PASSWORD=1 \    --name node2 selenium/node-firefox:latest
启动node3节点 - edge浏览器环境
docker run -d -p 5900:5900 -p 5555:5555 \    --shm-size="2g" \    -e SE_EVENT_BUS_HOST=192.168.10.100 \    -e SE_EVENT_BUS_PUBLISH_PORT=4442 \    -e SE_EVENT_BUS_SUBSCRIBE_PORT=4443 \    -e SE_NODE_HOST=192.168.10.100 \    -e SE_NODE_MAX_SESSIONS=6 \    -e SE_NODE_OVERRIDE_MAX_SESSIONS=true \    -e SE_VNC_NO_PASSWORD=1 \    --name node3 selenium/node-edge:latest

再进入到hub控制台 http:<你的hub节点主机IP地址>:4444即可看到node节点的情况:

图片

VNC查看node节点容器

docker-selenium项目使用了x11vnc作为VNC服务,用户能够通过VNC客户端工具VNC Viewer查看容器内部的情况

VNC Viewer下载地址:https://www.realvnc.com/en/connect/download/viewer/

VNC服务在容器内部监听5900端口,之前启动node节点时有将node节点容器的5900端口映射到主机5900端口,我们使用连接即可

图片

图片

至此我们的Selenium Grid分布式的环境就准备好了,接下来我们需要调自动化脚本执行并发测试

python并行执行测试

为了并行执行测试,python需要使用多进程/多线程技术实现同时执行多个脚本,向selenium Grid的hub节点发送请求,hub节点会根据接收到的请求分发给指定的node节点执行,这里我们可以使用python的pytest-xdist库来实现并发执行测试

pytest-xdist是 pytest 测试框架插件,用于使得测试并行执行,能显著提高测试执行的速度。可以通过多核或多CPU以及多台机器来加速测试过程。

安装pytest-xdist:

# 首先确保已经安装了pytestpip install pytest# 再安装pytest-xdistpip install pytest-xdist

示例python代码remote_webdriver.py如下:

# coding=utf-8import timeimport pytestfrom selenium import webdriverfrom selenium.webdriver.common.by import By
@pytest.fixturedef init_driver():    hub_url = "http://192.168.10.100:4444/wd/hub"    # 定义要使用的浏览器和版本    capabilities = {        'browserName': 'chrome',  # 指定浏览器        'version': '125.0',      # 指定版本(latest代表最新版本)    }    # 创建远程 WebDriver 实例    driver = webdriver.Remote(command_executor=hub_url, desired_capabilities=capabilities)    yield driver    driver.quit()
def test_001(init_driver):    init_driver.get("http://wwww.baidu.com")    init_driver.find_element(By.ID,'kw').send_keys("柠檬班001")    time.sleep(5)
def test_002(init_driver):    init_driver.get("http://wwww.baidu.com")    init_driver.find_element(By.ID,'kw').send_keys("柠檬班002")    time.sleep(5)
def test_003(init_driver):    init_driver.get("http://wwww.baidu.com")    init_driver.find_element(By.ID,'kw').send_keys("柠檬班003")    time.sleep(5)

在控制台中执行命令:

pytest remote_webdriver.py -s -v -n 3

pytest-xdist只需要指定-n参数即可设置并发数,-s、-v参数可以让控制台日志更加详细

控制台输出如下:

====================================================================== test session starts ======================================================================platform win32 -- Python 3.8.8, pytest-6.2.4, py-1.11.0, pluggy-0.13.1 -- c:\python\python38\python.execachedir: .pytest_cachemetadata: {'Python': '3.8.8', 'Platform': 'Windows-10-10.0.19041-SP0', 'Packages': {'pytest': '6.2.4', 'pluggy': '0.13.1'}, 'Plugins': {'allure-pytest': '2.13.2', 'Faker': '19.6.0', 'assume': '2.4.3', 'html': '3.1.1', 'metadata': '2.0.4', 'repeat': '0.9.1', 'xdist': '3.3.1'}, 'JAVA_HOME': 'C:\\Program Files\\Java\\jdk1.8.0_251'}rootdir: D:\workspace_pycharm\study\webplugins: allure-pytest-2.13.2, Faker-19.6.0, assume-2.4.3, html-3.1.1, metadata-2.0.4, repeat-0.9.1, xdist-3.3.13 workers [3 items]   scheduling tests via LoadScheduling
remote_webdriver.py::test_003remote_webdriver.py::test_001remote_webdriver.py::test_002[gw0] PASSED remote_webdriver.py::test_003 ================================================================ 3 passed, 30 warnings in 20.04s ================================================================ 
  • 控制台日志中显示3 workers [3 items] 其中3 workers代表pytest-xdist派生出了三个工作进程,3 items代表pytest收集到了三条用例

  • scheduling tests via LoadScheduling代表将会按照负载均衡分配测试用例执行

通过VNC可以看到node节点中同时打开了三个chrome浏览器(其中一个浏览器的页面被遮挡住了)

图片

Java并行执行测试

如果采用的是Java语言,可以使用TestNG测试框架的parallel机制,通过配置xml文件即可非常简单的实现并行测试

"1.0" encoding="utf-8" ?>suite SYSTEM "https://testng.org/testng-1.0.dtd" ><suite name="测试套件" parallel="tests" thread-count="3">
    <test name="test01">        <classes>            <class name="com.testcases.LoginTest"/>        </classes>    </test>
    <test name="test02">        <classes>            <class name="com.testcases.RegisterTest"/>        </classes>    </test>
    <test name="test02">        <classes>            <class name="com.testcases.SearchTest"/>        </classes>    </test>
</suite>
@BeforeTestpublic void setup(String browserName){    // 配置对象    DesiredCapabilities capabilities = new DesiredCapabilities();    // 配置测试的浏览器    capabilities.setBrowserName("chrome");    capabilities.setVersion("125.0");    String hubUrl = "http://192.168.10.100:4444/wd/hub";    try {        driver = new RemoteWebDriver(new URL(hubUrl), capabilities);    } catch (MalformedURLException e) {        e.printStackTrace();    }

拉取指定浏览器版本node节点

有些时候我们不需要使用最新版本的浏览器容器环境,想要指定对应版本的浏览器

我们可以查询docker仓库镜像的tag

https://hub.docker.com/r/selenium/node-chrome/tags

图片

docker pull selenium/node-chrome:120.0-chromedriver-120.0-20240123
  • node-chrome:120.0代表浏览器版本号

  • chromedriver-120.0代表内置chromedriver版本号

  • 20240123代表发布日期

 最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走! 希望能帮助到你!【100%无套路免费领取】

软件测试小dao
微信公众号
软件测试资料共享(文档、视频、笔记源码)
注:本文转载自blog.csdn.net的yoyo小小汐~的文章"https://blog.csdn.net/weixin_57794111/article/details/142556148"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

127
测试
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top