如何在Selenium Grid中并行运行pytest标记的大量测试用例
pytest + Selenium Grid 并行执行配置方案
核心原因
当前执行串行的本质是:单pytest进程只会维持1个和Selenium Grid的远程会话,所有用例共用同一个driver实例,自然只能串行运行。要实现并行,需要通过pytest分布式插件启动多个独立worker进程,每个进程单独向Grid申请会话slot,分发用例执行。
操作步骤
- 安装分布式执行依赖
直接安装pytest-xdist,这是pytest官方维护的分布式执行插件:
pip install pytest-xdist
- 调整测试代码的driver初始化逻辑
禁止使用全局driver实例,必须通过pytest fixture为每个执行单元注入独立的driver,参考conftest.py写法:
import pytest from selenium import webdriver from selenium.webdriver.chrome.options import Options as ChromeOptions @pytest.fixture(scope="function") def driver(): # 替换为你自己的Selenium Grid Hub地址 chrome_options = ChromeOptions() chrome_options.set_capability("browserName", "chrome") # 可按需添加其他capability配置,比如浏览器版本、运行平台等 driver = webdriver.Remote( command_executor="http://your-grid-hub-ip:4444/wd/hub", options=chrome_options ) yield driver driver.quit()
注意:如果你的用例按类组织、同一个类里的用例可以共用同一个driver,可以把fixture的scope改成
class,对应调整分发策略即可。
- 调整执行命令
在原有命令基础上加上并行参数,并行数匹配你Selenium Grid当前可用的最大会话slot数即可,比如Grid支持8个并行浏览器会话,命令如下:
pytest -s -v -m smoketest -n 8
常用参数说明
-n <数字>:指定启动的worker进程数,每个worker会独立向Grid发起会话请求,并行执行分到的用例。不要把这个值设得超过Grid的最大并发容量,否则多余请求会排队,不会提升执行效率。--dist loadscope:按测试作用域分发用例,同一个测试类/模块的用例会分配给同一个worker执行,减少driver重复初始化的开销。--dist loadfile:按测试文件分发用例,同一个py文件下的所有用例交给同一个worker执行,适合文件间用例无关联、单文件内用例可共用driver的场景。
避坑提示
- 并行模式下不保证用例执行顺序,必须先解除用例之间的前后依赖,否则会出现随机失败。
- 不要给driver fixture设
session级别的作用域,否则所有worker会共用同一个driver实例,完全失去并行意义,还会出现用例互相干扰的问题。 - 原有
-m smoketest的标记筛选逻辑在并行模式下完全生效,不需要额外调整,worker会自动过滤出符合标记的用例执行。
内容的提问来源于stack exchange,提问作者Imran
相关产品推荐
相关产品推荐

