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.pyimport timedef test_one():time.sleep(1)assert Truedef test_two():time.sleep(1)assert Truedef test_three():time.sleep(1)assert Truedef test_four():time.sleep(1)assert True运行以下命令来并行执行上述 4 个测试用例pytest -n 4 test_sample.py此命令会将 4 个测试用例分配到 4 个进程中同时运行从而显著减少总体执行时间。负载均衡策略pytest-xdist 支持多种负载均衡策略通过--dist参数进行配置策略说明--distload按测试用例均衡分配默认策略。--distloadscope按测试模块分配确保同一模块内的用例在同一进程执行减少数据共享冲突。--distloadfile按文件级别分配测试适用于每个文件测试之间相互独立的场景。例如按模块进行负载均衡pytest -n 4 --distloadscope负载均衡策略可以根据项目的实际情况和测试用例的特点灵活选择load策略适合大多数测试用例都较为独立且执行时间均衡的情况通过精细地按用例分配能最大化利用多核 CPU 的优势。loadscope策略在模块内测试共享资源或有较重初始化开销时更有优势能够减少重复工作并控制状态影响范围loadfile策略则适用于需要文件级别隔离的情况保证每个测试文件内部的状态一致性同时避免重复加载资源。Selenium 并行 UI 自动化测试案例在自动化测试中Selenium 常用于 Web UI 测试而 pytest-xdist 则能通过多进程并行运行测试用例大幅缩短整体执行时间。将二者结合使用时需要注意以下几点独立 WebDriver 实例由于测试在不同进程中并行执行每个进程都必须创建自己的 WebDriver 实例不能共享同一个浏览器驱动。环境隔离确保各个进程中的测试环境如浏览器驱动、配置文件等互不干扰避免因资源竞争导致测试失败。示例文件test_multiple_search.pyimport pytestfrom selenium import webdriverfrom selenium.webdriver.common.by import Bydef create_driver():options webdriver.ChromeOptions()options.add_argument(--headless) # 使用无头模式options.add_argument(--disable-gpu)options.add_argument(--no-sandbox)options.add_argument(--window-size1920,1080)return webdriver.Chrome(optionsoptions)pytest.fixture(scopefunction)def driver():driver_instance create_driver()yield driver_instancedriver_instance.quit()def test_google_search(driver):# 测试 百度 搜索driver.get(https://www.baidu.com)search_box driver.find_element(By.ID, kw)search_box.send_keys(pytest-xdist)search_box.submit()driver.implicitly_wait(3)assert pytest-xdist in driver.page_sourcedef test_bing_search(driver):# 测试 Bing 搜索driver.get(https://www.bing.com)search_box driver.find_element(By.NAME, q)search_box.send_keys(pytest-xdist)search_box.submit()driver.implicitly_wait(3)assert pytest-xdist in driver.page_sourcedef test_duckduckgo_search(driver):# 测试 DuckDuckGo 搜索driver.get(https://www.duckduckgo.com)search_box driver.find_element(By.NAME, q)search_box.send_keys(pytest-xdist)search_box.submit()driver.implicitly_wait(3)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 实例确保并行运行时互不干扰。import pytestfrom appium import webdriverfrom time import sleeppytest.fixture(scopefunction)def driver():# 配置 desired capabilities根据实际情况调整 deviceName、appPackage 和 appActivitydesired_caps {platformName: Android,deviceName: Android Emulator, # 或实际设备 IDappPackage: com.android.calculator2,appActivity: .Calculator,automationName: UiAutomator2}# 启动 Appium WebDriver 实例driver_instance webdriver.Remote(http://localhost:4723/wd/hub, desired_caps)yield driver_instancedriver_instance.quit()def test_addition(driver):测试计算器的加法功能计算 2 3 5注意元素 ID 依据具体设备和计算器应用版本可能有所不同请根据实际情况调整# 点击数字 2driver.find_element_by_id(com.android.calculator2:id/digit_2).click()# 点击加号driver.find_element_by_id(com.android.calculator2:id/op_add).click()# 点击数字 3driver.find_element_by_id(com.android.calculator2:id/digit_3).click()# 点击等号driver.find_element_by_id(com.android.calculator2:id/eq).click()# 等待页面更新结果sleep(2)# 获取结果文本此处 ID 根据具体 App 可能不同result driver.find_element_by_id(com.android.calculator2:id/formula).textassert result 5, f期望结果为 5但实际结果为 {result}def test_subtraction(driver):测试计算器的减法功能计算 7 - 2 5# 点击数字 7driver.find_element_by_id(com.android.calculator2:id/digit_7).click()# 点击减号driver.find_element_by_id(com.android.calculator2:id/op_sub).click()# 点击数字 2driver.find_element_by_id(com.android.calculator2:id/digit_2).click()# 点击等号driver.find_element_by_id(com.android.calculator2:id/eq).click()sleep(2)result driver.find_element_by_id(com.android.calculator2:id/formula).textassert result 5, f期望结果为 5但实际结果为 {result}使用 2 个进程并行执行测试pytest -n 2 test_calculator_app.py此命令会启动 2 个 worker 进程每个测试用例都在独立进程中运行确保每个进程都有独立的 Appium WebDriver 会话。使用时注意事项设备资源并行测试会同时占用多个设备或模拟器确保设备资源充足。如果使用同一设备可能会引起会话冲突建议配置多台设备或多个模拟器。desired capabilities如果需要同时在多台设备上执行测试请为每个设备配置不同的deviceName、udid并相应调整 Appium 服务端口。感谢每一个认真阅读我文章的人礼尚往来总是要有的虽然不是什么很值钱的东西如果你用得到的话可以直接拿走这些资料对于【软件测试】的朋友来说应该是最全面最完整的备战仓库这个仓库也陪伴上万个测试工程师们走过最艰难的路程希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取