Сколько ожидаемых результатов должно быть в одном тест-кейсе?

Ответ

Один тест-кейс должен проверять один конкретный ожидаемый результат (Assertion). Это фундаментальный принцип модульного и атомарного тестирования.

Почему это важно:

  • Локализация дефектов: Если тест падает, сразу понятно, какая именно функциональность сломана.
  • Читаемость: Название теста (testLogin_WithValidCredentials_ReturnsTrue) четко описывает его цель.
  • Поддержка: Легко обновлять и рефакторить небольшие, сфокусированные тесты.

Правильный пример (Python/pytest):

def test_login_with_valid_credentials_returns_true():
    # Arrange
    auth_service = AuthService()

    # Act
    result = auth_service.login(username="valid_user", password="correct_pass")

    # Assert - ОДНА проверка
    assert result is True

Неправильный пример (проверка нескольких несвязанных вещей):

def test_login():
    result = login(...)
    assert result is True  # Проверка успешного входа
    assert current_user.name == "valid_user"  # НЕОТНОСЯЩАЯСЯ проверка - это должен быть отдельный тест!
    assert session.is_active()  # Еще одна несвязанная проверка

Если нужно проверить несколько аспектов одного сценария, разбейте его на несколько независимых тест-кейсов.

Ответ 18+ 🔞

А, слушай, вот этот принцип тестирования — один тест, одна проверка. Это ж как в армии, блядь: один солдат — одна винтовка, а не чтобы он сразу и стрелял, и в окопе копал, и кашу варил, ёпта!

Зачем это, спросишь? Да чтобы, если всё накрылось медным тазом, сразу было понятно, где именно пиздец случился. Представь: у тебя тест упал, а там тридцать три проверки в одной куче. И что, блядь? Где искать? В рот меня чих-пых! А так — упал один мелкий тестик, и ты сразу знаешь: «Ага, сука, вот эта конкретная хуйня не работает».

Смотри, как правильно, на примере:

def test_login_with_valid_credentials_returns_true():
    # Подготовка (Arrange) — расставляем фигурки
    auth_service = AuthService()

    # Действие (Act) — нажимаем на кнопку
    result = auth_service.login(username="valid_user", password="correct_pass")

    # Проверка (Assert) — ОДНА, блядь, единственная!
    assert result is True

Всё, чисто, ясно. Тест называется «проверить, что с валидными данными возвращает True». Упал? Значит, логин с валидными данными не работает. Элементарно, Ватсон!

А вот как НЕ НАДО, ёпта:

def test_login():
    result = login(...)
    assert result is True  # Проверяем вход
    assert current_user.name == "valid_user"  # А это уже, блядь, другая операция — загрузка пользователя!
    assert session.is_active()  # И это вообще третья, ёперный театр!

Это ж какой-то винегрет, а не тест! Он упадёт — и ты будешь как тот Герасим из рассказа: «Мууу? Ууу?», нихуя не понимая, что именно сломалось. То ли логин, то ли сессия, то ли ещё какая хитрая жопа.

Вывод простой, как три копейки: Если тебе нужно проверить кучу всего в одном сценарии — раздроби эту хуйню на кучу маленьких, независимых тестов. Один — проверил логин. Второй — проверил, что имя пользователя подгрузилось. Третий — что сессия активна. И тогда у тебя будет порядок, а не бардак, доверия ебать ноль.