提问人:Tom Aldcroft 提问时间:2/4/2023 最后编辑:Tom Aldcroft 更新时间:11/13/2023 访问量:159
pytest 覆盖现有的警告过滤器
pytest overrides existing warning filters
问:
似乎忽略警告的使用是不被尊重的。例如:warnings.filterwarnings
pytest
$ cat test.py
import warnings
warnings.filterwarnings('ignore', category=UserWarning)
def test_warnings_filter():
warnings.warn("This is a warning", category=UserWarning)
当我运行它时,我希望我的显式忽略的警告将被忽略。相反,我得到这个:pytest
$ pytest test.py
=============================================================================== test session starts ===============================================================================
platform darwin -- Python 3.10.8, pytest-7.2.1, pluggy-1.0.0
rootdir: /Users/aldcroft/tmp/pytest
plugins: anyio-3.6.2
collected 1 item
test.py . [100%]
================================================================================ warnings summary =================================================================================
test.py::test_warnings_filter
/Users/aldcroft/tmp/pytest/test.py:7: UserWarning: This is a warning
warnings.warn("This is a warning", category=UserWarning)
-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
========================================================================== 1 passed, 1 warning in 0.01s ===========================================================================
我知道配置文件和标志和,但这些效果不佳
对于我的用例,通过集成测试大量已安装的软件包,其中有
至少有十几个第三方警告,需要忽略这些警告才能获得干净的输出。pytest.ini
-W
@pytest.mark.filterwarnings
<pkg_name>.test()
关于如何做到这一点的任何想法?
答:
您可以使用 @pytest.mark.filterwarnings 注释来忽略来自特定测试函数或整个测试类的警告。
import warnings
import pytest
@pytest.mark.filterwarnings("ignore:warning")
def test_warnings_filter():
warnings.warn("This is a warning", category=UserWarning)
https://docs.pytest.org/en/7.1.x/how-to/capture-warnings.html#pytest-mark-filterwarnings
评论
pytest
warnings.simplefilter()
pytest.ini
-W
-W
“为什么pytest忽略现有的过滤器”
这可能是由于 pytest 的内置插件用于捕获警告:
从版本 3.1 开始,pytest 现在可以在测试执行期间自动捕获警告,并在会话结束时显示它们
如何在运行 pytest 时忽略第三方警告
将 python 中的 in-python 视为应用程序警告配置,pytest 将“忽略”该配置,以便可以独立进行测试警告配置,并牢记测试隔离。warnings.filterwarnings()
你提到过,但pytest也有一个顶级配置,例如在我的:@pytest.mark.filterwarnings
filterwarnings
pyproject.toml
[tool.pytest.ini_options]
filterwarnings = [
"ignore:::flask_appbuilder",
"ignore:::flask_sqlalchemy",
"ignore:::marshmallow_sqlalchemy",
"ignore:::pydantic",
]
我忽略了来自这些第三方模块的所有警告。警告过滤器规范和机制来自 Python 核心:https://docs.python.org/3/library/warnings.html#describing-warning-filters
您可能不想要的其他选项
pytest --disable-warnings
-- 禁用所有警告,甚至从您的代码中
pytest -p no:warnings
-- 完全禁用 pytest 的警告插件,使你的测试警告配置与你的应用程序警告配置相同。如果您只想静音第三方警告,并且永远不会发出自己的警告,这可能没问题。但是,如果您正在编写库并希望警告用户(因为您需要测试该行为),则可能需要使用警告插件。
评论