Как ответить
Короткий ответ: можно, но обычно не стоит. В модульном тестировании лучшая практика — один тест на одну логическую проверку. Если совмещать два разных кейса, при падении теста придётся разбираться, какая именно проверка не прошла, а сам тест становится перегруженным.
Рассмотрим пример. Допустим, мы тестируем функцию деления:
def divide(a, b):
if b == 0:
raise ValueError("division by zero")
return a / bПлохой вариант — всё в одном тесте:
def test_divide():
assert divide(10, 2) == 5 # позитивный кейс
with pytest.raises(ValueError):
divide(10, 0) # негативный кейсЗдесь два разных сценария: успешное деление и ошибка. Если упадёт первый assert, второй вообще не выполнится, и мы не узнаем, что негативный кейс тоже может быть сломан. Если первый пройдёт, а второй упадёт — сообщение об ошибке будет неинформативным.
Лучше разбить на два отдельных теста:
def test_divide_positive():
assert divide(10, 2) == 5
def test_divide_by_zero():
with pytest.raises(ValueError):
divide(10, 0)Так мы сразу видим, какой именно аспект сломан. Это соответствует правилу AAA (Arrange-Act-Assert): один Act — одна проверка.
Однако есть исключения. Если два кейса логически являются одним поведением (например, возвращаемое значение и побочный эффект), их можно совместить, но это редкий случай. Для juniors безопаснее придерживаться принципа изоляции.
Когда нужно проверить много похожих входных данных, вместо копирования кода лучше использовать параметризацию (в pytest — декоратор @pytest.mark.parametrize). Это позволяет держать один тест, но проверять разные значения, не смешивая разные типы кейсов (позитив/негатив).
Итог: проверять оба кейса в одном тесте технически возможно, но это ухудшает читаемость, усложняет диагностику и нарушает принципы хорошего тестирования. Разделяйте тесты по сценариям.