ENIGMA AI
ENIGMA AI

Можно ли проверить оба кейса сразу?

встречается 1× junior testing

Как ответить

Короткий ответ: можно, но обычно не стоит. В модульном тестировании лучшая практика — один тест на одну логическую проверку. Если совмещать два разных кейса, при падении теста придётся разбираться, какая именно проверка не прошла, а сам тест становится перегруженным.

Рассмотрим пример. Допустим, мы тестируем функцию деления:

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

Итог: проверять оба кейса в одном тесте технически возможно, но это ухудшает читаемость, усложняет диагностику и нарушает принципы хорошего тестирования. Разделяйте тесты по сценариям.

Ключевые тезисы

  • Один тест — одна логическая проверка (один assert или одна группа assert'ов, относящихся к одному поведению).
  • Совмещение разных кейсов (позитив+негатив) маскирует причины падения — неясно, что именно сломалось.
  • Параметризация помогает избежать дублирования, когда нужно проверить много однотипных входных данных.
  • Правило AAA (Arrange-Act-Assert) подразумевает один Act на тест; если Act разный — тесты должны быть разными.
  • Исключение — только если кейсы неразрывно связаны (например, проверка одного вычисления и его побочного эффекта), но для juniors проще избегать этого.

Что спросят дальше

  • — Как вы бы параметризовали тест в вашем фреймворке? Покажите пример с несколькими наборами входных данных.
  • — Что если два кейса используют одну и ту же сложную подготовку данных? Как избежать дублирования кода, не смешивая проверки?
  • — Можно ли написать один тест, который проверяет и успех, и ошибку в одном assert (например, через assert statement)?

Готовьтесь к собеседованию с ENIGMA AI

AI-суфлёр подсказывает ответы прямо на собеседовании в реальном времени — незаметно для интервьюера.

Скачать приложение