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项目了....
随机推荐
- 和我一起学 Three.js【初级篇】:1. 搭建 3D 场景
欢迎关注「前端乱步」公众号,我会在此分享 Web 开发技术,前沿科技与互联网资讯. 0. 系列文章合集 本系列第 6,7 章节支持微信公众号内付费观看,将在全系列文章点赞数+评论数 >= 500 ...
- 服务器实现端口转发的N种方式
简介 在一些实际的场景里,我们需要通过利用一些端口转发工具,比如系统自带的命令行工具或第三方小软件,来绕过网络访问限制触及目标系统.下文为大家总结了linux系统和windows系统端口转发常用的一些 ...
- XXL-JOB定时任务框架(Oracle定制版)
特点 xxl-job是一个轻量级.易扩展的分布式任务调度平台,能够快速开发和简单学习.开放源代码并被多家公司线上产品使用,开箱即用.尽管其确实非常好用,但我在工作中使用的是Oracle数据库,因为xx ...
- 09-devserver
const {resolve} = require('path') const HtmlWebpackPlugin = require('html-webpack-plugin') module.ex ...
- 使用ServiceSelf解决.NET应用程序做服务的难题
1 ServiceSelf 为.NET 泛型主机的应用程序提供自安装为服务进程的能力,支持windows和linux平台. 功能 自我服务安装 自我服务卸载 自我服务日志监听 2 自我服务安装 虽然. ...
- API网关:开源Apinto网关-上游服务篇(二)
功能介绍 服务发现是一种分布式系统中的关键技术,它能够帮助应用程序动态地发现和访问依赖的服务实例,解决了服务实例分布在不同节点上的问题.通过服务发现,应用程序可以快速找到需要调用的服务实例的位置和元数 ...
- Vue中关于keep-alive的使用
keep-alive是Vue提供的一个抽象组件,用来对组件进行缓存,从而节省性能,由于是一个抽象组件,所以在v页面渲染完毕后不会被渲染成一个DOM元素 当组件在keep-alive内被切换时组件的ac ...
- 当我再次用Kotlin完成五年前已经通过Kotlin完成的项目后
> 近日来对Kotlin的使用频率越来越高, 也对自己近年来写过的Kotlin代码尝试进行一个简单的整理. 翻到了自己五年前第一次使用Kotlin来完成的一个项目([贝塞尔曲线](https ...
- ai问答:使用 Vue3 组合式API 和 TS 配置 axios 拦截器 http错误状态
通过 axios.create() 可以创建一个 axios 实例 axiosInstance,参数如下: baseURL:请求前缀 timeout:超时时间 headers:请求头 默认配置: im ...
- C# POST提交以及 解析 JSON 实例
一.解析的JSON字符串如下 {"tinyurl":"http:\/\/dwz.cn\/v9BxE","status":0,"lo ...