如何通过@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
相关产品推荐
相关产品推荐

