pytest.warns
и pytest.raises
являются обычными менеджерами контекста и могут быть объявлены в одном операторе with
, если они разделены запятой (см. составные операторы ):
with pytest.warns(UserWarning), pytest.raises(SystemExit):
compare_tags(...)
, что фактически совпадает с написанием
with pytest.warns(UserWarning):
with pytest.raises(SystemExit):
compare_tags(...)
Обратите внимание, что порядок имеет значение - когда вы устанавливаете оба диспетчера контекста в обратном порядке:
with pytest.raises(SystemExit), pytest.warns(UserWarning):
...
это то же самое, что и запись
with pytest.raises(SystemExit):
with pytest.warns(UserWarning):
...
Проблема здесь в том, что pytest.raises
перехватывает все возникшие ошибки и затем проверяет, что было зафиксировано.Это включает в себя то, что поднимает pytest.warns
.Это означает, что
with pytest.raises(SystemExit), pytest.warns(UserWarning):
sys.exit(0)
пройдет, потому что ошибка, возникшая в pytest.warns
, будет проглочена в pytest.raises
, тогда как
with pytest.warns(UserWarning), pytest.raises(SystemExit):
sys.exit(0)
завершится с ошибкой, как и ожидалось.