appium2.X实现多进程并发启动设备

一、多设备启动:启动多个appium服务

        1)配置需要启动应用程序的相关参数,使用“抽离思想”来调用数据。

        1.1)platformName-----默认Android

        1.2)platformVersion----Android version

        1.3)deviceName----设备名称可自定义但不可省略

        1.4)udid----测试真机的参数SN号,使用adb devices查询获得

        1.5)appPackage----测试应用包名

        1.6)appActivity----测试应用的活动名

        1.7)automationName----自动化测试的框架名称

        1.8)noReset----Appium 中,noReset 参数的作用是控制每次运行测试时是否重置应用程序的状态。具体来说,当 noReset=True 时,Appium 在每次启动应用程序时将保留应用的状态,即不会清除应用的数据和缓存。

        1.9)resetKeyboard----重置键盘输入状态,在某些情况下可能需要重置键盘以确保输入的可靠性和一致性。

        2)代码实现

        2.1)multy_device.py代码实现,调用yaml数据

from appium import webdriver
from appium.options.android import UiAutomator2Options
import yaml
import logging
import logging.config
from time import ctime
CON_LOG = "../config/log.conf"
logging.config.fileConfig(CON_LOG)
logging = logging.getLogger()

# with...as...: 作用是处理完文件内容后自动关闭文件
with open("../config/multy_device.yaml", "r", encoding="utf-8") as file:
    data = yaml.safe_load(file)


devices_list = ["设备1", "设备2"]


"""
多设备启动:启动多个appium服务
"""
def appium_desire(udid, port):
    desired_capas={}
    desired_capas["platformName"] = data["platformName"]
    desired_capas["platformVersion"] = data["platformVersion"]
    desired_capas["deviceName"] = data["deviceName"]
    desired_capas["udid"] = udid

    desired_capas["appPackage"] = data["appPackage"]
    desired_capas["appActivity"] = data["appActivity"]
    desired_capas["automationName"] = data["automationName"]
    desired_capas["noReset"] = data["noReset"]
    desired_capas["resetKeyboard"] = data["resetKeyboard"]
    logging.info(f"appium port:{port} {udid} {ctime()}")
    appium_server_url = "http://" + str(data["ip"]) + ":" + str(port)
    logging.info(appium_server_url)
    driver = webdriver.Remote(appium_server_url, options=UiAutomator2Options().load_capabilities(desired_capas))
    driver.implicitly_wait(5)
    return driver


if __name__ == '__main__':
    appium_desire(devices_list[0], 4723)
    appium_desire(devices_list[1], 4725)

        2.2)multy_device.yaml数据抽离

platformName: Android
platformVersion: '14'
deviceName: 自定义

appPackage: 应用包名
appActivity: 应用活动名
automationName: UiAutomator2
noReset: False
resetKeyboard: True
ip: 127.0.0.1

        2.3)备注:yaml数据,键和值之间必须用空格

二、多设备启动:多进程并发启动设备

        1)构建进程添加到进程组,通过进程组加载进程

        1.1)multy_device_nync.py代码实现

import multiprocessing
from appium import webdriver
from appium.options.android import UiAutomator2Options
import yaml
import logging
import logging.config
from time import ctime

CON_LOG = "../config/log.conf"
logging.config.fileConfig(CON_LOG)
logging = logging.getLogger()

# with...as...: 作用是处理完文件内容后自动关闭文件
with open("../config/multy_device_sync.yaml", "r", encoding="utf-8") as file:
    data = yaml.safe_load(file)

# 设备列表
devices_list = ["设备1", "设备2"]

"""
多进程并发启动设备
"""


def appium_desire(udid, port):
    desired_capas={}
    desired_capas["platformName"] = data["platformName"]
    desired_capas["platformVersion"] = data["platformVersion"]
    desired_capas["deviceName"] = data["deviceName"]
    desired_capas["udid"] = udid

    desired_capas["appPackage"] = data["appPackage"]
    desired_capas["appActivity"] = data["appActivity"]
    desired_capas["automationName"] = data["automationName"]
    desired_capas["noReset"] = data["noReset"]
    desired_capas["resetKeyboard"] = data["resetKeyboard"]
    logging.info(f"appium port:{port} {udid} {ctime()}")
    appium_server_url = "http://" + str(data["ip"]) + ":" + str(port)
    logging.info(appium_server_url)
    driver = webdriver.Remote(appium_server_url, options=UiAutomator2Options().load_capabilities(desired_capas))
    driver.implicitly_wait(5)
    return driver


# 构建进程组
desired_process = []
# 加载进程
for i in range(len(devices_list)):
    port = 4723 + 2 * i
    desired = multiprocessing.Process(target=appium_desire, args=(devices_list[i], port))
    # 把进程加载到进程组
    desired_process.append(desired)



if __name__ == '__main__':
    # 启动多设备执行测试,在进程组中加载进程同时执行测试任务
    for desired in desired_process:
        desired.start()

    # 等待所有子进程执行完毕后再进行关闭进程
    for desired in  desired_process:
        desired.join()


        1.2)multy_device.yaml数据抽离

platformName: Android
platformVersion: '14'
deviceName: 自定义设备名

appPackage: 应用包名
appActivity: 应用活动名
automationName: UiAutomator2
noReset: False
resetKeyboard: True
ip: 127.0.0.1

        2)测试结果:设备1和设备2并行打开测试应用

        2.1)进程知识温习

多进程中,同一个变量,各自有一份拷贝存在于每个进程,互不影响。

而多线程中,所有变量都由所有线程共享,所以,任何一个变量都可以被任何一个线程修改,因此,线程之间共享数据最大危险在于多个线程同时改一个变量,容易把内容给改乱了。

        2.2)multiprocessing模块

multiprocessing 模块是 Python 的一个内置模块,主要用于并行处理和多进程编程。它允许你创建多个进程,从而充分利用多核 CPU 的计算能力。以下是 multiprocessing 模块的一些主要功能和作用:

  1. 创建进程:可以轻松创建新的进程,类似于创建线程,但每个进程都有自己的内存空间。

  2. 进程间通信:提供了多种进程间通信方式,包括队列(Queue)、管道(Pipe)和共享内存(Value 和 Array),使得多个进程能够安全地交换信息。

  3. 同步机制:支持多种同步机制,如锁(Lock)、信号量(Semaphore)和事件(Event),确保在并发环境中共享资源的安全性。

  4. 平台独立性:multiprocessing 模块在不同平台(如 Windows、Linux、macOS)上都能正常工作,具有较好的跨平台兼容性。

  5. 简化代码:通过提供高级的 API,multiprocessing 模块使得编写并行处理代码变得更加简单直观。

通过使用 multiprocessing 模块,你可以显著提高程序的性能,尤其是在 CPU 密集型任务中,充分利用系统资源。

### Python Appium 多进程并行执行测试用例 #### 使用 `pytest-xdist` 插件实现多进程并发执行 为了使测试用例能够以多进程的方式运行,可以借助于 `pytest-xdist` 插件。该插件允许通过命令行选项 `-n NUM` 来指定要启动的工人数量(即进程数),从而让多个 CPU 核心参与到测试工作中去[^1]。 ```bash pip install pytest-xdist ``` 安装完成后,在终端输入如下指令即可开启多进程模式下的测试: ```bash pytest test_add.py -n 4 ``` 这里假设文件名为 `test_add.py` 的脚本里定义了若干条待测的功能逻辑;而数字 `4` 则代表同时启用四个子进程来进行测试工作。 #### 结合 Appium 实现跨平台自动化测试 对于移动应用而言,如果希望针对不同的操作系统版本或模拟器/真机环境做兼容性验证,则可以通过配置不同的 Desired Capabilities 参数来区分各个被控端的信息,并利用 fixture 功能迭代这些参数组合,进而达到一次编写多次部署的效果[^2]。 ```python import pytest from appium import webdriver @pytest.fixture( params=[ { "platformName": "Android", "deviceName": "Pixel_3a_API_30_x86" }, { "platformName": "iOS", "deviceName": "iPhone SE (2nd generation)" } ] ) def driver(request): caps = request.param wd = webdriver.Remote('http://localhost:4723/wd/hub', caps) yield wd wd.quit() ``` 这段代码展示了怎样设置 Android 和 iOS 设备各自的特性描述字典作为参数传递给 WebDriver 构造方法,以此建立连接至目标设备的服务会话对象 `wd` 。当所有依赖于此 fixture 的测试函数被执行完毕之后,便会自动调用其后的清理操作——关闭浏览器窗口以及断开远程调试链接。 #### 创建独立的工作单元确保隔离性 考虑到每一轮完整的 UI 自动化流程可能涉及到临时文件读写、网络请求发送接收等副作用行为,因此有必要保证各轮次间的数据不会相互影响。为此,采用多进程架构而非多线程方案成为必然选择之一,因为前者天然具备更好的资源隔离机制,能有效防止因竞态条件引发的一系列潜在风险[^3]。 综上所述,以上就是关于如何运用 Python 编写的 PyTest 测试框架配合 Appium 工具集达成移动端应用程序的高效批量化检测过程的一个简明介绍。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值