При параметризации тестов, которые вызывают ожидаемое исключение, я использовал следующую форму:
import pytest
class SomeException(Exception):
pass
class AnotherException(Exception):
pass
@pytest.mark.parametrize(
'error',
[None,
pytest.mark.raises(SomeException('the message'),
exception=SomeException),
pytest.mark.raises(AnotherException('the message'),
exception=AnotherException),
pytest.mark.raises(Exception('the message'),
exception=Exception),
])
def test_mark_raises(error):
if error:
raise error
Обратите внимание, что я установил пакет pytest-raises.Хорошо, это работает, но я недавно заметил, что это вызывает предупреждение об устаревании:
RemovedInPytest4Warning: Applying marks directly to parameters is deprecated, please use pytest.param(..., marks=...) instead.
Хорошо, все в порядке.Мы обновим список параметров.Но это было проблематично.У pytest.param есть аргумент «marks =», но передача в pytest.mark.raises не работает.Единственный способ, которым я нашел использование обработки исключений в pytest.param (который на самом деле, кажется, работает вообще), заключается в следующем:
import pytest
class SomeException(Exception):
pass
class AnotherException(Exception):
pass
@pytest.mark.parametrize(
'error',
[None,
pytest.param(SomeException('the message'),
marks=pytest.mark.xfail(exception=SomeException)),
pytest.param(AnotherException('the message'),
marks=pytest.mark.xfail(exception=AnotherException)),
pytest.param(Exception('the message'),
marks=pytest.mark.xfail(exception=Exception)),
])
def test_mark_raises(error):
if error:
raise error
Хорошо, так что, похоже, это работает, вроде.Но вместо того, чтобы проходить тесты, это не помогает им.
Мне это не нравится.Если я ожидаю, что тест вызовет конкретное исключение, а оно действительно вызывает исключение, то я считаю, что тест пройден, а не 'xfailed'.
И если я проверяю группу pytestрезультаты (1500+ в некоторых случаях), визуально больше работы для определения того, какие тесты xfailing, потому что они ожидают какого-то условия отказа, а какие xfailing, потому что они еще не реализованы (или по какой-то другой причине, которая указывает на то, что нам нужночто-то исправить).
Мне не нравится получать кучу предупреждений, но я также хочу тесты, которые правильно показывают, что они прошли.Есть ли кто-нибудь, кто знает правильную конструкцию для использования с pytest.param в случае ожидаемого исключительного поведения?