pytest7.4版本的一个变更,可能会影响你的项目
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
发布时间 (2023-06-23)
Features
- #10901: Added
ExceptionInfo.from_exception(), a simpler way to create anExceptionInfofrom an exception. This can replaceExceptionInfo.from_exc_info()for most uses.
Improvements
#10872: Update test log report annotation to named tuple and fixed inconsistency in docs for
pytest_report_teststatushook.#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-traceto see hidden and internal frames.”.Previously, the last frame of the traceback was shown, even though it was hidden.
#10940: Improved verbose output (
-vv) ofskipandxfailreasons 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
%fdirective to print microseconds in log format options, such aslog-date-format.#11005: Added the underlying exception to the cache provider’s path creation and write warning messages.
#11013: Added warning when
testpathsis set, but paths are not found by glob. In this case, pytest will fall back to searching from the current directory.#11043: When
--confcutdiris 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.pyfiles 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
norecursedirscheck is now performed in apytest_ignore_collectimplementation, so plugins can affect it.If after updating to this version you see that your
norecursedirssetting is not being respected, it means that a conftest or a plugin you use has a badpytest_ignore_collectimplementation. Most likely, your hook returnsFalsefor 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 returnNoneinstead ofFalsefor paths your hook doesn’t want to ignore.#8711:
caplog.set_level()andcaplog.at_level()will temporarily enable the requestedleveliflevelwas disabled globally vialogging.disable(LEVEL).
Bug Fixes
- #10831: Terminal Reporting: Fixed bug when running in
--tb=linemode wherepytest.fail(pytrace=False)tests reportNone. - #11068: Fixed the
--last-failedwhole-file skipping functionality (“skipped N files”) for non-python test files. - #11104: Fixed a regression in pytest 7.3.2 which caused to
testpathsto be considered for loading initial conftests, even when it was not utilized (e.g. when explicit paths were given on the command line). Now thetestpathsare only considered when they are in use. - #1904: Fixed traceback entries hidden with
__tracebackhide__ = Truestill 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
- #9146: Improved documentation for
caplog.set_level().
Trivial/Internal Changes
- #11031: Enhanced the CLI flag for
-cto now include--config-fileto 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版本的一个变更,可能会影响你的项目的更多相关文章
- Android从5.0到9.0版本的主要变更
https://www.jianshu.com/p/10bdbf883c46?utm_source=desktop&utm_medium=timeline Android5.0 1.虚拟机 在 ...
- dubbo的服务consumer与provider使用的api版本不一致,是否有影响
dubbo的服务consumer与provider使用的api版本不一致,是否有影响 最近新接手一个项目,看到定义的dubbo接口有些很奇葩的设定. 一.消费端 与 服务端 调用的接口中的数据包装类型 ...
- 解决iPhone上select时常失去焦点,随意跳到下一个输入框,影响用户操作
window.addEventListener('load', function() { FastClick.attach(document.body); }, false); //300s延迟,解决 ...
- 打造一个高逼格的android开源项目——小白全攻略 (转)
转自:打造一个高逼格的android开源项目 小引子 在平时的开发过程中,我们经常会查阅很多的资料,最常参考的是 github 的开源项目.通常在项目的主页面能看到项目的简介和基本使用,并且时不时能看 ...
- 发现一个名为“Douyu”的国人项目
刚刚在javaeye看到一个名为Douyu的国人项目,认为搞下去未来可能非常有意思,放到blog上做个标记. ——————下面是转载的作者原文——————— 原文地址例如以下:http://zhh20 ...
- 一个tomcat同时部署多个项目
一个tomcat同时部署多个项目 1. 注意事项: 1. 每一个service的端口号不能产生冲突 2. service的name属性的值可以重复 name="Catalina" ...
- 使用gulp搭建一个传统的多页面前端项目的开发环境
1.简介 使用gulp搭建一个传统的多页面前端项目的开发环境 支持pug scss es6编译支持 支持开发环境和打包生成sourceMap 支持文件变动自动刷新浏览器,css是热更新(css改动无需 ...
- 用java写一个servlet,可以将放在tomcat项目根目录下的文件进行下载
用java写一个servlet,可以将放在tomcat项目根目录下的文件进行下载,将一个完整的项目进行展示,主要有以下几个部分: 1.servlet部分 Export 2.工具类:TxtFileU ...
- mac中:不能完成此操作,因为找不到一个或多个需要的项目。(错误代码 -43)
今天使用mac删除某文件时,遇到此错误: 不能完成此操作,因为找不到一个或多个需要的项目.(错误代码 -43) 于是采用命令行删除可以正确删除:在要删除的文件夹坐在目录下执行 rm -rf tes ...
- IDEA如何导入一个web+maven以及如何运行项目
IDEA如何导入一个web+maven以及如何运行项目 然后就可以运行你的maven项目了....
随机推荐
- STM32新建模板【HAL库】
看到这篇笔记的小伙伴可能会觉得我在做无用功,明明可以通过 STM32CubeMx 软件直接生成的,还在这里慢慢的创建项目.我觉得在学习的时候最好少借助工具,当我们过度依赖工具的时候,决绝问题的能力可能 ...
- 运行项目报错Cannot read property 'styles' of undefined
原因是安装依赖版本不对,以下是我的解决办法: 1.先删除项目中package-lock.json 文件 及node_modules文件(可使用rimraf指令删除node_modules,直接删文件很 ...
- 如何在现有项目中使用`Masa MiniApi`?
首先我们现有创建一个空的WebApi的项目模板,这个项目模板和MasaFramework本身没有任何关联,我们本博客只是使用的MasaFramework的MiniApi的包 创建Asp.NET Cor ...
- 【Qt6】QWindow类可以做什么
原来的水文标题是"用 VS Code 搞 Qt6",想想还是直接改为"Qt6",反正这个用不用 VS Code 也能搞.虽然我知道大伙伴们都很讨厌 CMake, ...
- CS144 计算机网络 Lab2:TCP Receiver
前言 Lab1 中我们使用双端队列实现了字节流重组器,可以将无序到达的数据重组为有序的字节流.Lab2 将在此基础上实现 TCP Receiver,在收到报文段之后将数据写入重组器中,并回复发送方. ...
- pytest的几种执行方式
1 pytest xxxx 2 python -m pytest xxxx python -m pytest --html=./report/rep2.html test_env_pytest_ini ...
- 如何将c#在线编辑器嵌入自己项目
如何将c#在线编辑器嵌入自己项目 首先我们需要介绍一下这个在线编辑器,当前的在线编辑器支持c#的代码编译运行,并且无需后台服务,基于WebAssembly实现的在浏览器端去执行我们的c#代码,基于Ro ...
- 将音频格式从flac转到wav的两种方法
最近在智能语音中用到了数据集cn-celeb.这个数据集的音频格式是flac,而在做数据增强(augmentation)以及模型训练时用的数据格式是wav,因此需要把音频格式从flac转到wav.我在 ...
- 2021-02-09:如何删除一个链表的倒数第n个元素?
2021-02-09:如何删除一个链表的倒数第n个元素? 福哥答案2021-02-09: 1.创建虚拟头元素,虚拟头元素的Next指针指向头元素.2.根据快慢指针求倒数第n+1个元素,假设这个元素是s ...
- 2021-06-17:生成长度为size的达标数组,什么叫达标?达标:对于任意的 i<k<j,满足 [i] + [j] != [k] * 2。给定一个正数size,返回长度为size的达标数组。
2021-06-17:生成长度为size的达标数组,什么叫达标?达标:对于任意的 i<k<j,满足 [i] + [j] != [k] * 2.给定一个正数size,返回长度为size的达标 ...