【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 插件提供的,因此在使用它们之前需要确保已安装相应的插件。

在使用这些装饰器时,请确保您了解它们如何影响测试的执行和报告,以及它们是否适用于您的测试场景。

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

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

相关文章

gvim添加至右键、永久修改配置、放大缩小快捷键、ctrl + c ctrl +v 直接复制粘贴、右键和还原以前版本(V)冲突

一、将 vim 添加至右键 进入安装目录找到 vim91\install.exe 管理员权限执行 Install will do for you:1 Install .bat files to use Vim at the command line:2 Overwrite C:\Windows\vim.bat3 Overwrite C:\Windows\gvim.bat4 Overwrite C:\Windows\evim.bat…

一文快速掌握 AMD FPGA IO约束 常用电平标准

FPGA开发中IO约束是不可缺少的部分&#xff0c;正确的电平约束是确保电路稳定运行与兼容性的关键所在。 今天分享下IO约束中常用的电平标准&#xff0c;帮助大家快速理解和掌握。 一、 LVTTL系列 LVTTL全称为Low - Voltage Transistor - Transistor Logic&#xff0c;是一种…

没钱买KEGG怎么办?REACTOME开源通路更强大

之前搜集免费生物AI插图时简单提到了通路数据库Reactome&#xff08;https://reactome.org/&#xff09;&#xff0c; 那些精美的生物插图只能算是该数据库附赠的小礼品&#xff0c;他的主要功能还是作为一个开源的通路数据库&#xff0c;为相关领域的研究者提供直观的可视化生…

ubuntu显示管理器_显示导航栏

ubuntu文件管理器_显示导航栏 一、原始状态&#xff1a; 二、显示导航栏状态&#xff1a; 三、原始状态--->导航栏状态: 1、打开dconf编辑器&#xff0c;直接在搜索栏搜索 dconf-editor ------如果没有安装&#xff0c;直接按流程安装即可。 2、进入目录&#xff1a;org …

mysql的基本操作

各位小伙伴们&#xff0c;好久不见呀&#xff01;最近博主也因为个人原因&#xff0c;实在是太忙&#xff0c;才导致最近的文章一直没更新&#xff0c;当然本篇文章依旧还是会给大家带来知识点的学习&#xff0c;闲话少叙&#xff0c;我们直接进入正题。 目录 数据库的创建及使…

6.k8s:devops

目录 一、devOps整体流程 二、GitLab 1.GitLab安装 2.GitLab基础配置 (1)修改密码 (2)不启用头像 (3)关闭用户注册功能 (4)开启webhook外部访问 (5) 设置中文 3.配置secret 4.卸载gitlab 三、Harbor镜像仓库 1.安装好docker-compose 2.安装harbor 四、…

分布式IO模块:智慧楼宇的“智慧眼”与“智慧手”

在现代化的城市建设中&#xff0c;智慧楼宇作为一种集成了建筑、通信、计算机和控制等多方面技术的新型建筑&#xff0c;正逐渐成为城市发展的重要驱动力。智慧楼宇不仅提高了建筑设备的运行效率&#xff0c;降低了能源消耗&#xff0c;还提供了更加安全、舒适和便捷的生活办公…

【IOS】编译缓存错误Library/Caches/com.apple.mobile.installd.staging

项目场景&#xff1a; xcode ios 问题描述 Failed to load Info.plist from bundle at path /var/installd/Library/Caches/com.apple.mobile.installd.staging/temp.FOrCHQ/extracted/xxxxModule_Example.app/Frameworks/Foundation.framework; Extra info about "/va…

ARM64环境部署EFK8.15.3收集K8S集群容器日志

环境规划 主机IP系统部署方式ES版本CPU架构用户名密码192.168.1.225Ubuntu 22.04.4 LTSdockerelasticsearch:8.15.3ARM64elasticllodyi4TMmZD ES集群部署 创建持久化目录(所有节点) mkdir -p /data/es/{data,certs,logs,plugins} mkdir -p /data/es/certs/{ca,es01}服务器…

【网络安全 | 漏洞挖掘】邮件HTML注入

文章目录 Email 中的 HTML 注入漏洞漏洞挖掘过程1. 初步信息收集2. 发现私信功能3. 功能测试与 HTML 注入测试测试步骤请求拦截与分析4. 绕过防护机制绕过方法附加威胁漏洞影响漏洞报告与奖励Email 中的 HTML 注入漏洞 HTML 注入是一种安全漏洞,攻击者通过将任意 HTML 标签注…

《自定义类型:结构体》

1. 结构体回顾 结构体的声明 结构体的初始化 2. 结构体的特殊声明 匿名结构体&#xff1a; 不需要给结构体名字&#xff0c;但是只能使用一次。 这里的使用一次具体是什么意思呢&#xff0c;刚开始学的时候我自己的理解是有误解的&#xff0c;下面给出一个示例; 注意&…

基于Java Springboot城市公交运营管理系统

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 数据…

【杂谈】无人机测绘技术知识

无人机测绘技术知识 随着科技技术的不断进步和低空经济的快速推进&#xff0c;无人机技术已经从最初的军事侦察、航拍娱乐&#xff0c;逐渐深入到各个行业领域&#xff0c;其中无人机测绘技术&#xff08;航空摄影测量&#xff09;更是凭借其高效、精准、灵活的特性&#xff0…

数据挖掘复习

一、绪论 分类 classify 上涨或跌 回归 regression 描述具体数值 分类模型评估 1.混淆&#xff08;误差&#xff09;矩阵 confusion matrix 2.ROC曲线 receiver operating characteristic curve 接收者操作特征曲线 3.AUC面积 area under curve ROC曲线下与坐标轴围成的面…

Springboot 整合 Java DL4J 构建股票预测系统

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…

ZSTD 内存泄漏问题

优质博文&#xff1a;IT-BLOG-CN Zstandard&#xff08;简称zstd&#xff09;是一种无损压缩算法&#xff0c;由Facebook开发并开源。它旨在提供高压缩比和高解压速度的平衡&#xff0c;适用于多种数据压缩需求。 特点 【1】高压缩比&#xff1a; zstd能够在保持较高压缩比的…

嵌入式硬件电子电路设计(五)LDO低压差线性稳压器全面详解

引言&#xff1a; LDO&#xff08;Low Dropout Regulator&#xff0c;低压差线性稳压器&#xff09;是一种常用的电源管理组件&#xff0c;用于提供稳定的输出电压&#xff0c;同时允许较小的输入电压与输出电压之间的差值。LDO广泛应用于各种电子设备中&#xff0c;特别是在对…

D3基础:绘制圆形、椭圆形、多边形、线、路径、矩形

在D3.js中&#xff0c;可以通过SVG元素来创建各种几何图形。以下是D3.js中常用的几何图形及其简单的创建方法&#xff1a; 1. 圆形 (Circle) 圆形是最基本的形状之一&#xff0c;可以通过<circle>标签来创建。 <!DOCTYPE html> <html> <head><met…

17.100ASK_T113-PRO 配置QT运行环境(三)

前言 1.打开QT,新建项目. 做成以下效果,会QT都没有问题吧 编译输出: /home/book/LED_and_TempHumi/build-LED_and_TempHumi-100ask-Debug LED_and_TempHumi 2.下载程序与测试 设置运行环境 export QT_QPA_PLATFORMlinuxfb 这个地方还需要加字体,不然不会显示字体.

React 实现网页首页设计

目录 页面分解 项目初始化 项目结构 运行项目 页面分解 页面主要元素&#xff1a; Header&#xff08;导航栏&#xff09; 包含网站 logo 和导航菜单。Hero Section&#xff08;主横幅&#xff09; 大背景图片、标题文字、描述文字。Features Section&#xff08;功能展示…