当前位置: 首页 > news >正文

使用 pytest-xdist 进行高效并行自动化测试

pytest-xdist 是 pytest 的一个扩展插件,主要用于实现测试用例的并行执行和分布式测试。通过利用多进程或者多机分布式的方式,pytest-xdist 能够显著缩短测试执行时间,提升持续集成(CI)流程的效率。

在自动化测试中,当测试用例数量庞大时,单进程顺序执行的速度往往难以满足需求。pytest-xdist是基于 pytest 的一个插件:

  • 在单台机器上利用多进程并行运行测试,充分利用多核 CPU 的优势;

  • 实现分布式测试,在多台机器上同时执行测试;

  • 结合负载均衡策略(按用例、文件或模块分配任务),提高并行执行的效率;

  • 支持自动失败重试、覆盖率统计等功能;

利用多进程并行或分布式执行测试用例,这不仅能显著缩短测试运行时间,还能提升 CI/CD 流程的效率。

安装与基本使用

安装

通过 pip 安装 pytest-xdist 非常简单:

pip install pytest-xdist

安装后,可以通过pytest -h查看新增的命令行选项。

基本命令

最简单的并行运行命令是使用-n选项:

pytest -n 4

这里4表示使用 4 个进程并行运行测试

如果希望自动检测系统的 CPU 核心数,并充分利用所有资源,可以使用:

pytest -n auto

简单示例

下面是一个简单的示例,如何结合 pytest-xdist 进行并行测试

示例文件:test_sample.py

  1. import time

  2. def test_one():

  3. time.sleep(1)

  4. assert True

  5. def test_two():

  6. time.sleep(1)

  7. assert True

  8. def test_three():

  9. time.sleep(1)

  10. assert True

  11. def test_four():

  12. time.sleep(1)

  13. assert True

运行以下命令来并行执行上述 4 个测试用例:

pytest -n 4 test_sample.py

此命令会将 4 个测试用例分配到 4 个进程中同时运行,从而显著减少总体执行时间。

负载均衡策略

pytest-xdist 支持多种负载均衡策略,通过--dist参数进行配置:

策略说明
--dist=load按测试用例均衡分配,默认策略。
--dist=loadscope按测试模块分配,确保同一模块内的用例在同一进程执行,减少数据共享冲突。
--dist=loadfile按文件级别分配测试,适用于每个文件测试之间相互独立的场景。

例如,按模块进行负载均衡:

pytest -n 4 --dist=loadscope

负载均衡策略可以根据项目的实际情况和测试用例的特点灵活选择:

  • load策略适合大多数测试用例都较为独立且执行时间均衡的情况,通过精细地按用例分配,能最大化利用多核 CPU 的优势。

  • loadscope策略在模块内测试共享资源或有较重初始化开销时更有优势,能够减少重复工作并控制状态影响范围

  • loadfile策略则适用于需要文件级别隔离的情况,保证每个测试文件内部的状态一致性,同时避免重复加载资源。

Selenium 并行 UI 自动化测试案例

在自动化测试中,Selenium 常用于 Web UI 测试,而 pytest-xdist 则能通过多进程并行运行测试用例,大幅缩短整体执行时间。

将二者结合使用时,需要注意以下几点:

  • 独立 WebDriver 实例:由于测试在不同进程中并行执行,每个进程都必须创建自己的 WebDriver 实例,不能共享同一个浏览器驱动。

  • 环境隔离:确保各个进程中的测试环境(如浏览器驱动、配置文件等)互不干扰,避免因资源竞争导致测试失败。

示例文件:test_multiple_search.py

  1. import pytest

  2. from selenium import webdriver

  3. from selenium.webdriver.common.by import By

  4. def create_driver():

  5. options = webdriver.ChromeOptions()

  6. options.add_argument('--headless') # 使用无头模式

  7. options.add_argument('--disable-gpu')

  8. options.add_argument('--no-sandbox')

  9. options.add_argument('--window-size=1920,1080')

  10. return webdriver.Chrome(options=options)

  11. @pytest.fixture(scope="function")

  12. def driver():

  13. driver_instance = create_driver()

  14. yield driver_instance

  15. driver_instance.quit()

  16. def test_google_search(driver):

  17. # 测试 百度 搜索

  18. driver.get("https://www.baidu.com")

  19. search_box = driver.find_element(By.ID, "kw")

  20. search_box.send_keys("pytest-xdist")

  21. search_box.submit()

  22. driver.implicitly_wait(3)

  23. assert "pytest-xdist" in driver.page_source

  24. def test_bing_search(driver):

  25. # 测试 Bing 搜索

  26. driver.get("https://www.bing.com")

  27. search_box = driver.find_element(By.NAME, "q")

  28. search_box.send_keys("pytest-xdist")

  29. search_box.submit()

  30. driver.implicitly_wait(3)

  31. assert "pytest-xdist" in driver.page_source

  32. def test_duckduckgo_search(driver):

  33. # 测试 DuckDuckGo 搜索

  34. driver.get("https://www.duckduckgo.com")

  35. search_box = driver.find_element(By.NAME, "q")

  36. search_box.send_keys("pytest-xdist")

  37. search_box.submit()

  38. driver.implicitly_wait(3)

  39. assert "pytest-xdist" in driver.page_source

使用 pytest-xdist 的-n参数启动并行执行,例如:

pytest -n 3 test_multiple_search.py

这将启动 3 个进程,每个进程各自运行不同的测试用例,从而加速整体测试执行。

Appium 移动端测试案例

在移动端自动化测试中,Appium 是一个常用工具,而 pytest-xdist 则可以将测试用例并行执行,从而大幅缩短总的测试时间。下面以 Android 计算器应用为例,展示如何利用 pytest-xdist 并行测试 App 的功能。

示例文件:test_calculator_app.py

本示例中包含两个测试用例:一个测试加法,一个测试减法。每个测试用例通过 pytest fixture 独立创建一个 Appium WebDriver 实例,确保并行运行时互不干扰。​​​​​​​

  1. import pytest

  2. from appium import webdriver

  3. from time import sleep

  4. @pytest.fixture(scope="function")

  5. def driver():

  6. # 配置 desired capabilities,根据实际情况调整 deviceName、appPackage 和 appActivity

  7. desired_caps = {

  8. "platformName": "Android",

  9. "deviceName": "Android Emulator", # 或实际设备 ID

  10. "appPackage": "com.android.calculator2",

  11. "appActivity": ".Calculator",

  12. "automationName": "UiAutomator2"

  13. }

  14. # 启动 Appium WebDriver 实例

  15. driver_instance = webdriver.Remote("http://localhost:4723/wd/hub", desired_caps)

  16. yield driver_instance

  17. driver_instance.quit()

  18. def test_addition(driver):

  19. """

  20. 测试计算器的加法功能,计算 2 + 3 = 5

  21. 注意:元素 ID 依据具体设备和计算器应用版本可能有所不同,请根据实际情况调整

  22. """

  23. # 点击数字 2

  24. driver.find_element_by_id("com.android.calculator2:id/digit_2").click()

  25. # 点击加号

  26. driver.find_element_by_id("com.android.calculator2:id/op_add").click()

  27. # 点击数字 3

  28. driver.find_element_by_id("com.android.calculator2:id/digit_3").click()

  29. # 点击等号

  30. driver.find_element_by_id("com.android.calculator2:id/eq").click()

  31. # 等待页面更新结果

  32. sleep(2)

  33. # 获取结果文本(此处 ID 根据具体 App 可能不同)

  34. result = driver.find_element_by_id("com.android.calculator2:id/formula").text

  35. assert result == "5", f"期望结果为 5,但实际结果为 {result}"

  36. def test_subtraction(driver):

  37. """

  38. 测试计算器的减法功能,计算 7 - 2 = 5

  39. """

  40. # 点击数字 7

  41. driver.find_element_by_id("com.android.calculator2:id/digit_7").click()

  42. # 点击减号

  43. driver.find_element_by_id("com.android.calculator2:id/op_sub").click()

  44. # 点击数字 2

  45. driver.find_element_by_id("com.android.calculator2:id/digit_2").click()

  46. # 点击等号

  47. driver.find_element_by_id("com.android.calculator2:id/eq").click()

  48. sleep(2)

  49. result = driver.find_element_by_id("com.android.calculator2:id/formula").text

  50. assert result == "5", f"期望结果为 5,但实际结果为 {result}"

使用 2 个进程并行执行测试:

pytest -n 2 test_calculator_app.py

此命令会启动 2 个 worker 进程,每个测试用例都在独立进程中运行,确保每个进程都有独立的 Appium WebDriver 会话。

使用时注意事项:

  • 设备资源:并行测试会同时占用多个设备或模拟器,确保设备资源充足。如果使用同一设备,可能会引起会话冲突,建议配置多台设备或多个模拟器。

  • desired capabilities:如果需要同时在多台设备上执行测试,请为每个设备配置不同的deviceNameudid,并相应调整 Appium 服务端口。

感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取

​​​​​​​

http://www.jsqmd.com/news/415254/

相关文章:

  • 我的真实照片
  • 车载测试必学:边界值分析法如何保障行车安全?
  • 春节单位发的沃尔玛购物卡如何回收? - 京顺回收
  • 2026年 无人机培训/CAAC执照/维修装调/驾驶员机长培训推荐榜单:专业认证与实战技能深度解析 - 品牌企业推荐师(官方)
  • Python 将 JSON 转换为 Excel
  • 火热开局 | VCAM精彩亮相深圳一步步研讨会,共绘行业新篇章 - 品牌企业推荐师(官方)
  • C语言小游戏 - 快跑,Gay来啦!!
  • 意义行为原生论:智能时代的存在论奠基与文明重构——一部系统性的哲学专著
  • 计算机毕业设计springboot高校学籍管理系统 基于SpringBoot框架的高校学生信息管理平台 智慧校园背景下的学生学籍档案数字化系统
  • fedora 启动例子
  • 棒棒金的自我介绍
  • 哈佛体系结构
  • 2026年 广州办公设备服务商推荐榜:打印机/净水机专业出售安装维修,直营服务品质保障与高效解决方案深度解析 - 品牌企业推荐师(官方)
  • 网络切片技术
  • 公告
  • 棒棒金的自我介绍 - 最终版
  • 多租户架构设计
  • 226
  • 2026年 安徽装修公司推荐排行榜,室内装饰设计,全屋整装,工装家装,口碑优选装饰企业深度解析 - 品牌企业推荐师(官方)
  • 2026年液压站厂家实力推荐榜:伺服液压系统、智能液压动力单元、精密测试液压源,高动态智控一体节能高效之选 - 品牌企业推荐师(官方)
  • 2026年2月THK直线导轨经销商最新推荐,聚焦全型号现货与快速交付能力 - 品牌鉴赏师
  • 2026年锂电池拆解设备厂家推荐排行榜:放电/破碎/分选/烘干/冷却/湿法破碎全系列,高效智能拆解技术深度解析 - 品牌企业推荐师(官方)
  • 2026年 包车租车服务商推荐榜单:大巴/中巴/考斯特/客车全车型覆盖,带司机接机旅游一站式出行解决方案 - 品牌企业推荐师(官方)
  • 2026年 安徽装修公司/装饰公司推荐榜单:匠心设计、品质施工与一站式服务口碑之选 - 品牌企业推荐师(官方)
  • 二维平面点的统计例题
  • 棒棒金自我介绍v2
  • ubuntu 卸载 snap
  • 棒棒金的第一次自我介绍
  • 测试文章 - 带图片
  • 2026年 光伏设备厂家推荐排行榜:接线盒分离机,碎玻机,拆框机,整玻分离机,除胶机,背板分离机,热熔炉,硅银分选机,玻璃分选机,移动工作站 - 品牌企业推荐师(官方)