Как работает @ pytest.mark.filterwarnings? - PullRequest
2 голосов
/ 31 октября 2019

Согласно документам вы можете игнорировать такие предупреждения:

@pytest.mark.filterwarnings("ignore:api v1")
def test_foo():

, что дает:

Но, похоже, нет никакой документации по этому вопросу. мини-язык ( это это даже мини-язык?)

Как выполняется сопоставление?

Я спрашиваю об этом, потому что следующий тест не игнорирует DeprecationWarning повышается при импорте boto3:

@pytest.mark.filterwarnings("ignore:DeprecationWarning")
def test_ignore_warnings():
    import boto3

Выходы Pytest:

============================================================================================================================== warnings summary ===============================================================================================================================
/home/rob/dev/time-series/.venv/lib/python3.7/site-packages/botocore/awsrequest.py:624
  /home/rob/dev/time-series/.venv/lib/python3.7/site-packages/botocore/awsrequest.py:624: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working
    class HeadersDict(collections.MutableMapping):

-- Docs: https://docs.pytest.org/en/latest/warnings.html
==================================================================================================================== 1 passed, 1 warnings in 0.36 seconds =====================================================================================================================

1 Ответ

0 голосов
/ 31 октября 2019

Фильтры работают так же, как и при использовании аргумента -W с командой python (см. python --help). Формат описан в документации модуля warnings. Короче говоря, это action:message:category:module:line, где action, вероятно, является обязательным, но другие части могут быть опущены.

"ignore:api v1" попытается сопоставить message, определив "строку, содержащую регулярное выражениечто начало предупреждающего сообщения должно соответствовать ". Поскольку вы действительно хотите соответствовать category, вы можете пропустить message. Это означает, что вы, похоже, просто пропустили одну двоеточие после ignore, поэтому это правильный формат:

@pytest.mark.filterwarnings("ignore::DeprecationWarning")
def test_ignore_warnings():
    import boto3

Однако, вы, вероятно, все равно получите предупреждение, если это произойдет во время импортапакет вне тестовой функции. В этом случае вам может потребоваться указать фильтр глобально в качестве аргумента pytest:

pytest -W "ignore::DeprecationWarning" ./tests/

... или добавить его в pytest.ini :

[pytest]
filterwarnings =
    ignore::DeprecationWarning

Если такое глобальное исключение нежелательно, вы можете попытаться ограничить его определенным модулем:

ignore::DeprecationWarning:boto3

Тестирование

Для тестированияВ целях, вы можете использовать следующий код:

import warnings

def something():
    warnings.warn("Test", DeprecationWarning)

@pytest.mark.filterwarnings("ignore::DeprecationWarning")
def test_ignore_warnings():
    something()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...