pytest学习——pytest插件的7种用法

news2025/1/12 23:04:45

1.pytest-repeat 重复跑

安装包

pip install pytest-repeat

第一种用法: 装饰器 @pytest.mark.repeat(次数)

示例代码

import pytest
@pytest.mark.repeat(5)
def test_001():
assert 1==2
if __name__ == '__main__':
pytest.main(['-sv',__file__])

第二种用法: 命令行参数

语法

pytest --count=5 test.py

示例代码

import pytest
def test_001():
assert 1==2
if __name__ == '__main__':
pytest.main(['-sv','--count=5',__file__])

第三种用法: 结合repeat-scope运行

如果我们要对多个测试函数进行重复运行,要么加多个装饰器,要么用命令行参数

但是上述两种方法都是A重复,B重复这样,无法做到AB-AB-AB的模式

如果要实现组合重复运行,那就要用到–repeat-scope

–repeat-scope类似于pytest fifixture的scope参数,–repeat-scope也可以设置参数:session, module , class 或者 function (默认值)

function (默认)范围针对每个用例重复执行,再执行下一个用例

class 以class为用例集合单位,重复执行class里面的用例,再执行下一个

module 以模块为单位,重复执行模块里面的用例,再执行下一个

session 重复整个测试会话,即所有收集的测试执行一次,然后所有这些测试再次执行等等

示例代码1:A运行2次,B运行2次

import pytest
def test_002():
assert 1==2
def test_001():
assert 1==2
if __name__ == '__main__':
pytest.main(['-sv','--count=2',__file__])
#运行结果
FAILED test_demo1.py::test_002[1-2] - assert 1 == 2
FAILED test_demo1.py::test_002[2-2] - assert 1 == 2
FAILED test_demo1.py::test_001[1-2] - assert 1 == 2
FAILED test_demo1.py::test_001[2-2] - assert 1 == 2

示例代码:A-B运行2次

import pytest
def test_002():
assert 1==2
def test_001():
assert 1==2
if __name__ == '__main__':
pytest.main(['-sv','--count=2','--repeat-scope=session',__file__])
#AB运行1次后再运行1次AB
FAILED test_demo1.py::test_002[1-2] - assert 1 == 2
FAILED test_demo1.py::test_001[1-2] - assert 1 == 2
FAILED test_demo1.py::test_002[2-2] - assert 1 == 2
FAILED test_demo1.py::test_001[2-2] - assert 1 == 2

2.pytest-assume 断言后继续跑

安装

 pip install pytest-assume

实际测试的过程中,有可能遇到一种情况,就是你某个断言执行失败也想要做下去(比如登录的测试,测试失败后,还是要返回主页继续下一轮的测试)。而默认情况下,如果断言失败,assert后面的语句是不会执行的了。

可以应用在多重断言的场景!(可以同时做多个断言)

没有assume的示例

import pytest
def test_001():
assert 1==2 #如果改为1==1,下面是不会执行的
print('\n对了会做,错了不会做')
if __name__ == '__main__':
pytest.main(['-s','test_order_001.py'])

有assume的示例

import pytest
def test_001():
pytest.assume(1==2)
print('\n对了会做,错了也会做')
if __name__ == '__main__':
pytest.main(['-sv','test_order_001.py'])

assume的另外一种写法:上下文管理器

def test_assume2():
with pytest.assume:
 assert 1==2
 assert 1==3

下面图1直接用pytest.assume不会显式testid的内容,而图2中assert就能显示变量的值,要解决这个问题就可以用with的写法

图片

图片

3.pytest-ordering 用例顺序

安装

pip install pytest-ordering

pytest默认按字母顺序去执行的(小写英文—>大写英文—>0-9数字)

用例之间的顺序是文件之间按照ASCLL码排序,文件内的用例按照从上往下执行。

改变测试用例的执行顺序,用法是加上装饰器

@pytest.mark.run(order=[number])

示例

import pytest
@pytest.mark.run(order=2) #
def test_001():
assert 1==1
@pytest.mark.run(order=1) #如果没有这两句话,那么运行顺序就是001再002
def test_002():
assert 2==2
if __name__ == '__main__':
pytest.main(['-v','test_order_001.py'])

其他的运行方式

方式一
第一个执行:@ pytest.mark.first
第二个执行:@ pytest.mark.second
倒数第二个执行:@ pytest.mark.second_to_last
最后一个执行:@pytest.mark.last
方式二
第一个执行:@ pytest.mark.run('first')
第二个执行:@ pytest.mark.run('second')
倒数第二个执行:@ pytest.mark.run('second_to_last')
最后一个执行:@ pytest.mark.run('last')

4.pytest-dependency 用例依赖

主要解决用例之间的依赖关系。如果依赖的上下文失败后续的用例会被标识为跳过执行,相当于执

行了 pytest.mark.skip

安装

pip install pytest-dependency

函数示例:

import pytest
@pytest.mark.dependency() #打上标记
def test_001():
assert 1==2
@pytest.mark.dependency(depends=['test_001']) #依赖于test_001,test_001断言
成功了才会继续这个。
def test_002():
assert 1==1
if __name__ == '__main__':
pytest.main(['-sv','test_order_001.py'])

name示例:

import pytest
@pytest.mark.dependency(name='a')
def test_001():
assert 1==2
@pytest.mark.dependency(depends=['a'])
def test_002():
assert 1==1
if __name__ == '__main__':
pytest.main(['-sv','test_order_001.py'])

类示例

import pytest
class Test_001():
@pytest.mark.dependency()
def test_001(self):
assert 1==2
@pytest.mark.dependency(depends=['Test_001::test_001'])
def test_002():
assert 1==1
if __name__ == '__main__':
pytest.main(['-sv','test_order_001.py'])

5.pytest-rerunfailures 用例失败重跑

安装

pip install pytest-rerunfailures

使用方法一: 装饰器

import pytest
import random
from arrow import now
@pytest.mark.flaky(reruns=50,reruns_delay=2) #重跑50次,每次间隔2s
def test_001():
print(now().format('YYYY-MM-DD HH:mm:ss'))
assert 1==random.randint(1,5) #只要在多次RERUN中遇到一次成功,即可停止,并最终结果
为PASSED
if __name__ == '__main__':
pytest.main(['-sv',__file__])

使用方法二: 命令行

import pytest
def test_001():
assert 1==2
if __name__ == '__main__':
pytest.main(['-sv','--reruns=2','--reruns-delay=2',__file__])
#参数前千万不要有空格,会报错

6.pytest-xdist 分布式执行

pytest-xdist,让自动化测试用例可以分布式执行,从而大大节省测试时间。pytest-xdist 是属于进程级别的并发。

分布式测试用例的设计原则:

(1)独立运行:用例之间是独立的,并且没有依赖关系,还可以完全独立运行。

(2)随机执行:用例执行不强制按顺序执行,支持顺序执行或随机执行。

(3)不影响其他用例:每个用例都能重复运行,运行结果不会影响其他用例

pytest-xdist 通过一些独特的测试执行模式扩展了 pytest:

(1)测试运行并行化:如果有多个CPU或主机,则可以将它们用于组合的测试运行。这样可以加快开发速度或使用远程计算机的特殊资源。

(2)–looponfail:在子进程中重复运行测试。每次运行之后,pytest 都会等到项目中的文件更改后再

运行之前失败的测试。重复此过程,直到所有测试通过,然后再次执行完整运行。

(3)跨平台覆盖:可以指定不同的 Python 解释器或不同的平台,并在所有这些平台上并行运行测

试。

用法:

其实就是参数

-n numprocesses #如 -n 2 就是用2个
-n auto #自动检测物理CPU个数
-n logical #检测逻辑CPU个数
逻辑CPU个数=物理cpu数量x cpu核数 x 1(不支持ht超线程技术,如果开启就是2)
超线程:一个CPU核就是一个物理线程,由英特尔开发超线程技术可以把一个物理线程模拟出两个线程来
使用,使得单个核心用起来像两个核一样,以充分发挥CPU的性能.

参数

distributed and subprocess testing:
-n numprocesses, --numprocesses=numprocesses
Shortcut for '--dist=load --tx=NUM*popen'. With
'auto',
attempt to detect physical CPU count. With
'logical',
detect logical CPU count. If physical CPU count
cannot
be found, falls back to logical count. This will be
0
when used with --pdb.
--maxprocesses=maxprocesses
limit the maximum number of workers to process the
tests
when using --numprocesses=auto
--max-worker-restart=MAXWORKERRESTART
maximum number of workers that can be restarted when
crashed (set to zero to disable this feature)
--dist=distmode set mode for distributing tests to exec
environments.
each: send each test to all available environments.
load: load balance by sending any pending test to
any
available environment.
loadscope: load balance by sending pending groups of
tests in the same scope to any available
environment.
loadfile: load balance by sending test grouped by
file
to any available environment.
(default) no: run tests inprocess, don't distribute.
--tx=xspec add a test execution environment. some examples: --
tx
popen//python=python2.5 --tx
socket=192.168.1.102:8888
--tx ssh=user@codespeak.net//chdir=testcache
-d load-balance tests. shortcut for '--dist=load'
--rsyncdir=DIR add directory for rsyncing to remote tx nodes.
--rsyncignore=GLOB add expression for ignores when rsyncing to remote
tx
nodes.
--boxed backward compatibility alias for pytest-forked --
forked
--testrunuid=TESTRUNUID
provide an identifier shared amongst all workers as
the
value of the 'testrun_uid' fixture,
,if not provided, 'testrun_uid' is filled with a new
unique string on every test run.
-f, --looponfail run tests in subprocess, wait for modified files and
re•run failing test set until all pass.

7.pytest-xfail 预期失败

第一种用法:

import pytest
@pytest.mark.xfail(True,reason='预期失败,结果成功')
def test_xfail1():
assert True
@pytest.mark.xfail(True,reason='预期失败,结果失败')
def test_xfail2():
assert False
@pytest.mark.xfail(False,reason='预期成功,结果失败')
def test_xfail3():
assert False
@pytest.mark.xfail(False,reason='预期成功,结果成功')
def test_xfail4():
assert True
if __name__ == '__main__':
pytest.main(['-sv',__file__])

输出:

test_xfail.py::test_xfail1 XPASS (预期失败,结果成功)
test_xfail.py::test_xfail2 XFAIL (预期失败,结果失败)
test_xfail.py::test_xfail3 FAILED
test_xfail.py::test_xfail4 PASSED

第二种用法:

import pytest
@pytest.mark.xfail(raises=AssertionError)
def test_xfail2():
assert 1==2
if __name__ == '__main__':
pytest.main(['-sv',__file__])

输出:

test_xfail2.py::test_xfail2 XFAIL

如果这个时候带上–runxfail参数,就会忽略所有的xfail

import pytest
@pytest.mark.xfail(raises=AssertionError)
def test_xfail2():
assert 1==2
if __name__ == '__main__':
pytest.main(['-sv','--runxfail',__file__])
###输出就相当于没有那个装饰器
test_xfail2.py::test_xfail2 FAILED
================================== FAILURES
===================================
_________________________________ test_xfail2
_________________________________
@pytest.mark.xfail(raises=AssertionError)
def test_xfail2():
> assert 1==2
E assert 1 == 2
E +1
E -2
test_xfail2.py:6: AssertionError
=========================== short test summary info
===========================
FAILED test_xfail2.py::test_xfail2 - assert 1 == 2
============================== 1 failed in 0.06s
==============================

第三种用法:

def test_xfail3():
pytest.xfail()
assert 1==2
if __name__ == '__main__':
pytest.main(['-sv',__file__])

同上输出


资源分享

下方这份完整的软件测试视频学习教程已经上传CSDN官方认证的二维码,朋友们如果需要可以自行免费领取 【保证100%免费】

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

[附源码]Python计算机毕业设计SSM基于数据挖掘的毕业生离校信息系统(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 Ma…

基于牛顿方法在直流微电网潮流研究(Matlab代码实现)

💥💥💥💞💞💞欢迎来到本博客❤️❤️❤️💥💥💥 🎉作者研究:🏅🏅🏅本科计算机专业,研究生电气学硕…

拆解理想汽车Q3财报:收入增速继续下滑,年内两次更换首席技术官

12月9日,理想汽车(NASDAQ:LI、HK:02015)发布截至2022年9月30日止季度(即2022年第三季度)的未经审计财务业绩。财报显示,理想汽车2022年第三季度的收入为93.42亿元,同比增加20.2%,低于…

(九)Vue之侦听/监听/监视属性

文章目录普通实现监视属性实现Vue里配置监视属性Vue外配置监视属性配置属性immediate配置deep(深度监视)配置普通监视监视多级结构中某个属性的变化监视多级结构中所有属性的变化监视属性简写watch配置简写$watch配置简写监视属性vs计算属性Vue学习目录上…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java农产品推广平台98966

对于计算机专业的学生最头疼的就是临近毕业时的毕业设计,对于如何选题,技术选型等这些问题,难道了大部分人,确实,还没毕业的学生对于这些问题还比较陌生,只有学习的理论知识,没有实战经验怎么能独自完成毕业设计这一系列的流程,今天我们就聊聊如何快速应对这一难题. 比较容易的…

ITK 形态学中的开运算和闭运算 腐蚀 膨胀

一. 图像形态学处理 —— 膨胀和腐蚀 腐蚀在二值图像的基础上做“收缩”或“细化”操作; 膨胀在二值图像的基础上做“加长”或“变粗”的操作。 什么是二值图像呢?把一幅图片看做成一个二维的数组,那么二值图像是一个只有0和1的逻辑数组,我们…

vertical-align属性

vertical-align属性 CSS的vertical-align属性使用场景,经常用于设置图片或者表单(行内块元素)和文字垂直对齐 用于设置一个元素的垂直对齐方式,但是它只针对于行内元素或者行内块元素有效 源代码 语法: vertical-align { baseline | top | …

序——在linux下学习C语言

目录 在Linux下学习C语言的前提。。。 一、Linux的一些常见命令 二、Linux中VI和VIM的一些命令操作 1、在VIM中控制光标 2、vim中的插入模式 3、退出插入模式的方法 4、在VIM模式中的删除命令 5、撤销命令 6、 粘贴和拷贝命令 7、查看文件信息和寻找另一半括号 8、缩…

十万部冷知识:日本国歌为什么像哀乐?

大家在世界杯上看日本队比赛的时候,有没有感觉他们的国歌跟哀乐似的,听着就跟在办葬礼一样。其实,这还真不是像与不像的问题,而是因为它确实是一首挽歌。 这首歌叫《君之代》,出自于《古今和歌集》,是在天皇…

关于Servlet编程(1)

1.Servlet编程中常见网页错误 404错误 : 访问不存在 一般都是路径出错. 405错误 : 请求方法不允许 使用访问的方法有误 只书写了接受Get方法的代码.却使用POST方法访问. 代码中忘记注释super()方法也会返回405 因为源码是直接返回405的 这里展示的两段代码都会引发上图的40…

[附源码]计算机毕业设计健康医疗体检Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

powershell实现发送win10系统通知

powershell实现发送win10系统通知 一、实现方式是使用系统自带的类NotifyIcon 关于Notify类的属性和使用方法可以查阅NotifyIcon官方文档,这主要讲一下用到的几个变量和方法。 1. Icon Icon只支持 .ico格式的图标,属于自定义图标,只有当 Ba…

PLC、运动控制卡、运动控制器,傻傻分不清

前言 最近有不少做PLC开发的小伙伴,在一些咨询运动控制卡、运动控制器相关的问题,很多人不清楚它们之间有什么区别和联系,今天跟大家就PLC、运动控制卡、运动控制器区别及选型做个分享。 背景 随着工业技术的发展,工业机器人应…

怎么调整视频画布?这些技巧你知道吗?

小伙伴们平时在制作视频时是否有遇到过这种情况:从网站下载的视频素材画面过大,两边还带有黑边,插入到自己的视频后,显得视频整体上很突兀,美观度也受到影响,没有达到自己预期的效果。 如果你们也有这样的烦…

什么是CodeArts?

什么是CodeArts 软件开发生产线(CodeArts)原名“软件开发平台(DevCloud)”是集华为近30年研发实践、前沿研发理念、先进研发工具为一体的一站式云端DevOps平台,面向开发者提供的云服务,即开即用&#xff0…

从开环到闭环的旅程-CoCube

差动驱动机器人轨迹-CoCube 迷宫逃离的问题-CoCube 自由运动和环境限制-CoCube 001,自由运动 002,引出环境 003,对比差异 ROS机器人从起点到终点(四)蓝桥云实践复现 cocube自由运动机器人也需要一个目标&#xff…

JSON数据交互方式

目录 一、JSON的特点 二、前后端开发推荐使用工具ApiPost 扩展:xml与json的区别 三、JSON语法格式 语法注意点: 四、在html中定义json数据类型 1.单个实体——>JSON数据 2.数组实体——>JSON数据 3.集合实体——>JSON数据 五、JSON数据…

Redis的缓存穿透

文章目录1. 缓存穿透的理解2. 常见的解决方案有两种:3. 布隆过滤:4. 编码解决查询的缓存穿透问题:1. 缓存穿透的理解 缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到…

安科瑞企业微电网AcrelEMS-MED医院能效管理平台应用分析

安科瑞 李亚俊 平台概述 AcrelEMS-MED医院能效管理平台依据《医疗建筑电气设计规范》《绿色医院建筑评价标准》、《医院建筑能耗监管系统建设技术导则》等行业规范建设,由电力监控及能效管理系统组成,涵盖了医院中压变配电系统、应急电源、隔离电源、照…

刷题11-和大于或等于K的最短子数组

刷题008-和大于或等于K的最短子数组 首先&#xff0c;审题要认真&#xff0c;题目说的是>target的长度最小的连续子数组&#xff0c;也就是返回值最小为0&#xff0c;其次是1 核心思想&#xff1a;设置两个指针left和right&#xff0c;初始都指向0&#xff0c;当sum<ta…