pytest 第三方插件

目录

前言:

顺序执行:pytest-ordering

失败重试:pytest-rerunfailures

并行执行:pytest-xdist


前言:

pytest 是一个广泛使用的 Python 测试框架。它具有强大的测试运行器、测试驱动开发和测试结果可视化等功能。除此之外,pytest 还支持许多第三方插件,这些插件可以为测试带来更多的便利和功能。

本文只介绍pytest-orderingpytest-rerunfailurespytest-xdist三种插件,报告方面的插件会另起篇幅进行介绍。

顺序执行:pytest-ordering

  • 安装:pip install pytest-ordering
  • 使用方式:在方法上加入下面装饰器
    1. 标记于被测试函数,@pytest.mark.run(order=x)
    2. 根据 order 传入的参数来解决运行顺序
    3. order 值全为正数或全为负数时,运行顺序:值越小,优先级越高
    4. 正数和负数同时存在:正数优先级高

默认情况下,pytest 是根据测试方法名由小到大执行的,可以通过第三方插件包改变其运行顺序。

# test_abc.py
#默认执行方式
#示例:
    import pytest
    class Test:
        def test_a(self):
            print("------->test_a")
            assert 1
        def test_b(self):
            print("------->test_b")
            assert 0
    if __name__ == '__main__':
        pytest.main(["-s","test_abc.py"])
#执行结果:
    test_abc.py 
    ------->test_a # 默认第一个运行
    .
    ------->test_b # 默认第二个运行
    F

改变顺序后

#示例:
    import pytest
    class Test:
        @pytest.mark.run(order=2)
        def test_a(self):
            print("------->test_a")
            assert 1

        @pytest.mark.run(order=1)
        def test_b(self):
            print("------->test_b")
            assert 0
    if __name__ == '__main__':
             pytest.main(["-s","test_abc.py"])
#执行结果:
    test_abc.py
    ------->test_b # order=1 优先运行
    F
    ------->test_a # order=2 晚于 order=1 运行
    .

失败重试:pytest-rerunfailures

  • 安装: pip install pytest-rerunfailures

  • 使用方式:pytest --reruns 重试次数 --reruns-delay 次数之间的延时设置(单位:秒)

比如:pytest --reruns 2 --reruns-delay 5  表示:运行失败的用例可以重新运行 2 次,第一次和第二次的间隔时间为 5 秒钟

import pytest


def test_demo_01():
    b = 1 + 2
    assert 3 == b


def test_demo_02():
    b = 1 + 2
    assert 2 == b


if __name__ == '__main__':
    pytest.main(['--reruns', '3', '--reruns-delay', '5'])

结果:

D:\Envs\pytest\Scripts\python.exe D:/study/auto-pytest/test_rerun.py
============================= test session starts =============================
platform win32 -- Python 3.7.1, pytest-6.0.2, py-1.9.0, pluggy-0.13.1
rootdir: D:\study\auto-pytest
plugins: rerunfailures-9.1.1
collected 2 items

test_rerun.py .R                                                         [100%]R [100%]R [100%]F [100%]

================================== FAILURES ===================================
________________________________ test_demo_02 _________________________________

    def test_demo_02():
        b = 1 + 2
>       assert 2 == b
E       assert 2 == 3

test_rerun.py:11: AssertionError
=========================== short test summary info ===========================
FAILED test_rerun.py::test_demo_02 - assert 2 == 3
==================== 1 failed, 1 passed, 3 rerun in 15.13s ====================

从结果看,test_rerun.py 重试了三次。

并行执行:pytest-xdist

  • 前言

有 1000 条用例,假设每个用例执行需要 1 分钟。如果一个测试人员执行需要 1000 分钟才能执行完,当项目非常紧急的时候,我们会用测试人力成本换取时间成本,这个时候多找个小伙伴把任务分成 2 部分,于是时间缩减一半。如果是十个人一起执行,1000 个用例理论上只需 100 分钟就能完成,时间缩短到了 1/10。这是一种并行测试,分布式场景。

同样道理,当我们测试用例非常多的时候,一条条执行,很显然会比较慢,那么如何让测试用例并行执行呢,这就是我们接下来要讲的 pytest 分布式执行插件 pytest-xdist

  • 安装:pip install pytest-xdist

  • 使用方法:pytest -n 3代表三个并行

运行以下代码,项目结构如下

auto_pytest是项目工程名称
│  conftest.py
│  __init__.py
│              
├─baidu
│  │  conftest.py
│  │  test_1_baidu.py
│  │  test_2.py
│  │  __init__.py 
│          
├─blog
│  │  conftest.py
│  │  test_2_blog.py
│  │  __init__.py 

代码如下:

# auto_pytest/conftest.py
import pytest

@pytest.fixture(scope="session")
def start():
    print("\n打开首页")
    return "yoyo"

# auto_pytest/baidu/conftest.py
import pytest

@pytest.fixture(scope="session")
def open_baidu():
    print("打开百度页面_session")

#########################################################

# auto_pytest/baidu/test_1_baidu.py
import pytest
import time

def test_01(start, open_baidu):
    print("测试用例test_01")
    time.sleep(1)
    assert start == "yoyo"

def test_02(start, open_baidu):
    print("测试用例test_02")
    time.sleep(1)
    assert start == "yoyo"

if __name__ == "__main__":
    pytest.main(["-s", "test_1_baidu.py"])


#########################################################

# auto_pytest/baidu/test_2.py
import pytest
import time

def test_06(start, open_baidu):
    print("测试用例test_01")
    time.sleep(1)
    assert start == "yoyo"
def test_07(start, open_baidu):
    print("测试用例test_02")
    time.sleep(1)
    assert start == "yoyo"

if __name__ == "__main__":
    pytest.main(["-s", "test_2.py"])

#########################################################

# auto_pytest/blog/conftest.py
import pytest

@pytest.fixture(scope="function")
def open_blog():
    print("打开blog页面_function")

#########################################################

# auto_pytest/blog/test_2_blog.py
import pytest
import time
def test_03(start, open_blog):
    print("测试用例test_03")
    time.sleep(1)
    assert start == "yoyo"

def test_04(start, open_blog):
    print("测试用例test_04")
    time.sleep(1)
    assert start == "yoyo"

def test_05(start, open_blog):
    '''跨模块调用baidu模块下的conftest'''
    print("测试用例test_05,跨模块调用baidu")
    time.sleep(1)
    assert start == "yoyo"

if __name__ == "__main__":
    pytest.main(["-s", "test_2_blog.py"])

正常运行需要消耗时间:7.09 seconds

(pytest) D:\study\auto-pytest>pytest
=================================== test session starts ===================================
platform win32 -- Python 3.7.1, pytest-6.0.2, py-1.9.0, pluggy-0.13.1
rootdir: D:\study\auto-pytest
plugins: rerunfailures-9.1.1
collected 7 items
baidu\test_1_baidu.py ..                        [ 28%]
baidu\test_2.py ..                              [ 57%]
blog\test_2_blog.py ...                         [100%]
=================================== 7 passed in 7.09s ===================================

设置并行运行数量为 3,消耗时间:3.78 seconds,大大的缩短了用例时间

(pytest) D:\study\auto-pytest>pytest -n 3
=================================== test session starts ===================================
platform win32 -- Python 3.7.1, pytest-6.0.2, py-1.9.0, pluggy-0.13.1
rootdir: D:\study\auto-pytest
plugins: forked-1.3.0, rerunfailures-9.1.1, xdist-2.2.0
gw0 [7] / gw1 [7] / gw2 [7]
.......                                         [100%]
=================================== 7 passed in 3.78s ===================================

  作为一位过来人也是希望大家少走一些弯路

在这里我给大家分享一些自动化测试前进之路的必须品,希望能对你带来帮助。

(软件测试相关资料,自动化测试相关资料,技术问题答疑等等)

相信能使你更好的进步!

点击下方小卡片

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/43844.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

什么是神经网络?

我们常常使用深度学习来指训练神经网络的过程。 在这里举一个房屋价格预测的例子:假设有一个数据集,它包含了六栋房子的信息。所以,你知道房屋的面积是多少平方米,并且知道这个房屋的价格。这是,你想要拟合一个根据房屋…

vue3项目,vite和vue-cli,开发和生产环境。index.html里面设置项目图标

可以在vite的根文件夹中创建public文件夹,vite默认把这个文件夹当作静态资源文件夹,会把里面的文件复制到根文件夹里面,所以你在index.html文件中导入public文件夹里面的文件时,可以直接写/xxx。在根文件夹中找复制的文件 注意&a…

Visual Studio 2022 cmake配置opencv开发环境

1. 环境与说明 这里我用的是 widnows 10 64位,Visual Studio 用的 Visual Studio Community 2022 (社区版) 对于Android开发工程师来说,为什么要使用Visual Studio 呢 ? 因为在Visual Studio中开发调试OpenCV方便,可以开发调试好后&#xf…

微服务Day4——Docker

一、什么是Docker 微服务虽然具备各种各样的优势,但服务的拆分通用给部署带来了很大的麻烦。 分布式系统中,依赖的组件非常多,不同组件之间部署时往往会产生一些冲突。在数百上千台服务中重复部署,环境不一定一致,会…

springboot快速整合腾讯云COS对象存储

1、导入相关依赖 <!--腾讯云COS--><dependency><groupId>com.tencentcloudapi</groupId><artifactId>tencentcloud-sdk-java</artifactId><version>3.0.1</version></dependency><dependency><groupId>com…

flask介绍、快速使用、配置文件、路由系统

前言: Flask框架和Django框架的区别&#xff1a; Django框架&#xff1a; 大而全&#xff0c;内置的app的很多&#xff0c;第三方app也很多Flask框架&#xff1a; 小而精&#xff0c;没有过多的内置app&#xff0c;只能完成web框架的基本功能&#xff0c;很多功能都需要借助第三…

【python】在matlab中调用python

参考 Matlab调用Python - 知乎 (zhihu.com) 说一下我犯的错误&#xff1a; 1、电脑上有没有python都可以&#xff0c;我以为anaconda里的python不行&#xff0c;又重新下了一个python3.8 实际上导入的时候可以用 pyversion(D:\myDownloads\anaconda\envs\pytorch38\pytho…

C++笔记之STL的sort使用第三个参数来自定义排序

C笔记之STL的sort使用第三个参数来自定义排序 code review! 文章目录 C笔记之STL的sort使用第三个参数来自定义排序1.方法一&#xff1a;使用比较函数(其实是使用函数指针)作为std::sort()的第三个参数来排序2.方法二&#xff1a;使用lambda表达式作为std::sort()的第三个参数…

C++OpenCV(2):图像处理基础概念与操作

&#x1f506; 文章首发于我的个人博客&#xff1a;欢迎大佬们来逛逛 &#x1f506; OpenCV项目地址及源代码&#xff1a;点击这里 文章目录 图形读取与显示加载图片显示图片打印图片信息保存图片 色彩模型转换RGB颜色模型HSV颜色模型HLS模型LAB模型 图像像素读写操作像素算数运…

MySQL数据库第十一课---------SQl语句的拔高-------水平提升

作者前言 个人主页::小小页面 gitee页面:秦大大 一个爱分享的小博主 欢迎小可爱们前来借鉴 ______________________________________________________ 目录 SQL提高 日期函数 length round reverse substring ifnull case when cast grouping sets 排序函数 开窗函…

计算机视觉(二)图像特征提取

文章目录 颜色特征量化颜色直方图适用颜色空间&#xff1a;RGB、HSV等颜色空间操作 几何特征边缘 Edge边缘定义边缘提取 基于关键点的特征描述子引入几何特征&#xff1a;关键点几何特征&#xff1a;Harris角点FAST角点检测几何特征&#xff1a;斑点局部特征&#xff1a;SIFT预…

【Linux从入门到精通】进程的控制(进程替换)

本篇文章会对进程替换进行讲解。希望本篇文章会对你有所帮助 文章目录 一、进程替换概念 二、进程替换函数 2、1 execl 2、2 execlp 2、3 execv 2、3 execle 2、4 execve 三、总结 &#x1f64b;‍♂️ 作者&#xff1a;Ggggggtm &#x1f64b;‍♂️ &#x1f440; 专栏&…

视频讲解Codeforces Round 887 (Div. 2)(A--C)

文章目录 A. Desorting1、板书2、代码 B. Fibonaccharsis1、板书2、代码 C. Ntarsis Set1、板书2、代码 视频讲解Codeforces Round 887 (Div. 2)&#xff08;A–C&#xff09; A. Desorting 1、板书 2、代码 #include<bits/stdc.h> #define endl \n #define INF 0x3f…

区间预测 | MATLAB实现基于QRF随机森林分位数回归时间序列区间预测模型

区间预测 | MATLAB实现基于QRF随机森林分位数回归时间序列区间预测模型 目录 区间预测 | MATLAB实现基于QRF随机森林分位数回归时间序列区间预测模型效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现基于QRF随机森林分位数回归时间序列区间预测模型&#xff1…

从零到一nvm、npm、cnpm、yarn、vue全套安装和环境配置以及创建新项目和如何运行人家的项目大全,最详细,保姆级

NVM 1.下载 下载地址&#xff1a;Releases coreybutler/nvm-windows GitHub 可能需要开启魔法 划到下面。找到如图所示的文件下载即可2. 2.安装&#xff08;要记住安装的路径&#xff09; 基本一键默认即可&#xff0c;你要修改路径也可以&#xff0c;但不建议 下载好…

【开发问题】flink-cdc不用数据库之间的,不同类型的转化

不同的数据库之期间数据类型转化 问题来源与原因解决过程&#xff0c;思路错误&#xff0c;导致各种错误错误思路是什么 正确解决方式&#xff0c;找官网对应的链接器&#xff0c;数据转化 问题来源与原因 我一开始是flink-cdc&#xff0c;oracle2Mysql&#xff0c;sql 我一开…

删除Windows顽固启动项Program

卸载软件之后可能会遇到任务管理器中启动项显示有Program这种无效项目的情况 无效项目如图所示: 解决方法 打开注册表 Win R 打开注册表后定位到 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Run 可以直接复制粘贴到地址栏进行跳…

Orangepi docker Home Assistant部署

手册上多数应用在树莓派用过&#xff0c;发现一个Home Assistant之前没搞过 按照手册先安装docker&#xff0c;使用enable_docker.sh 然后使用 docker run hello-world 来测试docker是否成功&#xff0c;如果hello from docker&#xff0c;即正常 通过以下docker命令搜索hom…

微服务探索之路06篇k8s配置文件Yaml部署Redis使用Helm部署MongoDB和kafka

1 安装Redis 1.1创建配置文件redis.conf 切换到自己的目录下如本文是放在/home/ubuntu下 cd /home/ubuntuvim redis.conf bind 0.0.0.0 protected-mode yes port 6379 requirepass qwe123456 tcp-backlog 511 timeout 0 tcp-keepalive 300 daemonize no pidfile /var/run/r…

【Spring】ApplicationEventPublisher 发布订阅模式

概念 关于发布订阅这个词&#xff0c;其实不仅仅出现在Spring框架当中&#xff0c;其实在Redis中也有存在&#xff08;其对应的是convertAndSend()方法&#xff09;&#xff0c;还有在MQ消息队列里也是有的&#xff0c;但这里就主要介绍的是关于Spring框架的ApplicationEventPu…