IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> pytest+u2 并发测试 -> 正文阅读

[开发测试]pytest+u2 并发测试

目前团队在使用的工具是pytest+u2。并通过python的celery异步与jenkins做结合达到打包完成后自动执行测试的目的。最后需要回传测试结果到外网的数据库中并在钉钉同步测试结果。

UI自动化,不同于接口,在case量级上来之后执行时间往往以小时计。

目前App自动化项目情况:

case量:1000条左右

执行时间:6h+

case低耦合

思路

这次写的自动化项目初衷是可以兼容android、ios、web、api多种测试,所以不考虑使用自动化工具本身自带的多进程或多线程功能,最好在测试管理层做协调同步,方便统一维护调用。

pytest有两个插件可以实现 pytest-xdist(仅支持多进程)、pytest-parallel(Windows多进程不可用)

最后选用pytest-xdist(本机是Windows)

通过fixture 实现测试过程测试设备的作用域,避免测试对象变化。

通过文件锁,在文件中写入空闲测试对象的内存地址,实现n个进程共用n个设备时的冲突。

当执行完一个测试后,进程释放测试设备,并记录设备的内存地址到文件中,下一个测试开始前通过_ctypes.PyObj_FromPtr方法将内存地址转化为测试对象。

最后,通过进程锁,完成测试结果的收集与回传。

失误

想好之后,撸上袖子就开始干,在写核心方法的时,无意间发现xdist官方文档中的这段:

?他特么实现了。通过进程名+文件锁实现了多进程间的数据共享。

后边就在xdist提供的两个参数基础上完成了实现。

最终实现

对比最早的想法,最终的实现方式省略了内存地址和对象间的转换、多设备并发时可能存在的设备冲突。改为在每个进程初始化其所用设备时做设备的分配,省去了大部分代码量。

# 获取设备列表
def devices():
    a = os.popen('adb devices').readlines()
    if len(a) >= 2:
        dl = [i.split('\t')[0] for i in a if '\t' in i]
    else:
        dl = 'adb 异常,未获取到设备'
    return dl
#初始化设备
@pytest.fixture(scope="session", autouse=True)
def driver(tmp_path_factory, worker_id):
    devices_list = drivers.android.devices()

    if not devices_list:
        raise

    global device

    if worker_id == "master":  # 单进程
        device = drivers.android.device_android(devices_list[0])
        return device

    root_tmp_dir = tmp_path_factory.getbasetemp().parent
    fn = root_tmp_dir / "devices.json"

    with FileLock(str(fn) + ".lock"):
        log.info(fn.is_file())
        if fn.is_file():
            devices_ls = fn.read_text()
            if not devices_ls:
                return Exception('No Device')
            device_serial, devices_l = _devices_list_pop(devices_ls)
            device = drivers.android.device_android(device_serial)
            fn.write_text(
                str(devices_l)
            )
        else:
            device = drivers.android.device_android(devices_list[0])
            devices_list.pop(0)
            fn.write_text(str(devices_list))
    return device


# 处理文件中读取的设备号
def _devices_list_pop(dl):
    d = dl[1:-1].replace("'", '').strip().split(', ')
    ds = d[0]
    d.pop(0)
    return ds, d

收获

官方文档多数情况下挺香的

  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章      下一篇文章      查看所有文章
加:2021-07-11 16:54:06  更:2021-07-11 16:54:35 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/22 23:51:06-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码