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 密集型任务中,充分利用系统资源。

  • 29
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值