Чтобы проверить предупреждения, выданные кодом, используйте менеджер контекста warnings.catch_warnings()
. С его помощью вы можете временно отключить фильтр предупреждений, чтобы облегчить тестирование.
Например, выполните следующие действия, чтобы зафиксировать все выданные предупреждения для проверки:
import warnings def fxn(): warnings.warn("deprecated", DeprecationWarning) with warnings.catch_warnings(record=True) as w: # Все предупреждения всегда должны срабатывать. warnings.simplefilter("always") # Вызвать предупреждение. fxn() # Проверить некоторые вещи assert len(w) == 1 assert issubclass(w[-1].category, DeprecationWarning) assert "deprecated" in str(w[-1].message)
Можно также сделать все предупреждения исключениями, используя error
вместо always
. Следует помнить одну вещь: если предупреждение уже было выдано из-за правила, установленного один раз по умолчанию, то независимо от того, какие фильтры установлены, предупреждение больше не будет отображаться, пока не будет очищен реестр предупреждений, связанный с этим предупреждением.
После завершения работы диспетчера контекста фильтр предупреждений восстанавливается до своего состояния при вводе контекста. Это препятствует тому, чтобы тесты неожиданно изменяли фильтр предупреждений между тестами и приводили к неопределенным результатам тестов. Функция warnings.showwarning()
в модуле также восстанавливается до своего первоначального значения.
Примечание: это может быть гарантировано только в однопоточном приложении. Если два или более потоков используют менеджер контекста warnings.catch_warnings()
одновременно, то поведение не определено.
При тестировании нескольких операций, которые выдают один и тот же вид предупреждения, то важно проверить, что каждая операция вызывает новое предупреждение. Например установите предупреждения, которые должны быть вызваны как исключения и проверьте, что операции вызывают исключения, так же проверьте, что длина списка предупреждений продолжает увеличиваться после каждой операции.