当前位置: 首页 > news >正文

实例详细演示在Pytest中如何忽略警告

关注开源优测不迷路

大数据测试过程、策略及挑战

测试框架原理,构建成功的基石

在自动化测试工作之前,你应该知道的10条建议

在自动化测试中,重要的不是工具

当你尝试运行Pytest代码时,那些不相关的警告突然弹出,是不是感觉很烦人?


比如来自某个你无法控制的外部库的 DeprecationWarning(弃用警告)。


虽然警告有用,但它们会让你的控制台输出变得杂乱,掩盖重要的结果。


在 Pytest 中要如何消除这些警告呢?是不是该禁用所有警告?那重要的警告又该怎么办呢?


警告是一种重要信号,表明你代码中的某些内容可能不太对,但不一定是错误,比如已弃用的函数或潜在的运行时问题。


它们能帮你在问题升级为更严重的状况之前,预先察觉并改正。


在本文中,你将学习在 Pytest 中通过不同技巧优雅地处理警告。


首先,你会探索 warnings 模块,了解它的含义以及不同类型的警告。


接着,你将学习 Pytest 默认是如何管理警告的,以及如何覆盖配置以满足你的需求,同时还会了解一些管理警告的最佳实践。

理解 Python 警告

在深入代码之前,我们先来了解一下 Python 中的 warnings 模块是什么,以及它最初设计的目的。


warnings 模块是 BaseException 类的扩展,用于突出那些值得关注,但不像异常那样会导致程序中断的问题。


它可以通知你有关语法或功能的情况,这些语法或功能虽然仍能正常工作,但在未来的版本中可能不再受支持。


官方文档解释了不同类型的警告:


  • DeprecationWarning

    :警告关于那些预期在未来版本中会被移除的过时特性。

  • UserWarning

    :用户代码生成的警告的基类。

  • SyntaxWarning

    :警告可疑的语法。

  • RuntimeWarning

    :警告可疑的运行时行为。

  • FutureWarning

    :与 DeprecationWarning 类似,警告关于那些计划在未来某个时候停止使用的已弃用特性。


你可以使用 warnings 库轻松生成警告,例如:


warnings.warn(message, category=None, stacklevel=1)

  • message

    :警告消息,通常是一个字符串。

  • category

    :警告类别(例如 DeprecationWarningUserWarning),有助于像前面讨论的那样进行过滤。

  • stacklevel

    :一个整数,表示报告警告来源时使用的栈帧深度,帮助你确定警告是从哪里触发的。stacklevel 为 1 指向 warn() 函数的调用者。


在使用外部库时,你经常会遇到 DeprecationWarning 或 SyntaxWarning


既然你已经对警告有了一些了解,那我们接着来看你来这里的初衷 —— 如何在 Pytest 中忽略警告。


毕竟,外部库引发的警告不是你的问题,可以将其屏蔽。

在 Pytest 中完全禁用警告


你可以使用 --disable-warnings 命令行选项,从测试运行输出中完全抑制警告摘要。


$ pytest --disable-warnings
这是一个比较极端的选项,有其缺点,最大的问题是当出现与你相关且应该处理的警告时,你不会知晓(因为 Pytest 会过滤掉所有警告)。

你还可以使用 -p no:warnings 命令行选项禁用警告捕获。


$ pytest -p no:warnings
或者使用配置文件和 Pytest 的 addoption:

[pytest]  addopts = -p no:warnings
更好的选择是使用 pytest.ini 文件来抑制或过滤特定的警告。

抑制或过滤警告


Pytest 允许你使用 pytest.ini 文件和 filterwarnings 选项轻松地抑制或过滤警告。


这是一个好得多的选项,它允许你过滤掉特定的警告,而不是所有警告。

[pytest]  filterwarnings =          ignore::DeprecationWarning

这个设置将忽略测试模块中的任何 DeprecationWarning


下面的配置将忽略所有用户警告以及匹配正则表达式的特定弃用警告,但会将所有其他警告转换为错误。

[pytest]  filterwarnings =        error        ignore::UserWarning        ignore:function ham\(\) is deprecated:DeprecationWarning

抑制或过滤(特定)库的警告


一种更简洁的方法是忽略引发警告的特定库的警告,可以这样做:


[pytest]  filterwarnings =      ignore::DeprecationWarning:module_name.*
例如:

[pytest]  filterwarnings =      ignore::DeprecationWarning:botocore.*:      ignore::FutureWarning:pandas.*
这将抑制来自该库的所有警告。

示例代码组织结构如下


0785681a35177357b5937fe6e4e51421.png


examples/my_module.py


import warnings    
def old_function():      warnings.warn(                "old_function() is deprecated; use new_function() instead.",                DeprecationWarning,                          stacklevel=2,                      )    
def new_function():      print("This is the new function.")      
old_function()

运行这段代码,我们会得到警告。


$ python examples/my_module.py

f383067c917b60ec809c884aaa8232b3.png

让我们编写一个测试。


tests/test_warnings.py


import warnings  from examples.my_module import old_function    
def test_function():      old_function()

运行测试:


$ pytest

c484ebd67cb56905b837148be49245e1.png


示例测试 —— 抑制警告

让我们包含一个 pytest.ini 文件,内容如下:


[pytest]  filterwarnings =      ignore::DeprecationWarning
运行这个测试:

eb12b85ff65fc3941f5e89565af55b7a.png


很顺利。


让我们在代码中添加一个 SyntaxWarning


examples/my_module.py


def old_function():      warnings.warn(                    "old_function() is deprecated; use new_function() instead.",                    DeprecationWarning,                    stacklevel=2,                )                      warnings.warn(                    "The syntax will be removed in version 2.0.0.",                    SyntaxWarning,                    stacklevel=2,                )
让我们运行 Pytest:

87b9f87d6616d8702906f9048f22eb08.png


如你所见,Pytest 抑制了 DeprecationWarning,但仍然显示了 SyntaxWarning


修改我们的 pytest.ini 文件:


[pytest]  filterwarnings =      ignore::DeprecationWarning            ignore::SyntaxWarning
现在我们得到了一个干净的输出。

3893c0aff528d637e08cb67628d63ce1.png

你可以对警告及其抑制进行更多尝试。

使用标记过滤警告


Pytest 还提供了使用标记向特定测试和测试模块添加警告过滤器的选项,这样能实现更精细的控制。


import warnings  import pytest    def api_v1():      # 生成一个带有特定消息的警告。            warnings.warn("api v1, should use functions from v2", UserWarning)                  return 1          @pytest.mark.filterwarnings("ignore:api v1")  def test_one():      # 将忽略消息中包含 "api v1" 的警告。            assert api_v1() == 1

确保代码触发弃用警告


现在,如果你处于代码生成端,即你想测试你的代码是否触发 DeprecationWarning,也可以使用 Pytest 进行测试。


你可以使用 pytest.deprecated_call() 方法。


def test_myfunction_deprecated():      with pytest.deprecated_call():           old_function()
如果 old_function 没有发出弃用警告,这个测试将会失败。

fb289335ee42e4e7cd55e3960929cabe.png


结论


我们来到了文章末尾。


希望你找到了一直在寻找的内容 —— 如何在 Pytest 中轻松过滤警告,无论是来自你自己的库、外部包,甚至是 Pytest 本身的警告。


在本文中,我们介绍了一些关于 Python 警告的基础知识,它们是什么以及如何使用。


然后我们看了最重要的部分,即在 Pytest 中如何禁用或抑制警告(特别是来自外部库的警告)。


最后,你还学习了如何抑制特定库的警告,使用 Pytest 标记过滤警告,甚至断言你自己的 DeprecationWarning

相关文章:

实例详细演示在Pytest中如何忽略警告

关注开源优测不迷路 大数据测试过程、策略及挑战 测试框架原理,构建成功的基石 在自动化测试工作之前,你应该知道的10条建议 在自动化测试中,重要的不是工具 当你尝试运行Pytest代码时,那些不相关的警告突然弹出,是不是…...

03 HarmonyOS Next仪表盘案例详解(二):进阶篇

温馨提示:本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦! 文章目录 前言1. 响应式设计1.1 屏幕适配1.2 弹性布局 2. 数据展示与交互2.1 数据卡片渲染2.2 图表区域 3. 事件处理机制3.1 点击事件处理3.2 手势…...

mysql进阶(三)

MySQL架构和存储引擎 1. MySQL架构 MySQL8.0服务器是由连接池、服务管理⼯具和公共组件、NoSQL接⼝、SQL接⼝、解析器、优化 器、缓存、存储引擎、⽂件系统组成。MySQL还为各种编程语⾔提供了⼀套⽤于外部程序访问服务器 的连接器。整体架构图如下所⽰: 2. 连接层 …...

MySQL 架构、索引优化、DDL解析、死锁排查

私人博客传送门 MySQL 认识索引 | 魔筝炼药师 MySQL 索引优化 | 魔筝炼药师 OnlineDDL(在 MySQL 5.7 数据库里,InnoDB引擎,执行一条DDL会发生什么事情) | 魔筝炼药师 MySQL 死锁排查 | 魔筝炼药师...

AVM 环视拼接 鱼眼相机

https://zhuanlan.zhihu.com/p/651306620 AVM 环视拼接方法介绍 从内外参推导IPM变换方程及代码实现(生成AVM环视拼接图)_avm拼接-CSDN博客 经典文献阅读之--Extrinsic Self-calibration of the Surround-view System: A Weakly... (环视系统的外参自…...

【Flink银行反欺诈系统设计方案】5.反欺诈系统全生命周期设计

【Flink银行反欺诈系统设计方案】反欺诈系统全生命周期设计 概要:1. 事前反欺诈准备核心模块与架构: 2. 事中反欺诈发现与告警核心模块与架构: 3. 事后反欺诈事件分析核心模块与架构: 4. 反欺诈闭环架构设计整体技术栈&#xff1a…...

aardio - 虚表 —— 两个虚表之间互相拖动交换数据

插入到虚表末尾的方法: import win.ui; import godking.vlistEx; /*DSG{{*/ mainForm win.form(text"vlistEx - table adapter";right849;bottom578;border"thin") mainForm.add( radiobutton{cls"radiobutton";text"移动&qu…...

VScode 中文符号出现黄色方框的解决方法

VScode 中文符号出现黄色方框的解决方法 我的vscode的python多行注释中会将中文字符用黄色方框框处: 只需要打开设置搜索unicode,然后将这一项的勾选取消掉就可以了: 取消之后的效果如下: 另一种情况:中文显示出现黄色…...

LINUX网络基础 [二] - 网络编程套接字,UDP与TCP

目录 前言 一. 端口号的认识 1.1 端口号的作用 二. 初识TCP协议和UDP协议 2.1 TCP协议 TCP的特点 使用场景 2.2 UDP协议 UDP的特点 使用场景 2.3 TCP与UDP的对比 2.4 思考 2.5 总结 三. 网络字节序 3.1 网络字节序的介绍 3.2 网络字节序思考 四. socket接口 …...

Spring统一格式返回

目录 一:统一结果返回 1:统一结果返回写法 2:String类型报错问题 解决方法 二:统一异常返回 统一异常返回写法 三:总结 同志们,今天咱来讲一讲统一格式返回啊,也是好久没有讲过统一格式返…...

Unity多Pass渲染与GPU Instancing深度优化指南

一、技术背景与挑战 1. 多Pass渲染的定位 多Pass渲染策略通过单个Shader中定义多个渲染阶段(如阴影生成、光照计算、后处理等)实现复杂视觉效果,但传统实现会显著增加DrawCall数量。例如标准渲染管线中,一个物体可能经历Base Pa…...

Redis高频面试题10个

1. Redis 的特点及与 Memcached 的区别 特点: 基于内存的键值数据库,支持持久化(RDB/AOF)。 单线程模型,通过 IO 多路复用实现高并发。 支持多种数据结构:字符串、哈希、列表、集合、有序集合等。 提供…...

【数据库】MySQL常见聚合查询详解

在数据库操作中,聚合查询是非常重要的一部分。通过聚合查询,我们可以对数据进行汇总、统计和分析。MySQL提供了丰富的聚合函数来满足不同的需求。本文将详细介绍MySQL中常见的40个聚合函数及其使用场景,并通过8个的案例展示它们的用法。 一、…...

蓝桥备赛(11)- 数据结构、算法与STL

一、数据结构 1.1 什么是数据结构? 在计算机科学中,数据结构是一种 数据组织、管理和存储的格式。它是相互之间存在一种 或多种特定关系的数据元素的集合。 ---> 通俗点,数据结构就是数据的组织形式 , 研究数据是用什么方…...

Linux的系统ip管理

ip地址 命令:ifconfig 127.0.0.1这个ip地址用于指本机。 0.0.0.0特殊ip地址用于指代本机,可以在端口绑定中用来确定绑定关系,在一些ip地址限制中,表示所有ip的意思。如放行规则设置为0.0.0.0,表示允许任意ip访问。 …...

【决策树】分类属性的选择

文章目录 1.信息增益(ID3)2.信息增益率(C4.5)3.基尼指数(CART)ps.三者对比 实现决策树算法最关键的一点就是如何从所有的特征属性中选择一个最优的属性对样本进行分类,这种最优可以理解为希望划…...

uniapp vue3 微信小程序 uni.chooseLocation使用

申请 先要去微信公众平台申请使用接口 开通成功之后就可以在项目中配置使用了 配置 配置manifest.json "mp-weixin": {/* 小程序特有相关 */"requiredPrivateInfos": ["chooseLocation"],"permission": {"scope.userLocati…...

9. Flink的性能优化

1. Flink的资源和代码优化 1.1 slot资源配置 Flink中具体跑任务的进程叫TaskManager,TM进程又会根据配置划分出诺干个TaskSlot,它是具体运行SubTask的地方。slot是Flink用来隔离各个subtask的资源集合,这里的资源一把指内存,TCP…...

十二、OSG学习笔记-Control

上一章节: 十一、OSG学习笔记-操作系统接口-CSDN博客https://blog.csdn.net/weixin_36323170/article/details/145891502 本章节代码: OsgStudy/Controls CuiQingCheng/OsgStudy - 码云 - 开源中国https://gitee.com/cuiqingcheng/osg-study/tree/ma…...

集群、分布式与微服务架构 区别

集群、分布式与微服务架构:概念解析与核心差异 在构建现代软件系统时,集群架构、分布式系统和微服务架构是三种常见的技术方案。它们常被混淆,但各自解决的问题、设计理念和应用场景截然不同。本文将从基础概念出发,深入分析三者…...

如何快速免费管理游戏DLSS版本?DLSS Swapper终极指南

如何快速免费管理游戏DLSS版本?DLSS Swapper终极指南 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper DLSS Swapper是一款革命性的开源工具,专为PC游戏玩家设计,能够智能管理、下载和…...

高性能键盘映射与SOCD清理架构解析:解决游戏输入冲突的技术方案

高性能键盘映射与SOCD清理架构解析:解决游戏输入冲突的技术方案 【免费下载链接】socd Key remapper for epic gamers 项目地址: https://gitcode.com/gh_mirrors/so/socd 在竞技游戏和高速动作游戏中,键盘输入的处理方式直接影响玩家的操作精度和…...

中文长文本语音崩溃?ElevenLabs API超时/截断/静音突变?20年语音架构师紧急发布的6行容错重试+分段重对齐代码(已验证10万+字符稳定输出)

更多请点击: https://intelliparadigm.com 第一章:中文长文本语音崩溃的根因诊断与现象复现 中文长文本语音合成(TTS)在处理超长段落(如 >3000 字)时频繁出现进程中断、内存溢出或静音输出,…...

轻量级配置中心zcf:中小团队微服务配置管理实战指南

1. 项目概述:一个轻量级、高可用的配置中心最近在梳理团队内部的技术栈,发现一个挺有意思的现象:很多中小型项目,甚至是一些快速迭代的业务线,在配置管理上依然处于一种“原始”状态。要么是各种application.yml、appl…...

Grad-CAM实战:用热力图透视神经网络的决策焦点

1. Grad-CAM技术初探:为什么我们需要热力图? 当你训练了一个图像分类模型,准确率高达95%,但你真的了解它是如何做出判断的吗?我曾在项目中遇到过这样的尴尬:模型把一只坐在草地上的哈士奇误判为"狼&qu…...

从零构建现代化工作流引擎:架构、实战与生产级部署指南

1. 项目概述:一个为专业开发者打造的现代化工作流引擎最近在GitHub上看到一个挺有意思的项目,叫rohitg00/pro-workflow。光看名字,你可能觉得这又是一个“工作流”工具,市面上这类工具已经多如牛毛了。但当我深入去研究它的源码、…...

开源AI应用开发平台TaskingAI:从RAG智能体到工作流编排实战

1. 项目概述:一个开源的AI应用开发平台最近在折腾AI应用开发的朋友,估计都绕不开一个核心痛点:想法很丰满,落地很骨感。你想做个智能客服、一个文档分析助手,或者一个个性化的内容生成工具,从模型调用、流程…...

OpenAgents开源框架:模块化AI智能体开发实战指南

1. 项目概述:一个面向未来的智能体开发框架最近在AI智能体这个圈子里,OpenAgents这个项目讨论度挺高的。简单来说,它不是一个单一的AI应用,而是一个旨在降低智能体开发门槛、加速智能体应用落地的开源框架。你可以把它想象成一个“…...

5分钟学会创建专业交通网络可视化地图

5分钟学会创建专业交通网络可视化地图 【免费下载链接】transit-map The server and client used in transit map simulations like swisstrains.ch 项目地址: https://gitcode.com/gh_mirrors/tr/transit-map 你想在网页上展示动态的公共交通网络吗?Transit…...

藏文语音生成准确率从61.2%跃升至94.8%:ElevenLabs Fine-tuning私有数据集构建全流程(含217小时母语者录音标注规范)

更多请点击: https://intelliparadigm.com 第一章:藏文语音生成技术演进与ElevenLabs适配挑战 藏文作为具有复杂音节结构、声调隐含性及丰富上下文依赖的黏着语系文字,其语音合成长期受限于高质量标注语料稀缺、音素-音节映射不唯一、以及缺…...