【pytest】pytest注解使用指南
前言:在 pytest 测试框架中,注解(通常称为装饰器)用于为测试函数、类或方法提供额外的信息或元数据。这些装饰器可以影响测试的执行方式、报告方式以及测试的组织结构。pytest 提供了多种内置的装饰器,以及通过插件扩展的额外装饰器
以下是一些常用的 pytest 装饰器及其用途:
1、@pytest.mark.parametrize
:
- 用于参数化测试,允许您为测试函数提供多个参数集,pytest 将为每个参数集运行一次测试。
- 示例:
@pytest.mark.parametrize("input,expected", [(1, 2), (3, 4)])
import pytest@pytest.mark.parametrize("input,expected", [(1, 2), (3, 4), (5, 6)])
def test_addition(input, expected):assert input + 1 == expected
在这个例子中,test_addition
函数将使用三组不同的参数((1, 2)
,(3, 4)
,(5, 6)
)分别运行三次。
2、@pytest.mark.skip
和 @pytest.mark.skipif
:
- 用于跳过测试。
@pytest.mark.skip
无条件跳过测试,而@pytest.mark.skipif
根据条件跳过测试。 - 示例:
@pytest.mark.skip(reason="Not ready yet")
或@pytest.mark.skipif(sys.version_info < (3, 6), reason="Python 3.6+ required")
import pytest
import sys# 无条件跳过
@pytest.mark.skip(reason="This test is not ready yet")
def test_not_ready():assert True# 根据条件跳过
@pytest.mark.skipif(sys.version_info < (3, 6), reason="Python 3.6+ required")
def test_python_version():assert True
在第一个例子中,test_not_ready
函数将被无条件跳过。在第二个例子中,如果 Python 版本低于 3.6,test_python_version
函数将被跳过。
3、@pytest.mark.xfail
和 @pytest.mark.xfailif
:
- 用于标记预期失败的测试。这些测试将被执行,但如果它们失败了,则不会被视为错误。
- 示例:
@pytest.mark.xfail(reason="Known issue")
或@pytest.mark.xfailif(some_condition, reason="Condition not met")
注意:
@pytest.mark.xfailif
不是 pytest 内置的,但可以通过类似逻辑实现条件性的 xfail
import pytest# 标记预期失败的测试
@pytest.mark.xfail(reason="This is a known issue")
def test_xfail():assert False# 可以通过编写一个函数来模拟 @pytest.mark.xfailif 的行为
def pytest_xfail_if(condition, reason):def decorator(func):if condition:func = pytest.mark.xfail(reason=reason)(func)return funcreturn decorator# 使用模拟的 @pytest.mark.xfailif
@pytest_xfail_if(True, reason="Condition met, expect failure")
def test_conditional_xfail():assert False
4、@pytest.mark.tryfirst
和 @pytest.mark.trylast
:
- 用于控制测试的执行顺序,尤其是在有多个钩子函数(如 setup/teardown 方法)时。
- 这些装饰器通常与 pytest 插件中的钩子函数一起使用。
通常与 pytest 插件中的钩子函数一起使用
# 假设有一个 pytest 插件提供了 setup 和 teardown 钩子函数
# 并且我们想要某个测试在这些钩子函数中首先或最后执行
# 注意:这里的示例是假设性的,因为 @pytest.mark.tryfirst 和 @pytest.mark.trylast
# 通常不直接用于测试函数,而是用于钩子函数或插件实现# 假设的 setup 和 teardown 钩子函数(实际上需要由 pytest 插件提供)
# @pytest.hookimpl(tryfirst=True)
# def pytest_setup():
# pass# @pytest.hookimpl(trylast=True)
# def pytest_teardown():
# pass# 假设的测试函数(实际上不会直接使用 @pytest.mark.tryfirst 或 @pytest.mark.trylast)
# @pytest.mark.tryfirst # 这通常不会直接用于测试函数
def test_tryfirst():pass# @pytest.mark.trylast # 这通常也不会直接用于测试函数
def test_trylast():pass
5、@pytest.mark.usefixtures
:
- 用于声明测试将使用的 fixture。虽然这不是严格意义上的装饰器(因为它不直接修饰函数),但它用于指定测试依赖的 fixture。
- 示例:
@pytest.mark.usefixtures("my_fixture")
import pytest@pytest.fixture
def my_fixture():return "fixture value"@pytest.mark.usefixtures("my_fixture")
def test_with_fixture(my_fixture_value):assert my_fixture_value == "fixture value"# 注意:在实际使用中,pytest 会自动将 fixture 的值注入到测试函数中,
# 因此测试函数的参数名应与 fixture 的名称相匹配(或使用 pytest.mark.parametrize 来指定参数名)。
# 上面的示例中,为了说明 @pytest.mark.usefixtures 的用法,
# 假设了一个名为 my_fixture_value 的参数,但在实际代码中应直接使用 my_fixture。
# 正确的用法如下:
@pytest.mark.usefixtures("my_fixture")
def test_with_fixture_correct(my_fixture):assert my_fixture == "fixture value"
在这个例子中,test_with_fixture_correct
函数将使用名为 my_fixture
的 fixture。请注意,在实际代码中,您不需要(也不应该)在测试函数参数中显式地指定 fixture 的值;pytest 会自动将其注入
6、@pytest.mark.filterwarnings
:
- 用于控制测试期间应如何处理警告。
- 示例:
@pytest.mark.filterwarnings("ignore::DeprecationWarning")
import pytest
import warnings@pytest.mark.filterwarnings("ignore::DeprecationWarning")
def test_with_warnings():warnings.warn("This is a deprecation warning", DeprecationWarning)assert True
在这个例子中,test_with_warnings
函数将忽略 DeprecationWarning
类型的警告。
7、@pytest.mark.timeout
(通过 pytest-timeout 插件提供):
- 用于设置测试的超时时间。如果测试在指定时间内未完成,则将被标记为失败。
- 示例:
@pytest.mark.timeout(10)
(10秒超时)
import pytest@pytest.mark.timeout(5) # 设置超时时间为5秒
def test_with_timeout():import timetime.sleep(10) # 这将触发超时失败assert True
在这个例子中,test_with_timeout
函数将在5秒后超时失败,因为 time.sleep(10)
会使测试运行超过指定的超时时间。
8、@pytest.mark.flaky
(通过 pytest-flaky 插件提供):
- 用于标记可能间歇性失败的测试,并允许它们在一定数量的重试后通过。
- 示例:
@pytest.mark.flaky(reruns=3, reruns_delay=2)
(重试3次,每次延迟2秒)
import pytest@pytest.mark.flaky(reruns=3, reruns_delay=1) # 设置重试3次,每次延迟1秒
def test_flaky():import randomassert random.choice([True, False]) # 这将随机成功或失败
在这个例子中,test_flaky
函数将随机成功或失败。如果它失败了,pytest-flaky 插件将重试它最多3次,每次之间延迟1秒。
9、@pytest.mark.order
(通过 pytest-order 插件提供):
- 用于指定测试的执行顺序。
- 示例:
@pytest.mark.order(1)
(数字越小,执行越早)
import pytest@pytest.mark.order(1) # 设置执行顺序为1
def test_first():assert True@pytest.mark.order(2) # 设置执行顺序为2
def test_second():assert True
在这个例子中,test_first
函数将先于 test_second
函数执行,因为它们的执行顺序被分别设置为1和2。
10、自定义标记:
- 您可以使用
@pytest.mark.<name>
语法创建自定义的标记,并在测试配置文件中定义它们的行为。 - 示例:
@pytest.mark.my_custom_mark
(然后在 pytest.ini 或 pytest.mark 文件中定义它)
import pytest# 在 pytest.ini 或 pytest.mark 文件中定义自定义标记
# [pytest]
# markers =
# my_custom_mark: This is a custom marker@pytest.mark.my_custom_mark # 使用自定义标记
def test_with_custom_mark():assert True
我们定义了一个名为 my_custom_mark
的自定义标记,并在 test_with_custom_mark
函数中使用了它。请注意,您需要在 pytest 的配置文件中(如 pytest.ini
或 pytest.mark
)定义这个自定义标记,以便 pytest 能够识别它。
请注意,上述列表中的一些装饰器(如
@pytest.mark.timeout
和@pytest.mark.flaky
)是通过 pytest 插件提供的,因此在使用它们之前需要确保已安装相应的插件。在使用这些装饰器时,请确保您了解它们如何影响测试的执行和报告,以及它们是否适用于您的测试场景。
相关文章:

【pytest】pytest注解使用指南
前言:在 pytest 测试框架中,注解(通常称为装饰器)用于为测试函数、类或方法提供额外的信息或元数据。这些装饰器可以影响测试的执行方式、报告方式以及测试的组织结构。pytest 提供了多种内置的装饰器,以及通过插件扩展…...

在Unity中使用Epplus写Excel
Overview 本文旨在帮助你快速入门,该库发展多年内容庞大(官方文档写的极好:https://github.com/EPPlusSoftware/EPPlus/wiki),有些功能在Unity环境可能你永远都不会使用. 官方的一个Demo: https://github.com/EPPlusSoftware/EPPlus.Samples.CSharp 如果你只有读的需求,可以…...

初识算法 · 模拟(2)
目录 前言: Z字形变换 题目解析 算法原理 算法编写 数青蛙 题目解析 算法原理 算法编写 前言: 本文的主题是模拟,通过两道题目讲解,一道是Z字形变化,一道是数青蛙。 链接分别为: 1419. 数青蛙…...
【Java面试】—— 创建线程池的两种方式(执行流程、拒绝策略)(详细)
目录 一、ThreadPoolExecutor(推荐)(重点) 1、参数 2、执行流程 3、常用方法 4、任务拒绝策略 二、Executors(不推荐) 1、常用方法 2、存在的问题 一、ThreadPoolExecutor(推荐)(重点) 1、参数 使用指定的初始化参数创建一个新的线程池对象 public Thread…...
Docker在微服务架构中的应用
💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 Docker在微服务架构中的应用 Docker在微服务架构中的应用 Docker在微服务架构中的应用 引言 Docker 基本概念 1. 容器 2. 镜像 3…...

苹果ASA归因对接以及API接入
一、归因概要 广告归因,目的是用于衡量广告带来的激活用户的成本以及后续进一步的用户质量表现。 Apple Ads 广告平台是基于 App Store(站内广告),同时属于自归因平台(通常称为 SAN)。这两个因素ÿ…...
Git常用操作学习
目录 Git基础概述 1.1 什么是Git? 1.2 Git的优点Git工作流程 2.1 集中式工作流程 2.2 功能分支工作流程 2.3 Git Flow工作流程克隆仓库 3.1 使用git clone 3.2 克隆特定分支分支管理 4.1 创建分支 4.2 切换分支 4.3 合并分支 4.4 删除分支提交和推送更改 5.1 查看状…...

2.5D视觉——Aruco码定位检测
目录 1.什么是Aruco标记2.Aruco码解码说明2.1 Original ArUco2.2 预设的二维码字典2.3 大小Aruco二维码叠加 3.函数说明3.1 cv::aruco::detectMarkers3.2 cv::solvePnP 4.代码注解4.1 Landmark图说明4.2 算法源码注解 1.什么是Aruco标记 ArUco标记最初由S.Garrido-Jurado等人在…...
【PSQLException: An I/O error occurred while sending to the backend.】
PSQLException: An I/O error occurred while sending to the backend. java项目定时任务执行耗时很长的sql语句(很多条sql,从很多表中,很多数据中查询,处理)总之,耗时很长(PG数据库)。报错I/O error,Caused by : java.net.SocketTimeoutException: Read time out场景…...

图像基础算法学习笔记
目录 概要 一、图像采集 二、图像标注 四、图像几何变换 五、图像边缘检测 Sobel算子 Scharrt算子 Laplacian算子 Canny边缘检测 六、形态学转换 概要 参考书籍:《机器视觉与人工智能应用开发技术》 廖建尚,钟君柳 出版时间:2024-…...
【Elasticsearch】01-ES安装
1. 安装 安装elasticsearch。 docker run -d \--name es \-e "ES_JAVA_OPTS-Xms512m -Xmx512m" \-e "discovery.typesingle-node" \-v es-data:/usr/share/elasticsearch/data \-v es-plugins:/usr/share/elasticsearch/plugins \--privileged \--networ…...

网络性能测试
一、iperf网络性能测试工具 测试udp丢包率 在服务器启动 iperf 服务端 iperf -p 9000 -s -u -i 1参数说明: -p : 端口号 -s : 表示服务端 -u : 表示 udp 协议 -i : 检测的时间间隔(单位,秒) 在客户端,启动 iperf 客户端 iperf -c xxx.xxx.14…...

docker:docker: Get https://registry-1.docker.io/v2/: net/http: request canceled
无数次的拉镜像让人崩溃: rootnode11:~/ragflow/docker# more rag.sh #export HTTP_PROXYhttp://192.168.207.127:7890 #export HTTPS_PROXYhttp://192.168.207.127:7890 #export NO_PROXYlocalhost,127.0.0.1,.aliyun.com docker compose -f docker-compose-gpu-C…...

esp32c3开发板通过micropython的mqtt库连MQTT物联网消息服务器
MQTT介绍 MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息协议,旨在设备之间进行通信,尤其是在网络条件较差的情况下。MQTT v3.1.1 和 MQTT v5 是该协议的两个主要版本。 MQTT v3.1.1: 优点ÿ…...

OceanBase 升级过程研究(4.2.1.6-4.2.1.8)
模拟业务 使用benchmark加载10仓数据模拟业务场景 升级方法 使用滚动升级方式来进行OB升级。该方法前提是OB集群必须满足官方规定的高可用架构(如果 Zone 个数小于 3,滚动升级时则无法构成多数派), 滚动升级的原理就是轮流完成每个ZONE的升级工作,由于…...
ubuntu下怎么设置机器程序开机自启?
在 Ubuntu 中,可以通过多种方法设置程序或脚本在系统启动时自动运行。以下是几种常见方法: 方法 1:使用 crontab crontab 是一个定时任务管理工具,可以用来设置程序在开机时自动运行。 1. 打开终端,编辑当前用户的 …...
Cesium 相机系统
Cesium 的相机系统是其 3D 地球渲染引擎的重要组成部分,它控制用户在虚拟地球上的视图和交互体验。Cesium 的相机系统具备灵活性和强大的功能,允许开发者自定义视图、导航和交互方式。以下是 Cesium 相机系统的主要特点和功能: 1. 相机的基本…...

数据结构(基本概念及顺序表——c语言实现)
基本概念: 1、引入 程序数据结构算法 数据: 数值数据:能够直接参加运算的数据(数值,字符) 非数值数据:不能够直接参加运算的数据(字符串、图片等) 数据即是信息的载…...

ZYNQ程序固化——ZYNQ学习笔记7
一、ZYNQ启动过程 二、 SD卡启动实操 1、对ZYNQ进行配置添加Flash 2、添加SD卡 3、重新生成硬件信息 4、创建vitis工程文件 5、勾选板级支持包 6、对系统工程进行整体编译,生成两个Debug文件,如图所示。 7、插入SD卡,格式化为 8、考入BOOT.…...

labview使用报表工具从数据库导出数据
之前写了一篇labview从数据库导出数据到excel电子表格,但是是基于调用excel的activeX控件,有时候会有一些bug,就比如我工作机就无法显示方法,后面大哥指点才知道没有的原因是excel安装不完整。像我的工作机就没有这个选项。就需要…...

Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...

Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

Ubuntu系统复制(U盘-电脑硬盘)
所需环境 电脑自带硬盘:1块 (1T) U盘1:Ubuntu系统引导盘(用于“U盘2”复制到“电脑自带硬盘”) U盘2:Ubuntu系统盘(1T,用于被复制) !!!建议“电脑…...

热门Chrome扩展程序存在明文传输风险,用户隐私安全受威胁
赛门铁克威胁猎手团队最新报告披露,数款拥有数百万活跃用户的Chrome扩展程序正在通过未加密的HTTP连接静默泄露用户敏感数据,严重威胁用户隐私安全。 知名扩展程序存在明文传输风险 尽管宣称提供安全浏览、数据分析或便捷界面等功能,但SEMR…...