码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Pytest-xdist并行执行用例时的“坑”


    目录

    1.背景

    2.官网的正常打开方式

    3.“坑”之变量保存方式不适用

    4.“坑”之用例场景不适用

    5.“坑”之日志不全

    6.参考资料


    1.背景

            用例越来越多,全量执行时间越发长了。这个时候,自然会想到用并行执行的方式。当然,在使用这种方式的前提是,每个用例间是没有耦合和依赖的。

            并行执行的方式也有很多:多进程(pytest-xdist)、多线程(pytest-parallel),另外还有pytest-multithreading。笔者试用了前面两种,在使用pytest-parallel时,不知什么原因,出现大量用例失败。怀疑可能是因为自动化工程结构的原因导致吧。所以,采用了pytest-xdist,不曾想,也是自己挖了“坑”,自己填。。。

    2.官网的正常打开方式

            根据官网所述,使用pytest-xdist以后,pytest中fixture所指定的scope是失效的。这会出现:conftest.py中设置为期望仅执行一次为了弥补这一“漏洞”,官网采用“文件锁”的方式来“部分”控制用例执行顺序。

    1. import json
    2. import pytest
    3. from filelock import FileLock
    4. # 这里没有使用autouse=True。自己的脚本场景中如果设置该标记则失败,但同事的脚本场景中使用了也没有问题。怀疑与脚本场景有关,暂无解
    5. @pytest.fixture(scope="session")
    6. # 不用修改传递的这两个参数,这里是固定写好的
    7. def session_data(tmp_path_factory, worker_id):
    8. if worker_id == "master":
    9. # 单进程执行
    10. return produce_expensive_data()
    11. root_tmp_dir = tmp_path_factory.getbasetemp().parent
    12. # 生成一个临时文件给所有进程用
    13. fn = root_tmp_dir / "data.json"
    14. with FileLock(str(fn) + ".lock"):
    15. # 当第2个及以后的进程执行用例时,走到这个分支
    16. if fn.is_file():
    17. data = json.loads(fn.read_text())
    18. # 第1个进程走到这里,将生成的数据存到共享文件中
    19. else:
    20. data = produce_expensive_data()
    21. fn.write_text(json.dumps(data))
    22. return data

    3.“坑”之变量保存方式不适用

            官网的代码简洁易用,无奈当前项目工程采用的变量保存方式不合适。

            首先,项目中采用dynaconf的settings.toml进行变量保存。看官可以百度一下,这种.toml格式文件读写json数据是有些麻烦的。也就是存在格式差异。即使在把“data.json”换成“data.toml”,在fn.write_text进行数据保存时,格式也会出现问题。几经失败,只能放弃使用settings.toml保存变量,换用settings.json。(这样会导致工程中大量变量引用需要修改,这个后续再议~~)

            其次,换了settings.json后,初始化产生数据以及数据的写入都没有问题,而新的问题又出现。手动单步调试时,一切OK,直接运行代码出错。后来经过调试发现,第一个进程运行时,将产生的初始化数据保存进文件,正是因为要落盘(写入文件),肯定不如数据在内存中运行快,此时,第二个进程已经运行到读取文件。于是,数据没有完全写入,导致出错。。。。。。

            最后,因为修改了settings.json文件,原有工程中,采用settings.xxx的方式引用变量,就必须全部修改为settings['xxx']。这又是一大工作量~~~

    4.“坑”之用例场景不适用

            并行执行用例,并不是所有用例都需要并行的。例如,登录、初始化。官网提供的方式,对全局的conftest.py中的初始化是有效的。但我们的工程中,由于场景设计的特殊性,在一些子模块中有自己局部的conftest.py。而这类初始化,就不适用这样的文件锁方式了。

    5.“坑”之日志不全

            综合上述2点,决定放弃pytest-xdist,就用时间换取脚本执行的正确性吧。但又出现了一个问题。代码中没有使用pytest-xdist,只是没有去掉import和安装的库。结果导致运行后,日志中今有setup的日志,其余步骤和最终teardown的日志都没有了。。。卸载了pytest-xdist恢复了正常。至于原因嘛,就不得而知了

    6.参考资料

    How-tos — pytest-xdist documentation

    接口自动化测试:pytest-xdist之session级别的fixture只执行一次 - 走看看

    Python测试框架pytest(22)插件 - pytest-xdist(分布式执行)_wangmcn的博客-CSDN博客_pytest-xdist

    多线程运行 pytest 用例,解决 pytest-xdist session 级别的 fixture 运行次数不合理和进程切换更消耗 cpu 的问题 · TesterHome pytest-xdist:并发执行用例设计(脱坑)_liwuke的博客-CSDN博客_pytest 并发执行用例

    python - Pytest: run teardown once for all workers using pytest-xdist - Stack Overflow 

    pytest多进程/多线程执行测试用例_测试小娜的博客-CSDN博客_pytest多线程执行用例 

  • 相关阅读:
    swagger2配置及注释详解
    神经系统类型图片高清,神经系统类型图片解析
    第3章 helloworld 驱动实验(iTOP-RK3568开发板驱动开发指南 )
    LabVIEW应用开发——控件的使用(二)
    在 .NET 中使用 FixedTimeEquals 应对计时攻击
    2022年全球市场喷他佐辛原料药总体规模、主要生产商、主要地区、产品和应用细分研究报告
    物联网五层架构:每一层都扮演着不可或缺的角色——青创智通
    CSS 解决单词之间空隙很大的问题
    Unity 3D模型展示框架篇之资源打包、加载、热更(Addressable Asset System | 简称AA)
    虹科方案|用Western Digital和ATTO技术优化SMR存储解决方案的负载
  • 原文地址:https://blog.csdn.net/aduocd/article/details/126190658
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号