pytest 8.0 重磅发布!2条弃用规则,7项重大变更,多项优化改进

news2024/11/17 23:50:36

(全文约3200字,阅读约需7分钟,建议先收藏后阅读。首发于公众号:测试开发研习社,欢迎关注)

图片

pytest 版本遵循 ( <major>.<minor>.<patch>) 语义控制。

昨天发布的 pytest 8.0 是全新的 major 版本,

意味本次更新有重大变更,以及向后不兼容的修改!

1. 重大变更

01. 移除历史包袱

一大批弃用警告升级为错误,从而无法继续使用,并将在 8.1 正式从代码中移除。

如果你还没有了解新版变化,手滑升级到了 8.0后无法正常运行,可以通过屏蔽警告的方式,暂时过渡

[pytest]filterwarnings =    ignore::pytest.PytestRemovedIn8Warning

注意,这是一个临时解决方案,8.1 之后这个方法也会失效

02. Python >=3.8

Python 3.7 生命周期在 2023 年 6 月 27 日已终止。

pytest 自本次更新之后,放弃了对 python 3.7 的兼容。

03.pluggy >=1.3.0

pluggy 1.3 引入了新的基于生成器的新式钩子包装器(hookwrapper)

在旧式的钩子包装器中,获取和修改钩子结果,使用了面向对象式的方式:


@pytest.hookimpl(hookwrapper=True)
def pytest_pyfunc_call(pyfuncitem):

    outcome = yield   # <--------- 生成器方式接收对象

    res = outcome.get_result()  # <--- 【面向对象】方式获取旧结果

    new_res = post_process_result(res)

    outcome.force_result(new_res)  # <--- 【面向对象】方式设置新结果

而在新式的钩子包装其中,获取和修改钩子结果,直接使用生成器自身的语法


@pytest.hookimpl(wrapper=True)  # 使用新参数申明 新式包装器
def pytest_pyfunc_call(pyfuncitem):

    res = yield   # <-------------- 生成器方式获取旧结果

    new_res = post_process_result(res)

    return new_res   # <-------------- 生成器方式设置新结果

可以看到,新式写法简洁了很多,有更强烈的Python风格

04.区分包和目录

新增类:pytest.Directory 表示目录

既有类:pytest.Package 表示包

包和目录的概念得以加强,各司其职

假设有以下目录关系

myroot/        pytest.ini        top/        ├── aaa        │   └── test_aaa.py        ├── test_a.py        ├── test_b        │   ├── __init__.py        │   └── test_b.py        ├── test_c.py        └── zzz            ├── __init__.py            └── test_zzz.py

在此前的 pytest 版本中,被处理为以下结果

<Session>  <Module top/test_a.py>    <Function test_it>  <Module top/test_c.py>    <Function test_it>  <Module top/aaa/test_aaa.py>    <Function test_it>  <Package test_b>    <Module test_b.py>      <Function test_it>  <Package zzz>    <Module test_zzz.py>      <Function test_it>

本次更新之后,会被处理为这样

<Session>  <Dir myroot>    <Dir top>      <Dir aaa>        <Module test_aaa.py>          <Function test_it>      <Module test_a.py>        <Function test_it>      <Package test_b>        <Module test_b.py>          <Function test_it>      <Module test_c.py>        <Function test_it>      <Package zzz>        <Module test_zzz.py>          <Function test_it> 

​​​​​​​

05. 调整用例收集顺序

此前,用例收集顺序是先文件、后目录

此次更新中,用例收集按照字母顺序进行

这一点请macOS用户特别关注,此前因操作系统的差异,macOS中用例执行顺序和Windows中有细微差异。

此次更新可能回到结果造成影响

具体例子可回顾上一小节中收集结果

06. 断言警告

pytest 提供了一个对警告进行断言的方式


def test_is_user_waring():
    # 出现指定类型警告则测试通过,否则失败
    with pytest.warns(UserWarning):
        warnings.warn(f"这是一条用户警告", UserWarning)
         warnings.warn(f"这是一条语法警告", SyntaxWarning)
 

在此前的版本中执行结果如下(无事发生...)

===================== test session starts ==================
platform win32 -- Python 3.12.0, pytest-7.4.0, pluggy-1.0.0
rootdir: D:\pytest_7.2.x
configfile: pytest.ini
collected 1 item 

test_show_warnings.py .                                 [100%] 

===================== 1 passed in 0.01s =====================

自 8.0 开始,warns 只会捕获它所断言的警告类型,至于其他警告,则会重新抛出,执行结果如下


===================== test session starts ==================
platform win32 -- Python 3.12.0, pytest-8.0.0, pluggy-1.4.0
rootdir: D:\pytest_8.0.x
collected 1 item

test_show_warnings.py .                               [100%] 

===================== warnings summary ===================== 
test_show_warnings.py::test_is_user_waring
  D:\pytest_8.0.x\test_show_warnings.py:10: SyntaxWarning: 这是一条语法警告
    warnings.warn(f"这是一条语法警告", SyntaxWarning)

-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
============== 1 passed, 1 warning in 0.01s =================

07. 净化 ini 配置的默认值

过去,对于未设置的 ini 配置,会根据类型返回空列表或空字符串,

于是出现了一个 bug:如果设置默认值 None ,会像未设置默认值一样,返回空列表

自 8.0 开始,对默认值的返回进行了更加具体地处理规则:

  1. 如果设置了默认值,返回默认值(哪怕默认值是 None)

  2. 没有设置默认值但申明了类型,根据类型返回空列表、空字符串或布尔值 False

  3. 没有设置默认,也没有申明类型,返回空字符串

2. 优化改进

01. 改进差异显示(diff)

建议安装 pygments,增加色彩突出

对于同一个测试用例​​​​​​​

def test_diff_list():    a = list('123')    b = list('123345')

pytest 7 的执行结果如下

图片

(双击可放大)

更新至 8.0 后,差异显示更加直观

图片

(双击可放大)

不仅告诉我们错了,还是告诉我们哪里错了;不仅告诉我们哪里错了,还告诉我们为什么错了,具体是哪个字符不对...

还有比这更贴心的测试框架吗?

02. 单独控制断言详细程度

如果想要像上一小节中那样显示断言的详细信息,需要添加命令行参数 -vv

pytest --vv

需要注意的是:-vv 不仅让断言信息更加详细,

也让整个终端输出更加详细,比如会更详细地显示版本信息、用例名、用例执行结果等。

如果只希望断言详细,而不需要其他信息变冗长呢?

8.0 新增了一个 ini 配置项目 verbosity_assertions ,可单独对断言详细程度进行控制

​​​​​​​

[pytest]verbosity_assertions  = 2

03. 新式钩子包装器

更加纯粹的,符合生成器风格的钩子包装器,

详见前文 1.3

04. 优化日志配置

这个bug 我在前几天读源码的时候发现了,本来准备提交补丁刷个贡献值,

不过已经被人在 9 月份就抢了先。。。

就说说 BUG 的原因:

首先,在 pytest 中对于日志内容有多种处理方式:

  1. caplog_handler:记录到 fixture 中,供用例使用

  2. report_handler:记录到 report 中,供测试报告使用

  3. log_file_handler:记录到文件中,形成日志文件

  4. log_cli_handler:记录到终端中,在命令行输出

然后 pytest 配置文件中有 3 种对日志的配置选项

  • log_cli_*:作用于终端

  • log_file_*:作用于文件

  • log_*:作用于全局

直观上来说,如果 log_cli_* 或 log_file_* 没有配置的话,

应该读取 log_* 中的内容

或者,如果 log_cli_* 或 log_file_* 完全相同的话,不必重复配置 2 次,

应该直接对 log_* 进行配置

没错,代码中也是怎么写的。。。

但是!但是! log_cli_* 或 log_file_* 居然有默!认!值!

就算你真的没有对它们配置,它们也会读取到默认值而不是 log_* 中的内容,

导致相同的内容必须配置3次才能正常工作

在此次更新中,修复了这个BUG,统一和简化了日志的配置

05. 其他

还有一些改进,以文档和类型申明为主,

如有兴趣,可以点击文章底部【查看原文】进行了解

3. BUG 修复

已经修复的 BUG 我不太关注

图片

4. 弃用规则

01. 测试用例不该有返回值

用例执行结果必须是 None,也就是不应该有返回值

三三三木,公众号:测试开发研习社pytest的内置插件盘点7:python

在此前的pytest版本中,如果用例返回非 None 的结果,会引发弃用警告

按照计划,弃用警告也会在 8.0 中引发错误、无法使用,并在 8.1 彻底清除。

但是此次 8.0 发布的版中,如果用例返回非 None 的结果,只会引发普通警告,不再引发弃用警告。

这也意味着,pytest 开发团队不再认为用例返回结果是一个错误

02. fixture 不应该添加标记

usefixture 是 pytest 的内置标记

三三三木,公众号:测试开发研习社pytest的内置插件盘点5:fixtures

我们知道,给测试用例在参数列表中加上 fixture 名,或者 usefixtures 标记中假设 fixture 名,会自动请求该 fixture

import pytest

@pytest.fixture()
def f():
    1/0


@pytest.mark.usefixtures('f')
def test_abc():
    pass

执行结果

图片

(双击可放大)

我们还知道,fixture 也可以请求 fixture,

所以给 fixture 在参数列表中加上 fixture 名,会自动请求该 fixture


import pytest


@pytest.fixture()
def ff():
    assert False


@pytest.fixture()
def f(f):
    1 / 0


@pytest.mark.usefixtures('f')
def test_abc():
    pass

执行结果

图片

(双击可放大)

但是请注意:给 fixture 加上 usefixtures 标记中 fixture 名,不会请求 fixture

因为标记只对用例有效,对 fixture 是无效的

图片

(双击可放大)

自 8.0 开始,再犯这样的错误,会引发弃用警告。

其实我不只见过这种给给 fixture 加标记的操作,还见过给用例加 fixture 的操作。。

图片

(双击可放大)

归根到底,是没有把 case 和 fixture 分清楚,强烈建议这种把操作也列入弃用

结语

老实说,我在刚看到对于 Pytest 8.0 正式发布时既兴奋又焦虑。

我的《pytest 源码剖析》才完成一半,就眼睁睁看着它从 7.0 更新到 7.2,又从 7.2 更新到 7.4,

现在又更新了个大版本到 8.0,真担心写的速度跟不上是它变得速度。

不过,在仔细研究了变更内容后,发现问题不大,预计 8.1 的时候可以写第二版本,就缩短距离了。

如果你 pytest 感兴趣的话欢迎点赞关注,希望本书能为你更深入了解 pytest 提供一些帮助

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

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

相关文章

使用WAF防御网络上的隐蔽威胁之反序列化攻击

什么是反序列化 反序列化是将数据结构或对象状态从某种格式转换回对象的过程。这种格式通常是二进制流或者字符串&#xff08;如JSON、XML&#xff09;&#xff0c;它是对象序列化&#xff08;即对象转换为可存储或可传输格式&#xff09;的逆过程。 反序列化的安全风险 反序…

外汇天眼:国外汇民遭遇黑平台TO FOREX,损失惨重!

大家都知道&#xff0c;判断外汇平台是否靠谱&#xff0c;并不单单只依靠交易收益情况&#xff0c;而是需要从多方面的情况进行总结&#xff0c;特别是在外汇交易前&#xff0c;就要对外汇平台进行检验&#xff0c;比如检验平台是否有正规监管牌照、口碑评价、资质、创建时间以…

C语言第十二弹--扫雷

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 扫雷 1、扫雷游戏分析和设计 1.1、扫雷游戏的功能说明 1.2 游戏的分析和设计 1.2.1、数据结构的分析 1.2.2、文件结构设计 2、扫雷游戏的结构分析 2.1、用…

静态分析Golang语言生成函数调用关系的利器——go-callvis

目录 升级go删除旧版本安装新版本配置环境变量载入环境修改当前环境修改之后进入的环境 分析安装go-callvis分析其他包总结 导出文件总结 清晰主体脉络总结 其他 参考资料 不同于之前分析C语言项目的工具&#xff0c;go-callvis还是很方便使用。只要把两项工作做好就能顺利的使…

Android 基础技术——Bitmap

笔者希望做一个系列&#xff0c;整理 Android 基础技术&#xff0c;本章是关于 Bitmap Bitmap 内存如何计算 占用内存 宽 * 缩放比例 * 高 * 缩放比例 * 每个像素所占字节 缩放比例 设备dpi/图片所在目录的dpi Bitmap加载优化&#xff1f;不改变图片质量的情况下怎么优化&am…

HX711压力传感器学习一(STM32)

目录 原理图&#xff1a;​ 引脚介绍&#xff1a; HX711介绍工作原理: 程序讲解&#xff1a; 整套工程&#xff1a; 发送的代码工程&#xff0c;与博客的不一致&#xff0c;如果编译有报错请按照报错和博客进行修改 原理图&#xff1a; 引脚介绍&#xff1a; VCC和GND引…

Leetcode刷题笔记题解(C++):1117. H2O 生成(多线程)

思路&#xff1a; 解法二&#xff1a;生产者-消费者解法 1.把 hydrogen 线程看作生产者&#xff0c;oxygen 线程看作消费者&#xff0c;缓冲队列大小为2。 2.hydrogen 把生成的氢放入队列&#xff1b;oxygen 线程每次从队列里消费两个氢元素。 3.生产者生产两个氢元素后会因为…

openGauss学习笔记-209 openGauss 数据库运维-常见故障定位案例-共享内存泄露问题

文章目录 openGauss学习笔记-209 openGauss 数据库运维-常见故障定位案例-共享内存泄露问题209.1 共享内存泄露问题209.1.1 问题现象209.1.2 原因分析209.1.3 处理方法 openGauss学习笔记-209 openGauss 数据库运维-常见故障定位案例-共享内存泄露问题 209.1 共享内存泄露问题…

精通Python第20篇—数据之美:用Pyecharts打造引人入胜的多维度仪表盘与图表联动

引言 在数据可视化领域&#xff0c;仪表盘图是一种直观而强大的工具&#xff0c;用于展示关键指标的实时状态。Pyecharts是一个基于Echarts的Python图表库&#xff0c;提供了丰富的图表类型&#xff0c;其中包括了仪表盘图。本文将介绍如何使用Pyecharts绘制多种炫酷的仪表盘图…

05.领域驱动设计:认识领域事件,解耦微服务的关键

目录 1、概述 2、领域事件 2.1 如何识别领域事件 1.微服务内的领域事件 2.微服务之间的领域事件 3、领域事件总体架构 3.1 事件构建和发布 3.2 事件数据持久化 3.3 事件总线 (EventBus) 3.4 消息中间件 3.5 事件接收和处理 4、案例 5、总结 1、概述 在事件风暴&a…

SpringBoot内置工具类

Collections java.util包下的Collections类&#xff0c;该类主要用于操作集合或者返回集合 一、排序 List<Integer> list new ArrayList<>();list.add(2);list.add(1);list.add(3);Collections.sort(list);//升序System.out.println(list);Collections.reverse(…

vue实践:构建高效的电子签名功能

前言 在现代数字化时代&#xff0c;电子签名成为了一种方便、高效且安全的签署文件的方式。本文将介绍电子签名的原理和实现方法&#xff0c;帮助你快速掌握这一重要的工具。 电子签名是什么&#xff1f; 电子签名是一种数字化的签名方式&#xff0c;用于验证和确认电子文档、…

GitLab16.8配置webhooks、Jenkins2.4配置GitLab插件实现持续集成、配置宝塔面板实现持续部署(其三)

看本篇文章的前提是已经部署完GItlab和Jenkins服务器&#xff0c;已经可以手动构建成功&#xff0c;并且经过了很多次实践&#xff0c;对这两款软件基本熟悉。 建议大家按以下顺序看 前端自动化&#xff08;其一&#xff09;部署gitlab 前端自动化&#xff08;其二&#xff0…

第五篇:express路由路径方式(字符串,字符串模式,和正则)

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 &#x1f4d8; 引言&#xff1a; &#x1f4…

MYSQL基本查询(CURD:创建、读取、更新、删除)

文章目录 前言一、Create1.全列插入2.指定列插入3.插入否则更新4.替换 二、Retrieve1.SELECT列2.WHERE条件3.结果排序4.筛选分页结果 三、Update四、Delete1.删除数据2.截断表 五、插入查询结果六、聚合函数 前言 操作关系型数据库的编程语言&#xff0c;定义了一套操作关系型…

用友U9 PatchFile.asmx 任意文件上传漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

CC攻击类型有几种?有什么有用的防御方法?

CC攻击&#xff08;Challenge Collapsar Attack&#xff09;是一种复杂的网络攻击&#xff0c;它利用了一种分布式拒绝服务攻击工具来发动攻击。这种攻击方式通常由黑客组织或恶意竞争者发起&#xff0c;旨在破坏目标网络或系统的正常运行。 CC攻击的核心在于使用大量的虚假请…

如何选择便捷安全的黄金交易平台?

黄金交易平台的介绍 黄金交易平台是一个提供方便、安全的方式进行黄金交易的网上平台。 投资者可以通过这些平台进行黄金的买卖&#xff0c;参与黄金市场的投资活动。 这些平台提供了一个简单易用的界面&#xff0c;让投资者可以方便地进行交易操作。 选择合适的黄金交易平台…

Kafka-服务端-GroupMetadataManager

GroupMetadataManager是GroupCoordinator中负责管理Consumer Group元数据以及其对应offset信息的组件。 GroupMetadataManager底层使用Offsets Topic,以消息的形式存储Consumer Group的GroupMetadata信息以及其消费的每个分区的offset,如图所示。 consumer_offsets的某Partiti…

LLM之Agent(九)| 通过API集成赋能Autogen Multi-Agent系统

随着大型语言模型的快速发展&#xff0c;构建基于LLM驱动的自治代理&#xff08;autonomous agents&#xff09;已经成为一个备受关注的话题。仅在过去一年中&#xff0c;就出现了许多基于这一理念的新技术和框架。 ​ 本文将探索微软开源的Agent框架&#xff1a;Autogen…