pytest-xdist–分布式执行用例

pytest-xdist基本的介绍

声明:在介绍pytest-xdist时,本人不讲任何原理,需要看原理的请移至官方:
当我们自动化测试用例非常多的时候, 一条条按顺序执行会非常慢,pytest-xdist的出现就是为了让自
动化测试用例可以分布式执行,从而节省自动化测试时间,pytest-xdist是属于进程级别的并发。
pytest-xdist插件在测试过程中可以使我们的测试用例一起并行测试,运行情况是根据你运行环境存在多个CPU,运行过程中可以进行组合测试运行,从而缩短我们的测试时间。

pytest-xdist插件安装

只需要在终端中运行如下命令: pip install pytest-xdist

pytest-xdist执行用例的条件

需满足以下条件:

  • 每一条用例必须是独立的。用例之间没有依赖关系,用例可以完全独立运行【独立运行】
  • 每一条用例没有特定的执行顺序,就是每条用例都要遵循随机执行【随机执行】
  • 每条用例的测试结果不能影响到其他的测试用例。【不影响其他用例】

pytest-sdist与pytest-parallel的小小区别

  • pytest-xdist在win中调用的是多进程,而parallel在win中调用的是多线程,win中只有单进程
  • pytest-xdist调用时,会使session执行多次,算是一个win的bug,但是官方给出的解决方案是,使用filelock锁
  • 使用parallel时,在win中调用多线程,但是allure报告不支持多线程,allure是集成报告,根据session来集成,所以就是出现一个线程一个报告

pytest-xdist使用方法

pytest -n x
n:表示`使用并行参数
x:表示需要启动多少个分布式,也即使用CPU的个数

  • n auto:可以自动检测到系统的CPU核数;从测试结果来看,检测到的是逻辑处理器的
    数量
  • 使用auto等于利用了所有CPU来跑用例,此时CPU占用率会特别高
    说明:建议最多使用1/2的CPU个数来进行执行,消耗资源太多,导致电脑太卡

接下来看实例:

在终端中分别输入并执行: pytest -vspytest -vs -n 2

pytest-xdist--分布式执行用例

从结果可以看出,不是用分布式运行测试用例,总共用时10.71秒
那么接下来我们使用分布式进行运行用例,看看他运行的时间:

pytest-xdist--分布式执行用例

pytest-xdist--分布式执行用例

可以看出使用分布式运行用例,同时有2个线程进行执行用例,时间为6.08秒,缩短了很多的时间。

pytest-xdist自定义执行模式

1.按照同一个作用域方法来分组,然后将每个测试组发给可以执行的worker,确保同一个组的测试
用例在同一个进程中执行:

–dist=loadscope #每个worker按类执行
示例:pytest -v -n 3 –dist=loadscope test_demo.py

2.按照同一个文件名来分组,然后将每个测试组发给可以执行的worker,确保同一个组的测试用例在
同一个进程中执行:

–dist=loadfile #每个worker按文件执行
示例:pytest -v -n 3 –dist=loadfile test_xdist.py test_xdist_02.py test_xdist_03.py

3.是将每个用例,分别发给所有的执行器worker,相当于开了几个执行器worker,同一个用例就执行几遍:

–dist=each
示例:pytest -v -n 3 –dist=each test_xdist.py

4.将待运行的用例随机发给可用的执行器worker,用例执行顺序随机的, 目前默认采用这种方式

–dist=load 和 –dist==no
示例:pytest -v -n 3 –dist=load test_xdist.py

如何让scope=session的fixture在test session中仅仅执行一次

pytest-xdist是让每个worker进程执行属于自己的测试用例集下的所有测试用例,这意味着在不同
进程中,不同的测试用例可能会调用同一个scope范围级别较高(例如session)的fixture,该
fixture则会被执行多次,这不符scope=session的预期。
虽然pytest-xdist没有内置的支持来确保会话范围的夹具仅执行一次,但是可以通过使用锁定文件
进行进程间通信来实现。

import pytest
from filelock import FileLock

@pytest.fixture(scope="session",autouse=True)
def login(tmp_path_factory, worker_id):
    # 如果是单机运行 则运行这里的代码块【不可删除、修改】
    if worker_id == "master":
"""
        【自定义代码块】
        这里就写你要本身应该要做的操作,比如:登录请求、新增数据、清空数据库历史数据等等
"""
        uuid_value = uuid.uuid1()
        token = uuid_value.hex
        print("fixture:请求登录接口,获取token", token)
        os.environ['token'] = token
        # 如果测试用例有需要,可以返回对应的数据,比如 token
        return token
    # 如果是分布式运行
    # 获取所有子节点共享的临时目录,无需修改【不可删除、修改】
    root_tmp_dir = tmp_path_factory.getbasetemp().parent
    # 【不可删除、修改】
    fn = root_tmp_dir / "data.json"
    # 【不可删除、修改】
    with FileLock(str(fn) + ".lock"):
        # 【不可删除、修改】
        if fn.is_file():
          # 缓存文件中读取数据,像登录操作的话就是 token 【不可删除、修改】
          token = json.loads(fn.read_text())
          print(f"读取缓存文件,token 是{token} ")
        else:
"""
            【自定义代码块】
             跟上面 if 的代码块一样就行
"""
            uuid_value = uuid.uuid1()
            token = uuid_value.hex
            print("fixture:请求登录接口,获取token", token)
            # 【不可删除、修改】
            fn.write_text(json.dumps(token))
            print(f"首次执行,token 是{token} ")
          # 最好将后续需要保留的数据存在某个地方,比如这里是 os 的环境变量
        os.environ['token'] = token
    return token
  1. 示例只需要执行一次login(因为它是只需要执行一次来定义配置选项,等等)
  2. 当第一次请求这个fixture时,则会利用FileLock仅产生一次fixture数据
  3. 当其他进程再次请求这个fixture时,则会从文件中读取数据

Original: https://www.cnblogs.com/dack-zt-deng/p/15817931.html
Author: dack_deng
Title: pytest-xdist–分布式执行用例

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/714037/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 【NFC】NFC 基础知识

    NFC 基础知识 本文介绍了您会在 Android 中执行的基本 NFC 任务,如何以 NDEF 消息的形式收发 NFC 数据,以及支持这些功能的 Android 框架 API。如…

    技术杂谈 2023年5月31日
    078
  • PyQt5 UI文件的使用方法

    ################################ PyQt5中文网 – PyQt5全套视频教程 # https://www.PyQt5.cn/ # 主讲: 村长 #…

    技术杂谈 2023年5月31日
    086
  • Java线程池中线程的状态简介

    首先明确一下线程在JVM中的各个状态(JavaCore文件中) 1.死锁,Deadlock(重点关注) 2.执行中,Runnable(重点关注) 3.等待资源,Waiting on…

    技术杂谈 2023年7月11日
    093
  • 「实用」打造自我感觉非常漂亮的Mac终端

    背景 (今天我是一个美妆博主😊)突然发现自己使用的iterm2终端样式有些朴素,为了让她看起来花枝招展的,我决定给她打扮打扮。毕竟每天面对她的时间比对象还多…&#823…

    技术杂谈 2023年7月24日
    091
  • 设计模式 14 模板模式

    模板模式(Template Pattern)属于 行为型模式 在生活中常常会遇到这样的情况,做某一件事情,有些步骤是固定的,有些步骤的变化的。 比如去医院看病, 挂号和 排队这两个…

    技术杂谈 2023年7月25日
    074
  • android系统中常见问题及分类

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    技术杂谈 2023年7月10日
    062
  • java学习之EL和JSTL

    EL和JSTL都是JSP的内容的拓展,都是开发的一些东西,稍微学习记录一下,避免以后忘记 概念:Expression language 表达式语言作用:替换和简化JSP页面中的ja…

    技术杂谈 2023年6月21日
    059
  • 通俗易懂讲枚举

    枚举使用关键字 enum 进行定义,每个元素都是一个实例,如下,FOO 和 BAR 都是一个 EnumClazz 实例。 public enum EnumClazz { FOO, …

    技术杂谈 2023年7月25日
    075
  • 华为Ensp拓扑,使用MSTP、OSPF、DHCP、VRRP、链路聚合、CHAP

    OSPF+DHCP+VRRP+Eth-trunk+PPP(CHAP)+MSTP 实验目标: LSW1和LSW2核心交换机互为备份,配置链路聚合,设备冗余设计,LSW1和LSW2作为…

    技术杂谈 2023年6月21日
    088
  • 深入解析kubernetes controller-runtime

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    技术杂谈 2023年7月25日
    047
  • GCC常见命令

    rwx 对于目录和文件的区别 文件 目录 r 文件的内容可以被查看。支持cat、more、head…vim 目录的内容可以被查看。ls、tree w 文件的内容可以被添…

    技术杂谈 2023年6月21日
    0107
  • 负载(Load)分析及问题排查

    平常的工作中,在衡量服务器的性能时,经常会涉及到几个指标,load、cpu、mem、qps、rt等。每个指标都有其独特的意义,很多时候在线上出现问题时,往往会伴随着某些指标的异常。…

    技术杂谈 2023年6月1日
    053
  • 网络七层协议地图,报文格式一览无遗。绝对是干货,值得收藏

    从事网络工作的小伙伴们,在排查网络故障时,往往需要抓包,分析问题。所以,要对每一层的报文格式有一定的了解才行。但是,每一层报文协议众多,全部背下来是不可能的。只需要用到的再去查。 …

    技术杂谈 2023年6月21日
    0110
  • 谈谈数据库,缓存一致性

    几年前,我在看博客的时候,看到有一篇博客的标题就是关于数据库,缓存一致性的,不以为然,直接跳过去了,心想,这么简单的问题还讨论个鬼啊。这种想法持续了很久,直到某天,我看到越来越多的…

    技术杂谈 2023年7月25日
    065
  • manim 3.0优化

    1、注意不要在物体变换之后再添加其他相关物体,这样物体的初始化会在动画部分的后面 2、动画实现过程最主要还是物体的初始化,所以可以将动画部分和查看物体初始化部分分开(即将动画部分放…

    技术杂谈 2023年7月24日
    072
  • 阿里二面算法题

    最长的括号子串 问题描述 给出一个长度为 n 的,仅包含字符 ‘(‘ 和 ‘)’ 的字符串,计算最长的格式正确的括号子串的长度。 示…

    技术杂谈 2023年7月25日
    064
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球