gpt4 book ai didi

pytest - 如何使用 tox+pytest 启用 DeprecationWarning 和 PendingDeprecationWarning 测试

转载 作者:行者123 更新时间:2023-12-04 16:45:57 25 4
gpt4 key购买 nike

多年来我一直在测试ruamel.yamltoxpytest定期用于多个版本的 Python。在第一个 Python 3.7 测试版发布后不久,我将其包含在内,并针对 3.7 发布版本升级了测试。然而,我仍然使用 Python 3.6(以及 2.7 在必要时)完成我的大部分日常工作。

因此,我很惊讶在 bitbucket 上记录了一个问题,为 DeprecationWarning因为 ruamel.yaml仍在从 collections 进口东西Python 2.X 方式(从 3.8 开始,这些 collections.abc 导入,它们已经存在)。我本来希望我的 tox运行,这是我的工具链中能够将新版本推送到 PyPI 的强制性先决条件,几个月前就已经捕获了这一点。

从命令行您可以看到警告,例如当你这样做时:

python3.7 -W always -c "import ruamel.yaml"

经过一番研究,我补充说:
[pytest]
filterwarnings =
error::DeprecationWarning
error::PendingDeprecationWarning

到我的 tox.ini ,它没有改变目标 py37 的测试结果(321 次通过/2 次跳过/7 次失败)。

然后我补充说:

设置环境 =
PYTHONWARNINGS=错误

到默认 ( [testenv] ) 目标。这给结果带来了一些有趣的变化,因为测试因 tox 中的弃用警告而崩溃。/ pytest/ virtualenv工具链本身。

我手动修复了这些(打算在干净的 tox -r 运行后自动化),看看这样做是否至少会导致 ruamel.yaml 的 tox 错误本身,但它没有。如果您改为添加:
setenv =
PYTHONWARNINGS=always::DeprecationWarning

[testenv]你会看到工具链有:

DeprecationWarning: 'U' mode is deprecated
DeprecationWarning: the imp module is deprecated in favour of importlib
DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working



最后一个实际上是我正在寻找的,但那些错误是因为 tox 依赖项 pyparsing 中的代码......

然后我新建文件 test_import.py一次测试:
def test_import():
from ruamel.yaml

并仔细检查 tox执行测试(通过 322 个测试), 但没有显示任何消息或警告 ,即使添加 -ra 也不行至 pytest .

我一直在期待 tox帮助我尽早找到弃用,但实际上似乎根本不可能触发它们。我当然可以添加上面显示的命令行,作为我 tox.ini 中的附加命令.但是一些弃用可能不会那么容易触发,我不想重复我的测试工作,只是为了捕捉潜在的弃用。

如何触发 DeprecationWarning在我的代码中使用 tox ?

最佳答案

如果您从最小 test_one.py 开始

def test_one():
from collections import Hashable

一个简单的 setup.py :
from setuptools import setup, find_packages

if __name__ == '__main__':
setup(
name="depwarntest",
version="0.0.1",
description="test to get DeprecationWarning in code on 3.7",
long_description = "more details soon",
author_email="a.van.der.neut@ruamel.eu",
author="Anthon van der Neut",
license="MIT",
url="",
packages=find_packages(),
)

和一个基本的 tox.ini :
[tox]
envlist = py37,py36,py27

[testenv]
commands =
/bin/bash -c 'pytest test_*.py'
deps =
pytest

[pytest]
filterwarnings =
error::DeprecationWarning
error::PendingDeprecationWarning

并运行 tox ,由于您的 import,您将得到一个很好的干净异常。 :
==================================================================================== FAILURES =====================================================================================
____________________________________________________________________________________ test_one _____________________________________________________________________________________

def test_one():
> from collections import Hashable

test_one.py:6:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
<frozen importlib._bootstrap>:1032: in _handle_fromlist
???
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

name = 'Hashable'

def __getattr__(name):
# For backwards compatibility, continue to make the collections ABCs
# through Python 3.6 available through the collections module.
# Note, no new collections ABCs were added in Python 3.7
if name in _collections_abc.__all__:
obj = getattr(_collections_abc, name)
import warnings
warnings.warn("Using or importing the ABCs from 'collections' instead "
"of from 'collections.abc' is deprecated, "
"and in 3.8 it will stop working",
> DeprecationWarning, stacklevel=2)
E DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working

.tox/py37/lib/python3.7/collections/__init__.py:52: DeprecationWarning
============================================================================ 1 failed in 0.31 seconds =============================================================================

py37 , 而 py36py27运行良好。

有趣的是,如果您将测试文件更改为读取
from collections import Hashable    

def test_one():
from collections import Hashable

运行 toxpy37 上运行良好以及。 如果您将该模块级导入移动到另一个 test_XYZ.py,情况甚至会如此。文件 .

对于 ruamel.yaml这意味着 ruamel.yaml 的所有模块级导入在测试文件中需要移动到方法/函数;测试中依赖的任何根级别类,例如在 ruamel.yaml.YAML()需要使用发电机;以及模块级别 yaml_object()也需要特殊处理。

一个额外的 tox target 通过一致性测试帮助测试渐进式移动:
# deprecation warning fail
[testenv:dwf]
basepython = python3.7
commands =
/bin/sed 's/collections.abc/collections/' -i .tox/dwf/lib/python3.7/site-packages/ruamel/yaml/comments.py
/bin/bash -c 'pytest --maxfail=2 _test/test_[a-cz]*.py'

这里已经更正的来源 comments.py被还原,只对已经适配的模块进行测试。 ted -e py37,dwf应该通过第一个(再次通过 321 测试)并在第二个目标上失败。

关于pytest - 如何使用 tox+pytest 启用 DeprecationWarning 和 PendingDeprecationWarning 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51573204/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com