一、前置说明
在自动化测试中,经常需要验证多台设备的兼容性,Appium可以用同一套测试运例并行测试多个设备,以达到验证兼容性的目的。
解决思路:
1. 查找已连接的所有设备;
2. 为每台设备启动相应的Appium Server;
3. 使用多线程执行 pytest 命令;
二、核心代码
# test_multi_devices.pyimport pytestfrom driver.appium.manager import port_manager@pytest.fixture(scope="session")def devicename(request):return request.config.getoption("--devicename")@pytest.fixturedef driver(devicename):from driver.appium.driver import WebDriverserver_port = port_manager.get_server_port(devicename)trans_port = port_manager.get_trans_port(devicename)# appium 多设备并行注意事项:# 1. server_port: 必须传值,它是 appium server 的监听端口号,在启动多个 appium server的情况下,用于指定当前driver与哪个 server 进行通信;# 2. uuid: 必须传值,它是每个设备的唯一标识,用于appium server区分与哪台设备在通信,确保测试执行不会混淆;# 3. systemPort: 必须传值,是UiAutomator2 Server的6790端口绑定至本地的端口号,该端口用于在本地监听并接收从 UiAutomator2 Server 发出的请求;appium_server_url = f'http://localhost:{server_port}'capabilities = {"platformName": "Android","automationName": "uiautomator2","deviceName": devicename,"udid": devicename,"app": "D:\\resources\\ApiDemos-debug.apk","systemPort": trans_port}driver = WebDriver(command_executor=appium_server_url, capabilities=capabilities)yield driverdriver.quit()def test_runner(driver):driver.smart_find_element(by='text', value='App').click()driver.smart_find_element(by='text', value='Notification').click()driver.smart_find_element(by='text', value='NotifyWithText').click()driver.smart_find_element(by='text', value='SHOW SHORT NOTIFICATION').click()element = driver.get_toast('Short notification')assert element.text == 'Short notification'
# main.pyimport threadingimport pytestfrom driver.appium.manager import MobileDevicesManager, AppiumServersManager, device_managerfrom driver.appium.manager import port_managerPY_RUNNER = 'tests/test_multi_devices.py'def start_server_and_run_pytest(devicename):"""启动Appium Server,并且执行pytest"""port = port_manager.get_server_port(devicename)# 为每台设备启动一个appium serverserver_manager = AppiumServersManager(port)server_manager.start_server()# 执行pytestpytest.main([PY_RUNNER, '-s', '-v', '--devicename', devicename])def run_multi_devices():"""多设备并行测试"""devices = device_manager.get_connected_devices()threads = []for devicename in devices:thread = threading.Thread(target=start_server_and_run_pytest, args=(devicename,))threads.append(thread)# 启动线程thread.start()# 等待所有线程完成for thread in threads:thread.join()if __name__ == '__main__':import logging.configlogging.config.fileConfig('conf/logging.conf')# 执行并发测试run_multi_devices()
三、Demo验证
当前有3台设备连接,执行代码,会启动3个appium server:
3台设备会同时执行测试(有1台为手机,不方便截图):
四、appium 多设备并行注意事项
# 1. server_port: 必须传值,它是 appium server 的监听端口号,在启动多个 appium server的情况下,用于指定当前driver与哪个 server 进行通信;# 2. uuid: 必须传值,它是每个设备的唯一标识,用于appium server区分与哪台设备在通信,确保测试执行不会混淆;# 3. systemPort: 必须传值,是UiAutomator2 Server的6790端口绑定至本地的端口号,该端口用于在本地监听并接收从 UiAutomator2 Server 发出的请求;appium_server_url = f'http://localhost:{server_port}'capabilities = {"platformName": "Android","automationName": "uiautomator2","deviceName": devicename,"udid": devicename,"app": "D:\\resources\\ApiDemos-debug.apk","systemPort": trans_port}driver = WebDriver(command_executor=appium_server_url, capabilities=capabilities)
现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:485187702【暗号:csdn11】
最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走! 希望能帮助到你!【100%无套路免费领取】