pytest7.4版本的一个变更,可能会影响你的项目

本文撰写于 2023.7.10

准备工作

  • 项目结构如下

    D:\Gitee\DemoRepo (17.97MB)
    +-- testCases (1.03KB)
    | +-- conftest.py (252b)
    | +-- pmCases (574b)
    | | +-- conftest.py (259b)
    | | `-- test_logout.py (315b)
  • 顶层conftest.py内容

    import pytest
    
    @pytest.fixture(scope='session')
    def fix_all():
    print('fix_all')
  • pmCases下的conftest.py内容

    import pytest
    
    @pytest.fixture(scope='session', autouse=True)
    def fix_all2():
    print('fix_all2')
  • test_logout.py内容

    import pytest
    
    def test_logout(fix_all):
    print('test_logout') if __name__ == '__main__':
    pytest.main(['-sv',__file__])

Pytest7.4之前

用的Pytest7.3.1,而实际7.4.0之前也就只有一个7.3.2了

  • 你是可以执行test_logout.py的

  • 效果如下

    test_logout.py::test_logout fix_all2
    fix_all
    test_logout
    PASSED
  • 所以按照以前的认识

    • conftest可以存在多个
    • 测试用例可以看到上级目录的conftest
    • 但看不到下级目录的conftest(此处没有演示)

Pytest4.0

执行效果

注意把pytest更新到pytest7.4.0

  • 同样执行test_logout.py

  • 效果如下

    D:\Gitee\DemoRepo\venv\Scripts\python.exe D:/Gitee/DemoRepo/testCases/pmCases/test_logout.py
    ============================= test session starts =============================
    platform win32 -- Python 3.9.6, pytest-7.4.0, pluggy-1.2.0 -- D:\Gitee\DemoRepo\venv\Scripts\python.exe
    cachedir: .pytest_cache
    rootdir: D:\Gitee\DemoRepo\testCases\pmCases
    collecting ... collected 1 item test_logout.py::test_logout fix_all2
    ERROR =================================== ERRORS ====================================
    ________________________ ERROR at setup of test_logout ________________________
    file D:\Gitee\DemoRepo\testCases\pmCases\test_logout.py, line 10
    def test_logout(fix_all):
    E fixture 'fix_all' not found
    > available fixtures: cache, capfd, capfdbinary, caplog, capsys, capsysbinary, doctest_namespace, fix_all2, monkeypatch, pytestconfig, record_property, record_testsuite_property, record_xml_attribute, recwarn, tmp_path, tmp_path_factory, tmpdir, tmpdir_factory
    > use 'pytest --fixtures [testpath]' for help on them. D:\Gitee\DemoRepo\testCases\pmCases\test_logout.py:10
    =========================== short test summary info ===========================
    ERROR test_logout.py::test_logout
    ============================== 1 error in 0.01s =============================== 进程已结束,退出代码为 0
  • 很清楚的提示

    E       fixture 'fix_all' not found
  • 子目录无法去引用上级目录的fixture

  • 而同级目录不受影响

  • 我们的实战课就会用到子目录下的测试文件调用上级目录的fixture,是没问题的,但现在会受影响。

  • 这是为何呢?第一个想法就是版本变动了。但觉得不太可以理解,正常版本变动对这些逻辑不应该去大改,除非是大版本的改变。因为一旦出现这样的引用,你以前的项目会无法调用。


  • 很多的时候你是在终端下执行

  • 修改test_logout.py

    def test_logout(fix_all):
    print('test_logout')
  • 终端下执行

    D:\Gitee\DemoRepo\testCases>pytest
    # 这是成功的
  • 这样执行

    D:\Gitee\DemoRepo\testCases\pmCases>pytest
    # 报错跟上面一样 E fixture 'fix_all' not found
  • 基于此,如果你是终端下执行的话,其实是没啥影响的。

  • 只有你要在子目录下测试或者单独执行子测试用例时可能会有问题


  • 带着这样的疑问去官方文档找原因。

changlog Of pytest 7.4.0

https://docs.pytest.org/en/7.4.x/changelog.html#

发布时间 (2023-06-23)

Features

Improvements

  • #10872: Update test log report annotation to named tuple and fixed inconsistency in docs for pytest_report_teststatus hook.

  • #10907: When an exception traceback to be displayed is completely filtered out (by mechanisms such as __tracebackhide__, internal frames, and similar), now only the exception string and the following message are shown:

    “All traceback entries are hidden. Pass --full-trace to see hidden and internal frames.”.

    Previously, the last frame of the traceback was shown, even though it was hidden.

  • #10940: Improved verbose output (-vv) of skip and xfail reasons by performing text wrapping while leaving a clear margin for progress output.

    Added TerminalReporter.wrap_write() as a helper for that.

  • #10991: Added handling of %f directive to print microseconds in log format options, such as log-date-format.

  • #11005: Added the underlying exception to the cache provider’s path creation and write warning messages.

  • #11013: Added warning when testpaths is set, but paths are not found by glob. In this case, pytest will fall back to searching from the current directory.

  • #11043: When --confcutdir is not specified, and there is no config file present, the conftest cutoff directory (--confcutdir) is now set to the rootdir. Previously in such cases, conftest.py files would be probed all the way to the root directory of the filesystem. If you are badly affected by this change, consider adding an empty config file to your desired cutoff directory, or explicitly set --confcutdir.

  • #11081: The norecursedirs check is now performed in a pytest_ignore_collect implementation, so plugins can affect it.

    If after updating to this version you see that your norecursedirs setting is not being respected, it means that a conftest or a plugin you use has a bad pytest_ignore_collect implementation. Most likely, your hook returns False for paths it does not want to ignore, which ends the processing and doesn’t allow other plugins, including pytest itself, to ignore the path. The fix is to return None instead of False for paths your hook doesn’t want to ignore.

  • #8711: caplog.set_level() and caplog.at_level() will temporarily enable the requested level if level was disabled globally via logging.disable(LEVEL).

Bug Fixes

  • #10831: Terminal Reporting: Fixed bug when running in --tb=line mode where pytest.fail(pytrace=False) tests report None.
  • #11068: Fixed the --last-failed whole-file skipping functionality (“skipped N files”) for non-python test files.
  • #11104: Fixed a regression in pytest 7.3.2 which caused to testpaths to be considered for loading initial conftests, even when it was not utilized (e.g. when explicit paths were given on the command line). Now the testpaths are only considered when they are in use.
  • #1904: Fixed traceback entries hidden with __tracebackhide__ = True still being shown for chained exceptions (parts after “… the above exception …” message).
  • #7781: Fix writing non-encodable text to log file when using --debug.

Improved Documentation

Trivial/Internal Changes

  • #11031: Enhanced the CLI flag for -c to now include --config-file to make it clear that this flag applies to the usage of a custom config file.

抓重点

  • 原文

    When `--confcutdir` is not specified, and there is no config file present, the conftest cutoff directory (`--confcutdir`) is now set to the [rootdir](https://docs.pytest.org/en/7.4.x/reference/customize.html#rootdir). Previously in such cases, `conftest.py` files would be probed all the way to the root directory of the filesystem. If you are badly affected by this change, consider adding an empty config file to your desired cutoff directory, or explicitly set `--confcutdir`.
  • 译文

    当未指定--confcutdir并且没有配置文件存在时,conftest截断目录(--confcutdir)现在被设置为rootdir。在以前的情况下,conftest.py文件会一直被探测到文件系统的根目录。如果你受到这个变化的严重影响,考虑在所需的截断目录中添加一个空的配置文件,或者明确地设置--confcutdir。

解决方式

  • 指定参数--confcutdir

  • 示例1: test_logout.py执行

    import pytest
    
    def test_logout(fix_all):
    print('test_logout') if __name__ == '__main__':
    pytest.main(['-sv','--confcutdir=..',__file__]) # 意思是设定conftest.py的搜索根目录是当前目录上级
  • 示例2: 终端执行

    # 你在pmCases下执行
    # 如果在项目根目录下,本来就是ok的
    pytest --confcutdir=..
  • 示例3: pytest.ini

    [pytest]
    # 改为实际的项目根目录即可
    addopts = --confcutdir="D:\Gitee\DemoRepo"
    • 注意不要写成--confcutdir=.(因为你是把pytest.ini放在根目录下的)

补充说明

  • 截止到撰写本文的时候(2023-7-10)发现

  • pip install pytest会安装最新的Pytest7.4.0

  • 而通过pycharm安装则是Pytest7.3.1

  • 对于这个参数,命令行--help的解释是

      --confcutdir=dir      Only load conftest.py's relative to specified dir

pytest7.4版本的一个变更,可能会影响你的项目的更多相关文章

  1. Android从5.0到9.0版本的主要变更

    https://www.jianshu.com/p/10bdbf883c46?utm_source=desktop&utm_medium=timeline Android5.0 1.虚拟机 在 ...

  2. dubbo的服务consumer与provider使用的api版本不一致,是否有影响

    dubbo的服务consumer与provider使用的api版本不一致,是否有影响 最近新接手一个项目,看到定义的dubbo接口有些很奇葩的设定. 一.消费端 与 服务端 调用的接口中的数据包装类型 ...

  3. 解决iPhone上select时常失去焦点,随意跳到下一个输入框,影响用户操作

    window.addEventListener('load', function() { FastClick.attach(document.body); }, false); //300s延迟,解决 ...

  4. 打造一个高逼格的android开源项目——小白全攻略 (转)

    转自:打造一个高逼格的android开源项目 小引子 在平时的开发过程中,我们经常会查阅很多的资料,最常参考的是 github 的开源项目.通常在项目的主页面能看到项目的简介和基本使用,并且时不时能看 ...

  5. 发现一个名为“Douyu”的国人项目

    刚刚在javaeye看到一个名为Douyu的国人项目,认为搞下去未来可能非常有意思,放到blog上做个标记. ——————下面是转载的作者原文——————— 原文地址例如以下:http://zhh20 ...

  6. 一个tomcat同时部署多个项目

    一个tomcat同时部署多个项目 1. 注意事项: 1. 每一个service的端口号不能产生冲突 2. service的name属性的值可以重复 name="Catalina" ...

  7. 使用gulp搭建一个传统的多页面前端项目的开发环境

    1.简介 使用gulp搭建一个传统的多页面前端项目的开发环境 支持pug scss es6编译支持 支持开发环境和打包生成sourceMap 支持文件变动自动刷新浏览器,css是热更新(css改动无需 ...

  8. 用java写一个servlet,可以将放在tomcat项目根目录下的文件进行下载

    用java写一个servlet,可以将放在tomcat项目根目录下的文件进行下载,将一个完整的项目进行展示,主要有以下几个部分: 1.servlet部分   Export 2.工具类:TxtFileU ...

  9. mac中:不能完成此操作,因为找不到一个或多个需要的项目。(错误代码 -43)

    今天使用mac删除某文件时,遇到此错误: 不能完成此操作,因为找不到一个或多个需要的项目.(错误代码 -43) 于是采用命令行删除可以正确删除:在要删除的文件夹坐在目录下执行   rm -rf tes ...

  10. IDEA如何导入一个web+maven以及如何运行项目

    IDEA如何导入一个web+maven以及如何运行项目 然后就可以运行你的maven项目了....

随机推荐

  1. yolov5训练自己的数据集

    1.安装cuda 可以先看看自己的 显卡信息,支持哪个cuda版本 cuda下载地址:https://developer.nvidia.com/cuda-toolkit-archive 我的RTX30 ...

  2. 一天吃透MySQL面试八股文

    什么是MySQL MySQL是一个关系型数据库,它采用表的形式来存储数据.你可以理解成是Excel表格,既然是表的形式存储数据,就有表结构(行和列).行代表每一行数据,列代表该行中的每个值.列上的值是 ...

  3. Tomcat长轮询原理与源码解析

    Tomcat长轮询原理与源码解析 系列文章目录和关于我 零丶长轮询的引入 最近在看工作使用到的diamond配置中心原理,发现大多数配置中心在推和拉模型上做的选择出奇的一致选择了基于长轮询的拉模型 基 ...

  4. xlsx纯前端导出表格,完善边框等样式

    仅用xlsx是无法实现文字样式及表格边框的style的,因此配合使用xlsx-style 以下源码直接复制过去用 // 源码什么的都不需要改动 import * as XLSXStyle from ' ...

  5. 一天吃透Redis面试八股文

    Redis连环40问,绝对够全! Redis是什么? Redis(Remote Dictionary Server)是一个使用 C 语言编写的,高性能非关系型的键值对数据库.与传统数据库不同的是,Re ...

  6. Java代码读取properties配置文件

    读取properties配置文件 package com.easycrud.utils; import java.io.IOException; import java.io.InputStream; ...

  7. .NET周报 【4月第5期 2023-04-30】

    国内文章 基于 Github 平台的 .NET 开源项目模板. 嘎嘎实用! https://www.cnblogs.com/NMSLanX/p/17326728.html 大家好,为了使开源项目的维护 ...

  8. 2020-11-22:mysql中,什么是filesort?

    福哥答案2020-11-22:[答案来自此链接:](http://bbs.xiangxueketang.cn/question/412)如果mysql在排序的时候没有使用到索引那么就会输出 using ...

  9. 2021-12-22:回文子串。 给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。 回文字符串 是正着读和倒过来读一样的字符串。 子字符串 是字符串中的由连续字符组成的一个序列。

    2021-12-22:回文子串. 给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目. 回文字符串 是正着读和倒过来读一样的字符串. 子字符串 是字符串中的由连续字符组成的一个序列. ...

  10. Selenium - 元素操作(3) - 下拉框操作

    Selenium - 元素操作 下拉框才做可以分为两类: select标签的下拉框:使用Select类进行操作: 非select标签的下拉框:一般是 ul,li, div 等标签组成,使用元素定位的方 ...