pytest 第三方插件

news2024/11/24 16:12:34

目录

前言:

顺序执行: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 ===================================

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

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

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

相信能使你更好的进步!

点击下方小卡片

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《面试1v1》如何能从Kafka得到准确的信息

🍅 作者简介:王哥,CSDN2022博客总榜Top100🏆、博客专家💪 🍅 技术交流:定期更新Java硬核干货,不定期送书活动 🍅 王哥多年工作总结:Java学习路线总结&#xf…

对高校数字化转型的思考

数字新技术与国民经济各产业的融合深化,使行业产业数字化、网络化、全球化、知识化、智能化趋势愈发显著,深刻改变着人的职业生涯、现代社会对人才的需求和新型就业形式,引发教育资源、形态和范式的深刻变革。数字化转型对于提高学校管理效率…

Redis简介、常用命令

目录 一、​​关系数据库​​与非关系型数据库概述 1.1 关系型数据库 1.2 非关系型数据库 二、关系数据库与非关系型数据库区别 2.1 数据存储方式不同 2.2 扩展方式不同 2.3 对事务性的支持不同 三、非关系型数据库产生背景 四、Redis简介 4.1 Redis的单线程模式 4.…

Linux系列---【Ubuntu 20.04安装KVM】

Ubuntu 20.04安装KVM 一、安装kvm 1.安装kvm sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils 2. 将当前用户添加至libvirt 、 kvm组 sudo adduser $USER libvirt sudo adduser $USER kvm 3.验证安装 virsh list --all 4.启动libvert sudo syst…

Jmeter 压测实战:Jmeter 二次开发之自定义函数

目录 1 前言 2 开发准备 3 自定义函数核心实现 3.1 新建项目 3.2 继承实现 AbstractFunction 类 3.3 最终项目结构 4 Jmeter 加载扩展包 4.1 maven 构建配置 4.2 项目打包 4.3 Jmeter 加载扩展包 5 自定义函数调用调试 5.1 打开 Jmeter 函数助手,选择自…

0基础学习VR全景平台篇 第70篇:VR直播-如何设置付费观看、试看

对于拥有优质内容的VR直播,可以通过付费观看的方式进行内容变现,是当下非常流行的商业模式。 付费价格>0时便会自动弹出“试看时间”的设置项。试看时间=0秒时,用户进入直播间需要先付费才可观看;试看时间&…

【JVM】详解JVM的五大内存模型、可能出现的异常以及堆栈引用易错点

文章目录 1、堆(线程共享)2、方法区(线程共享)3、虚拟机栈(线程私有)4、本地方法栈(线程私有)5、程序计数器(线程私有)6、易错点 源自:深入理解Java虚拟机:JVM高级特性与最佳实践(第3版) 周志明 1、堆(线程…

Docker 镜像构建 搭建分布式LNMP论坛 实践

地址规划 nginx 172.18.0.10 mysql 172.18.0.20 php 172.18.0.30 宿主机准备 拉取镜像,下面以此镜像为基础 docker pull centos:7 创建自定义网段以便指定 IP 不变动 docker network create --subnet172.18.0.0/16 --opt "com.docker.network.bridge.na…

【计算机网络】计算机网络基础知识总结(秋招篇)

文章目录 前言计算机网络笔记TCP和UDP分别是什么 有什么区别基于TCP UDP这两个协议的上层协议有哪些?TCP和UDP分别在哪些领域被用的多?TCP实现可靠性传输用了哪些技术?(TCP如何实现可靠性传输)讲一下超时重传和超时定时…

T3/A40i支持Linux-5.10新内核啦,Docker、Qt、Python统统升级!

自2021年创龙科技推出全志国产化率100%的T3/A40i工业核心板后,不到两年时间已超过800家工业客户选择创龙科技T3/A40i平台。随着客户产品的不断升级与迭代,部分“能源电力”、“工业自动化”行业客户对T3/A40i的Linux版本提出了更高要求,主要涉…

Jmeter查看结果树之查看响应的13种详解方法

Jmeter查看结果树查看响应有哪几种方法,可通过左侧面板底部的下拉框选择: 01 Text 查看结果树中请求的默认格式为Text,显示取样器结果、请求、响应数据3个部分内容。 取样器结果: 默认Raw展示,可以切换为Parsed视图&#xff0c…

用i18next使你的应用国际化-Next.js(App router)

安装插件 npm install i18next react-i18next i18next-resources-to-backend1. 目录结构 . └── app└── [lng]├── second-page| └── page.js├── layout.js└── page.jsapp/[lng]/page.js文件: import Link from next/linkexport default funct…

新增WebDB和ChatGPT组件,支持对ChatGPT资产进行纳管,JumpServer堡垒机v3.5.0发布

2023年7月24日,JumpServer开源堡垒机正式发布v3.5.0版本。在这一版本中,新生代数据库连接组件——问题终结者Chen强势来袭,替代原有的OmniDB组件,在兼容旧版本的同时,解决了旧组件性能不足的问题,为用户提供…

Matlab进阶绘图第23期—密度散点图

密度散点图本质上是一种特征渲染的散点图,其颜色表示某一点所在区域的密度信息。 除了作图,密度散点图绘制的关键还在于密度的计算。 当然,不管是作图还是密度的计算,这些在《Matlab论文插图绘制模板》和《Matlab点云处理及可视…

什么是PostgreSQL?简要介绍其主要特点和用途

PostgreSQL是一种开源的关系型数据库管理系统(DBMS),它是最强大和广泛使用的开源数据库之一。PostgreSQL的名称起源于其前身,称为"Ingres"项目,后来被命名为Postgres,而PostgreSQL则是它的进一步…

tinkerCAD案例:7.Skull Button 骷髅纽扣

tinkerCAD案例:7.Skull Button 骷髅纽扣 In this lesson you will learn to make a skull shaped button. Let’s get started! 在本课中,您将学习制作一个骷髅形按钮。让我们开始吧! 说明 Drag a Cylinder shape to the workplane. 将“圆柱…

ABAP中截取字符串中间位数常规方法

问题:截取字符串“SNTY2TI 071082241AF”中07108,常规字符串截取方法。 这里直接上代码: REPORT zsy_zm_test19. DATA:lv_datum TYPE sy-datum VALUE 20230428,lv_datum2 TYPE sy-datum VALUE 20220522. DATA:lv_num TYPE i. DATA:lv_strin…

Python基于PyTorch实现卷积神经网络分类模型(CNN分类算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 卷积神经网络,简称为卷积网络,与普通神经网络的区别是它的卷积层内的神经元只覆…

三个月诞生79个基础大模型,企业选用大模型需要注意些什么?

自从ChatGPT横空出世,各类大模型层出不穷,竞争也日渐激烈,可谓“乱花渐欲迷人眼”。 随着大公司的入场,无疑给创业公司带来了降维打击,创业公司随时可能倒掉,造成项目烂尾。 我也一直在关注大模型领域的最…

【深度学习】yolov 图片训练的时候的遇到的warning: corrupt JPEG restored and saved

报错原因 是图片在dataset.py 走验证时报的错误。 if im.format.lower() in (jpg, jpeg):with open(im_file, rb) as f:f.seek(-2, 2)if f.read() ! b\xff\xd9: # corrupt JPEGImageOps.exif_transpose(Image.open(im_file)).save(im_file, JPEG, subsampling0, quality100)m…