如何在 Pytest 中忽略警告

一、在 Pytest 中完全禁用警告

你可以使用 --disable-warnings 命令行选项从测试运行输出中完全抑制警告摘要。

$ pytest --disable-warnings

这是一个极端选项,它有其缺点,最大的缺点是你将不知道有关于你的警告,应该被关注并被解决(因为 Pytest 将过滤掉所有警告)。

你也可以使用 -p no:warnings 命令行选项禁用警告捕获。

$ pytest -p no:warnings

或者使用配置文件

[pytest]
addopts = -p no:warnings

更好的选项是使用 pytest.ini 文件来抑制或过滤特定警告。

如果你不熟悉使用 Pytest 配置文件,我强烈推荐你查看这篇文章,了解更多。

二、抑制或过滤警告

Pyst允许你使用 pytest.ini 文件和 filterwarnings 选项轻松抑制或过滤警告。

这是一个更好的选项,允许你过滤掉特定警告,而不是所有警告。

[pytest]
filterwarnings = ignore::DeprecationWarning

这个设置将在你的测试模块中忽略任何 DeprecationWarnings

下面的配置将忽略所有用户警告和特定弃用警告匹配正则表达式,但将所有其他警告转换为错误。

[pytest]
filterwarnings = 
    error  
    ignore::UserWarning  
    ignore:function ham():DeprecationWarning

三、抑制或过滤(特定)库警告

一种更清洁的方法是忽略引发警告的库的特定警告,这可以通过

[pytest]
filterwarnings = 
    ignore::DeprecationWarning:module_name.*

例如

[pytest]
filterwarnings = 
    ignore::DeprecationWarning:botocore.*:  
    ignore::FutureWarning:pandas.*

这将抑制来自该库的所有警告。

正如我们在这个网站上经常做的那样,让我们编写一些示例代码来说明上述内容。

克隆仓库并设置你的虚拟环境。

examples/my_module.py
import warnings

def old_function():
    warnings.warn(
        "old_function() is deprecated; use new_function() instead.",
        DeprecationWarning,
        stacklevel=2,
    )

def new_function():
    print("This is the new function.")

old_function()

运行这个我们会得到警告。

$ python examples/my_module.py

让我们写一个测试。

tests/test_warnings.py
import warnings
from examples.my_module import old_function

def test_function():
    old_function()

运行测试

$ pytest

如你所见,Pytest抑制了 DeprecationWarning,但仍然显示了 SyntaxWarning

修改我们的 pytest.ini 文件

[pytest]
filterwarnings = 
    ignore::DeprecationWarning  
    ignore::SyntaxWarning

现在我们的输出是干净的。

你可以更多地尝试警告及其抑制。

四、使用标记过滤警告

Pyst还提供使用标记向特定测试和测试模块添加警告过滤器的选项,这提供了更大的控制权。

import warnings
import pytest

def api_v1():
    warnings.warn("api v1, should use functions from v2", UserWarning)
    return 1

@pytest.mark.filterwarnings("ignore:api v1")
def test_one():
    assert api_v1() == 1

五、确保代码触发弃用警告

现在,如果你处于生成器端,即你想测试你的代码是否触发了 DeprecationWarning,你也可以使用 Pytest 来测试它。

你可以使用 pytest.deprecated_call() 方法。

def test_myfunction_deprecated():
    with pytest.deprecated_call():
        old_function()

如果 old_function 没有发出弃用警告,这个测试将失败。

posted @ 2024-05-28 14:51  xyztank  阅读(105)  评论(0编辑  收藏  举报