Сообщить об ошибке.

Тестирование предупреждений warnings

Чтобы проверить предупреждения, выданные кодом, используйте менеджер контекста 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() одновременно, то поведение не определено.

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