Как подавить внутренние предупреждения об устаревании py.test

98

Есть ли способ подавить внутренние предупреждения об устаревании pytest?

Контекст: я хочу оценить сложность переноса набора тестов с noseна pytest. Набор довольно большой и часто использует генераторы тестов на основе noseстиля yield.

Я хотел бы сначала убедиться, что существующие тесты проходят с помощью pytest, а затем, возможно, изменить генераторы тестов на parameterized.

Просто при запуске $ pytest path-to-test-folderс pytest 3.0.4 полностью преобладают страницы и страницы

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

Есть ли способ отключить эти предупреждения?

ev-br
источник

Ответы:

93

Откуда pytest --help:

--disable-pytest-warnings
                      disable warnings summary, overrides -r w flag
Компилятор
источник
4
Как сказано в тексте справки, при этом будет опущено только текстовое резюме. Результат по-прежнему будет желтым и указывать на наличие предупреждений.
Дэвид Парссон
Лучше поместить в файл pytest.ini, как показано ниже.
vy32
96

pytest -p no:warningsили добавьте в pytest.ini или tox.ini следующее:

[pytest]
addopts = -p no:warnings

Результат будет зеленым без каких-либо предупреждений. См. Документацию по адресу https://docs.pytest.org/en/latest/warnings.html#disables-warnings-summary .

Это может быть допустимым вариантом использования набора тестов, в котором вы хотите получить чистый вывод.

Помните, что постоянное скрытие всех предупреждений может привести к тому, что вы пропустите важные предупреждения. Если вы хотите скрыть только определенные предупреждения, посмотрите ответ Cloc .

Блез
источник
2
addopts = -p no:warningsДЕЙСТВИТЕЛЬНО ПЛОХАЯ идея, и решение CloC намного разумнее, но мне пришлось использовать вашу, когда ignore::InsecureRequestWarningне был распознан, так что вы тоже получите +1
Питер М. - означает Моника
Постоянное отключение всех предупреждений (например, использование pytest.ini) почти никогда не бывает хорошей идеей. Отключение только предупреждения об устаревании (и по модулю), как описывает CloC, является правильным способом сделать это.
Neowizard
74

Я думаю, вы хотите скрывать не все предупреждения, а только те, которые не имеют отношения к делу. И в этом случае предупреждения об удалении из импортированных модулей python.

Прочтите документацию pytest о Warnings Capture :

И параметр командной строки -W, и параметр filterwarnings ini основаны на собственном параметре Python -W и warnings.simplefilter , поэтому, пожалуйста, обратитесь к этим разделам документации Python для других примеров и расширенного использования.

Таким образом, вы можете фильтровать предупреждения с помощью -Wопции python !

Кажется, что pytestполностью удаляет фильтры, потому что он показывает все их DeprecationWarningпри запуске, а документация Python о фильтрах предупреждений по умолчанию четко говорит:

В сборках обычного выпуска фильтр предупреждений по умолчанию имеет следующие записи (в порядке приоритета):

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

Итак, в вашем случае, если вы хотите, скажем, отфильтровать типы предупреждений, которые вы хотите игнорировать, например, те DeprecationWarning, просто запустите команду pytest с -Wпараметром:

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

РЕДАКТИРОВАТЬ : из комментария colini можно фильтровать по модулю. Пример игнорирования предупреждений об устаревании от всей sqlalchemy:

ignore::DeprecationWarning:sqlalchemy.*:

Затем вы можете перечислить установленные модули, которые создают слишком много шума на выходе pytest

Используйте с файлом, а не в командной строке:

Вы можете указать эти фильтры в файле pytest.ini:

[pytest]
filterwarnings =
    ignore::DeprecationWarning
CloC
источник
11
Для фильтрации по модулю вы используете регулярное выражение. Пример игнорирования предупреждений об устаревании от всех модулей ignore::DeprecationWarning:sqlalchemy.*:
sqlalchemy
@colini, который не помог мне в качестве аргумента флага -W, но он работал у меня в моем файле pytest.ini.
WhiteHotLoveTiger
10

В файле pytest.ini вы можете добавить:

[pytest]
addopts = -p no:warnings

ИЛИ переходя под строку в командной строке. Это может быть полезно, если ваши тестовые наборы обрабатывают предупреждения с помощью внешней системы.

-p нет: предупреждения

ИЛИ, если вы хотите скрыть только какое-то конкретное устаревшее предупреждение, добавьте инструкцию ниже в файл pytest.ini

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

При этом игнорируются все предупреждения типа DeprecationWarning, где начало сообщения соответствует регулярному выражению «. * U. * mode is deprecated».

ИЛИ Хотя это не рекомендуется, вы можете использовать

--disable-warnings

параметр командной строки, чтобы полностью исключить сводку предупреждений из выходных данных тестового запуска.

pk786
источник
5

Я не хочу скрывать все предупреждения, поэтому вставил это pytest.ini

[pytest]
filterwarnings =
    ignore::DeprecationWarning
Polv
источник