如何抑制 py.test 内部弃用警告

有没有办法可以压制 Pytest 内部的反对警告?

背景: 我正在评估将测试套件从 nose移植到 pytest的难度。该套件相当大,并且大量使用基于 nose风格的 yield测试生成器。

我想首先确保 存在测试通过与 pytest,然后可能会改变测试生成器为 parameterized

仅仅使用 pytest3.0.4运行 $ pytest path-to-test-folder,就完全被

WC1 ~repos/numpy/numpy/lib/tests/test_twodim_base.py yield tests are deprecated, and scheduled to be removed in pytest 4.0

有没有办法把这些警告关掉?

88531 次浏览

来自 pytest --help:

--disable-pytest-warnings
disable warnings summary, overrides -r w flag

pytest -p no:warnings,或者将以下内容添加到 pytest.ini 或 tox.ini:

[pytest]
addopts = -p no:warnings

结果将是绿色的,没有任何警告。请参阅 https://docs.pytest.org/en/latest/warnings.html#disabling-warnings-summary的文档。

这可以作为您想要干净输出的测试套件的有效用例。

请注意,总是隐藏所有警告可能会导致您错过重要的警告。

我认为你不想隐藏所有的警告,但只是那些无关紧要的。在本例中,来自导入的 python 模块的弃用警告。

阅读关于 捕捉警告的 pytest 文档:

W 命令行选项和 filterpolice ini 选项都基于 Python 自己的 W 选项警告,简单过滤器,因此请参考 Python 文档中的这些部分以获得其他示例和高级用法。

因此,您可以使用 python 的 -W选项过滤警告!

看起来 pytest完全删除了过滤器,因为它在运行时显示了所有那些 DeprecationWarning,Python 关于 默认警告过滤器的文档清楚地说明:

在常规版本生成中,默认警告筛选器具有 下列参赛作品(优先顺序) :

default::DeprecationWarning:__main__
ignore::DeprecationWarning
ignore::PendingDeprecationWarning
ignore::ImportWarning
ignore::ResourceWarning

因此,在您的情况下,如果您想让 say 过滤您想要忽略的警告类型,比如那些 DeprecationWarning,只需运行带有 -W选项的 pytest 命令:

$ pytest path-to-test-folder -W ignore::DeprecationWarning

编辑 : 根据 Colini的注释,可以按模块进行过滤。忽略来自所有 sql 炼金术的弃用警告的示例:

ignore::DeprecationWarning:sqlalchemy.*:

然后,您可以列出在 pytest的输出中产生太多噪音的已安装模块

与 file 一起使用,而不是在命令行中使用:

您可能更喜欢在 pytest.ini 文件中列出这些过滤器:

[pytest]
filterwarnings =
ignore::DeprecationWarning

我不想隐藏所有的警告,所以我把这个在 pytest.ini

[pytest]
filterwarnings =
ignore::DeprecationWarning

在 pytest.ini 文件中,您可以添加:

[pytest]
addopts = -p no:warnings

OR 传递到命令行的下一行。如果您的测试套件使用外部系统处理警告,这可能会很有用。

- 警告

OR 如果只想隐藏某些特定的不推荐的警告,请在 pytest.ini 文件中添加以下语句

[pytest]
filterwarnings =
ignore:.*U.*mode is deprecated:DeprecationWarning

如果消息的开头与正则表达式相匹配,则忽略所有 DerecationPolice 类型的警告”。* U * 模式已弃用”。

OR 虽然不推荐使用,但可以使用

警告

命令行选项完全禁止测试运行输出中的警告摘要。

下面是如何在使用 pyproject.toml文件作为配置时禁止显示警告的 链接

[tool.pytest.ini_options]
testpaths = ["./tests/unit"]
filterwarnings = ["ignore:::.*third_party_package.module:123", "ignore:::.*another_module*"]

在这种情况下,123是要抑制的行号

如果您使用的是 setup.cfg文件,请将以下内容输入:

[tool:pytest]
addopts = -p no:warnings

你需要 tool:pytest而不仅仅是 pytest,但它会告诉你:

失败: 不再支持 setup.cfg 文件中的[ pytest ]部分,改为[ tool: pytest ]。