Есть два способа обрабатывать исключения в pytest
:
- Использование
pytest.raises
для написания утверждений о возбужденных исключениях
- Использование
@pytest.mark.xfail
1. Использование pytest.raises
Из документов:
Чтобы писать утверждения о возбужденных исключениях, вы можете использовать pytest.raises
в качестве диспетчера контекста.
Примеры:
Заявление об исключении:
import pytest
def test_zero_division():
with pytest.raises(ZeroDivisionError):
1 / 0
with pytest.raises(ZeroDivisionError)
говорит, что все, что находится в следующем блоке кода, должно вызывать ZeroDivisionError
исключение. Если исключение не возникает, тест не проходит. Если тест вызывает другое исключение, он не выполняется.
Если вам нужен доступ к актуальной информации об исключении:
import pytest
def f():
f()
def test_recursion_depth():
with pytest.raises(RuntimeError) as excinfo:
f()
assert "maximum recursion" in str(excinfo.value)
excinfo
- это экземпляр ExceptionInfo
, который является оболочкой вокруг фактического возникшего исключения. Основными интересующими атрибутами являются .type
, .value
и .traceback
.
2. Использование @pytest.mark.xfail
Также можно указать raises
аргумент для pytest.mark.xfail
.
import pytest
@pytest.mark.xfail(raises=IndexError)
def test_f():
l = [1, 2, 3]
l[10]
@pytest.mark.xfail(raises=IndexError)
говорит, что все, что находится в следующем блоке кода, должно вызывать IndexError
исключение. Если поднят IndexError
, тест помечается как xfailed (x)
. Если исключение не возникает, тест помечается как xpassed (X)
. Если тест вызывает другое исключение, он не выполняется.
Примечания:
Использование pytest.raises
, вероятно, будет лучше для случаев, когда вы тестируете исключения, которые сознательно создает ваш собственный код, тогда как использование @pytest.mark.xfail
с функцией проверки, вероятно, лучше для чего-то вроде документирования нефиксированных ошибок или ошибок в зависимостях.
Вы можете передать параметр ключевого слова match
диспетчеру контекста (pytest.raises
), чтобы проверить соответствие регулярного выражения строковому представлению исключения. (подробнее)
person
lmiguelvargasf
schedule
08.07.2020