一、前置說明
在自動化測試中,經常需要驗證多臺設備的兼容性,Appium可以用同一套測試運例并行測試多個設備,以達到驗證兼容性的目的。
解決思路:
- 查找已連接的所有設備;
- 為每臺設備啟動相應的Appium Server;
- 使用多線程執行 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.fixture
def 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 threading
import pytest
from 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)
歡迎技術交流: