zoukankan      html  css  js  c++  java
  • app自动化测试---多台设备并行运行monkey(subprocss 子进程方式 && multiprocessing 多进程方式)

    1.monkey运行命令

    常用的adb命令

    # monkey 执行命令
    adb -s 127.0.0.1:62001 shell monkey -p org.cnodejs.android.md -v --throttle 500 20
    
    -s 127.0.0.1:62001          # 执行的手机设备串号
    -p org.cnodejs.android.md   # 执行运行的app包名
    -v                          # 显示详细日志 日志级别分为三个基本  -vv  表示最详细的日志级别
    --throttle 500              # 每个事件之间的 间隔时间 为500 毫秒
    20                          # 执行20个事件

    代码运行方式:

    import subprocess
    
    def test_run_monkey():
        monkey_cmd = f"adb -s 127.0.0.1:62001 shell monkey -p org.cnodejs.android.md -v --throttle 500 200"
        with open('./monkey_run.log',mode='w',encoding='utf8') as file:
            subprocess.Popen(monkey_cmd,stdout = file,shell=True)
    
    # 调用方法
    if __name__ == '__main__':
        test_run_monkey()

    2.多台设备执行monkey命令(建议使用方案二)

    要求:

      1.自动获取device的设备串号,比如设备连接 三台, 自动获取这三台手机的串号

      2.自动执行monkey ,运行monkey的时候,每台设备产生的日志信息应该保存到对应的设备的日志中。日志文件名以设备串号命名。

    2.1 subprocss 子进程方式执行monkey命令

          缺点:执行完第一个设备之后才会去执行第二个设备,不能2个设备同时执行 

    import subprocess
    
    # 获取所有的连接设备
    def get_connect_devices():
        devices = []
        proc = subprocess.Popen('adb devices',stdout=subprocess.PIPE,shell=True)
        for line in proc.stdout.readlines():
            # 将字节类型转换为字符串
            line_str = line.decode(encoding='utf8')
            if '	device' in line_str:
                # 字符串分割 提取 deviceid值
                device_id = line_str.strip().split('	device')[0]
                devices.append(device_id)
        print('devices----》',devices)    # ['127.0.0.1:62001', '127.0.0.1:62025']
        return devices
    
    
    # 运行monkey命令
    def run_monkey(device_id:str):
        print('device_id',device_id)
        # 字符串名字去掉特殊字符
        devicename = device_id.replace(':', '_')
        devicefile = devicename.replace('.', "_")
    
        monkey_cmd = f"adb -s {device_id} shell monkey -p org.cnodejs.android.md -vv --throttle 500 20"
        with open(f'./{devicefile}_monkey_run.log',mode='w',encoding='utf8') as file:
            subprocess.Popen(monkey_cmd,stdout = file,shell=True)
    
    if __name__ == '__main__':
        devices = get_connect_devices()
        for device in devices:
            run_monkey(device)

    2.2 multiprocessing 多进程的方式,并行运行monkey命令

         完美的满足了我们的需求

    import subprocess
    import multiprocessing
    
    # 获取所有的连接设备
    def get_connect_devices():
        devices = []
        proc = subprocess.Popen('adb devices',stdout=subprocess.PIPE,shell=True)
        for line in proc.stdout.readlines():
            # 将字节类型转换为字符串
            line_str = line.decode(encoding='utf8')
            if '	device' in line_str:
                # 字符串分割 提取 deviceid值
                device_id = line_str.strip().split('	device')[0]
                devices.append(device_id)
        print('devices----》',devices)    # ['127.0.0.1:62001', '127.0.0.1:62025']
        return devices
    
    
    # 运行monkey命令
    def run_monkey(device_id:str):
        print('device_id',device_id)
        # 字符串名字去掉特殊字符
        devicename = device_id.replace(':', '_')
        devicefile = devicename.replace('.', "_")
    
        monkey_cmd = f"adb -s {device_id} shell monkey -p org.cnodejs.android.md -vv --throttle 500 200"
        with open(f'./{devicefile}_monkey_run.log',mode='w',encoding='utf8') as file:
            subprocess.Popen(monkey_cmd,stdout = file,shell=True)
    
    if __name__ == '__main__':
        devices = get_connect_devices()
        process = []
        for device_id in devices:
            p = multiprocessing.Process(target=run_monkey,args=(device_id,))
            process.append(p)
            p.start()
    
        for proc in process:
            proc.join()

    运行代码之前,先手动的使用命令检查adb devices 检查连接设备,是否全部都连接上了,是否都安装了我们要测试的安装包,检查完毕,再运行代码

    代码,运行之后,连接的多个设备会同时的执行monkey命令

     

    3.multiprocessing 多进程解析

    官方文档:https://docs.python.org/zh-cn/3/library/multiprocessing.html

    import time
    
    def run(name):
        time.sleep(2)
        print(f'helloworld--{name}')
    
    
    if __name__ == '__main__':
        start= time.perf_counter()
        for i in range(4):
            run('张三')
        end = time.perf_counter()
        print(f'执行用时: {end-start}s')

    使用多进程的方式执行:

    import multiprocessing
    import time
    
    def run(name):
        time.sleep(2)
        print(f'helloworld--{name}')
    
    
    if __name__ == '__main__':
        start= time.perf_counter()
        processes = []
        # 启动4个进程
        for i in range(4):
            # target=run     run是调用方法的方法名
            # args=(name,)   传参,name
            p = multiprocessing.Process(target=run,args=('张三',))
            processes.append(p)
            p.start()
    
        # 执行进程中的脚本
        for proce in processes:
            proce.join()   # 加入队列
    
        end = time.perf_counter()
        print(f'执行用时: {end-start}s')

    使用多进程的方式,可以同时开启多个进程,大大缩短,代码执行所需要的时间

  • 相关阅读:
    一周信创舆情观察(11.2~11.8)
    一周信创舆情观察(10.26~11.1)
    一周信创舆情观察(10.19~10.25)
    一周信创舆情观察(10.12~10.18)
    Python脚本导出AWS EC2资源清单
    C++typename的由来和用法
    百篇已过,又是一个新篇章,谈谈感受吧
    【硬件篇之电源纹波噪声测试】
    C++的转换手段并与explicit关键词配合使用
    shell脚本的使用该熟练起来了,你说呢?(篇二)
  • 原文地址:https://www.cnblogs.com/Z-Queen/p/14972490.html
Copyright © 2011-2022 走看看