如何在 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
没有发出弃用警告,这个测试将失败。