You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过@pytest.mark.parametrize传递设备参数实现Appium+Pytest并行测试?

Appium+Pytest多设备并行:用字典实现参数化

核心思路

把你定义的Devices字典转换成@pytest.mark.parametrize可接收的数据格式,直接复用字典里的设备参数,彻底替代硬编码方式。

具体实现方案

1. 定义设备字典

先确保你的Devices字典结构清晰,每个设备条目包含udid、deviceName、systemPort三个必填项:

Devices = {
    "Pixel_5": {"udid": "emulator-5554", "deviceName": "Pixel_5", "systemPort": 8200},
    "Pixel_6": {"udid": "emulator-5556", "deviceName": "Pixel_6", "systemPort": 8201}
}

2. 方案一:传递完整设备参数字典

直接把字典的值转成列表,作为参数化数据源,测试函数内通过字典键提取参数:

import pytest
from appium import webdriver

@pytest.mark.parametrize("device_info", list(Devices.values()))
def test_app_login(device_info):
    desired_caps = {
        "platformName": "Android",
        "udid": device_info["udid"],
        "deviceName": device_info["deviceName"],
        "appPackage": "com.your.app.package",
        "appActivity": ".YourMainActivity",
        "systemPort": device_info["systemPort"],
        "noReset": True
    }
    # 初始化driver
    driver = webdriver.Remote("http://localhost:4723/wd/hub", desired_caps)
    
    # 执行测试逻辑(示例:检查首页标题)
    assert driver.find_element_by_id("com.your.app.package:id/home_title").is_displayed()
    
    driver.quit()

3. 方案二:拆分独立参数传递

如果希望测试函数参数更直观,可把字典转换成元组列表,拆分出单个独立参数:

import pytest
from appium import webdriver

# 把设备字典转成(udid, deviceName, systemPort)元组列表
device_params = [(d["udid"], d["deviceName"], d["systemPort"]) for d in Devices.values()]

@pytest.mark.parametrize("udid, device_name, system_port", device_params)
def test_app_home(udid, device_name, system_port):
    desired_caps = {
        "platformName": "Android",
        "udid": udid,
        "deviceName": device_name,
        "appPackage": "com.your.app.package",
        "appActivity": ".YourMainActivity",
        "systemPort": system_port,
        "noReset": True
    }
    driver = webdriver.Remote("http://localhost:4723/wd/hub", desired_caps)
    
    # 测试步骤示例:点击登录按钮
    driver.find_element_by_id("com.your.app.package:id/btn_login").click()
    
    driver.quit()

运行与注意事项

  • 保持原有并行命令:pytest -n 2(数字需对应你要并行的设备数量)
  • 必须保证每个设备的systemPort唯一,否则会出现端口冲突导致会话启动失败
  • 设备udid可通过adb devices命令获取,确保与实际设备一致
  • 新增设备时,直接在Devices字典里添加条目即可,无需修改测试代码,实现灵活扩展

内容的提问来源于stack exchange,提问作者miniminime

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 08:31:06