Lesson 25 of 26

Урок 25 — Test Case: как писать хорошие тест-кейсы

Название: Test Case — основа тестирования
Описание: Разбираем структуру тест-кейса, компоненты, виды, как правильно писать тест-кейсы на разных уровнях — от Junior до Middle. Примеры для ручного и автоматизированного тестирования.
Почему это важно для QA: Тест-кейс — это главный артефакт тестировщика. Плохо написанный тест-кейс теряет баги и занимает время. Хороший — воспроизводим, понятен любому, экономит часы.


1. Что такое Test Case

Test Case (тест-кейс) — это набор условий, шагов и ожидаемых результатов, по которым можно проверить конкретную функциональность системы.

Аналогия

Рецепт приготовления блюда:

  • Условия = ингредиенты и инвентарь
  • Шаги = последовательность действий
  • Ожидаемый результат = как должно выглядеть готовое блюдо

Если рецепт написан чётко — любой повар приготовит одинаковый результат. Так же и с тест-кейсом: любой QA-инженер должен получить одинаковый результат при его выполнении.


2. Структура тест-кейса

Обязательные поля

ПолеОписаниеПример
IDУникальный идентификаторTC-001, AUTH-005
НазваниеКраткое описание что тестируется«Вход с корректными данными»
ПредусловияЧто должно быть сделано до началаПользователь зарегистрирован
ШагиПоследовательность действий1. Открыть /login...
Ожидаемый результатЧто должно произойтиРедирект на /dashboard
ПриоритетКритичностьHigh / Medium / Low
СтатусРезультат выполненияPass / Fail / Blocked / Skip

Дополнительные поля

ПолеОписание
Тестовые данныеКонкретные значения для теста
ОкружениеБраузер, ОС, версия
АвторКто написал тест-кейс
ДатаКогда создан / обновлён
Связанные требованияREQ-42, USER-STORY-15
Фактический результатЧто реально произошло (заполняется при Fail)

3. Пример тест-кейса (ручное тестирование)

Хороший тест-кейс: авторизация

ID:              TC-AUTH-001
Название:        Успешный вход с корректными учётными данными
Модуль:          Авторизация
Приоритет:       High
Тип:             Functional, Positive

Предусловия:
  1. Пользователь зарегистрирован в системе (email: testuser@test.com)
  2. Открыт браузер Chrome последней версии
  3. Пользователь не авторизован (нет активной сессии)

Тестовые данные:
  Email:    testuser@test.com
  Пароль:  TestPass123!

Шаги:
  1. Открыть https://staging.shop.com/login
  2. В поле "Email" ввести: testuser@test.com
  3. В поле "Пароль" ввести: TestPass123!
  4. Нажать кнопку "Войти"

Ожидаемый результат:
  - URL изменяется на https://staging.shop.com/dashboard
  - На странице отображается приветствие: "Добро пожаловать, Test User"
  - В шапке сайта отображается аватар/имя пользователя
  - В DevTools: Cookie с именем "sessionId" создан с флагом HttpOnly

Статус: [ ] Pass  [ ] Fail  [ ] Blocked  [ ] Skip
Фактический результат: (заполняется при Fail)
Примечания:

4. Пример тест-кейса: негативный сценарий

ID:              TC-AUTH-003
Название:        Блокировка после 5 неудачных попыток входа
Модуль:          Авторизация
Приоритет:       High
Тип:             Functional, Negative, Security

Предусловия:
  1. Пользователь testuser@test.com существует
  2. Аккаунт не заблокирован

Тестовые данные:
  Email:    testuser@test.com
  Пароль:  WrongPass123 (намеренно неверный)

Шаги:
  1. Открыть /login
  2. Ввести email: testuser@test.com, пароль: WrongPass123
  3. Нажать "Войти" → зафиксировать сообщение об ошибке
  4. Повторить шаги 2–3 ещё 4 раза (итого 5 попыток)
  5. На 5-й попытке зафиксировать сообщение

Ожидаемый результат:
  После 5-й неудачной попытки:
  - Отображается сообщение: "Аккаунт заблокирован на 15 минут. Попробуйте позже."
  - Кнопка "Войти" становится неактивной (disabled)
  - Попытка войти с правильным паролем → тоже блокировка (аккаунт заблокирован)
  - Через 15 минут — аккаунт разблокируется автоматически

Статус: [ ] Pass  [ ] Fail  [ ] Blocked  [ ] Skip

5. Виды тест-кейсов

По ожидаемому результату

ВидОписаниеПример
ПозитивныйКорректные данные, happy pathВход с правильным паролем
НегативныйНекорректные данные, edge casesВход с неверным паролем
ГраничныйГраничные значения (BVA)Пароль ровно 8 символов

По уровню детализации

УровеньОписаниеКогда использовать
High-levelОбщее описание без деталейРанние стадии проекта
Low-levelДетальные шаги с конкретными даннымиРегрессия, документация

6. Ошибки при написании тест-кейсов

❌ Плохой тест-кейс

ID: TC-001
Название: Проверить форму входа
Шаги:
  1. Войти в систему

Ожидаемый результат:
  Всё работает

Проблемы:

  • «Войти в систему» — что именно делать? Какие данные?
  • «Всё работает» — как понять, что работает?
  • Нет предусловий
  • Нет тестовых данных
  • Непонятно, что считать успехом

✅ Хороший тест-кейс

ID: TC-AUTH-001
Название: Успешный вход с корректными email и паролем
Предусловия: Пользователь user@test.com зарегистрирован, не авторизован
Тестовые данные: email = user@test.com, password = ValidPass123
Шаги:
  1. Перейти на /login
  2. Ввести в поле Email: user@test.com
  3. Ввести в поле Пароль: ValidPass123
  4. Нажать кнопку "Войти"
Ожидаемый результат:
  - URL: /dashboard
  - Отображается "Добро пожаловать, Test User"
  - Cookie sessionId создан

7. Правила написания хороших тест-кейсов

7.1 Одна проверка = один тест-кейс

❌ Плохо: TC-001 "Проверить авторизацию" — 20 шагов, проверяет вход, выход, смену пароля
✅ Хорошо: TC-001 "Вход с правильным паролем"
           TC-002 "Выход из аккаунта"
           TC-003 "Смена пароля"

7.2 Конкретные значения, не обобщения

❌ «Ввести корректный email»
✅ «Ввести email: testuser@example.com»

❌ «Нажать кнопку»
✅ «Нажать кнопку "Оформить заказ" (синяя кнопка в правом нижнем углу страницы)»

7.3 Конкретный ожидаемый результат

❌ «Вход выполнен успешно»
✅ «URL меняется на /dashboard, отображается "Добро пожаловать, Иван"»

❌ «Появляется ошибка»
✅ «Появляется сообщение: "Неверный логин или пароль" красным цветом под кнопкой»

7.4 Независимость тест-кейсов

❌ Плохо: TC-002 зависит от TC-001 (работает только если TC-001 прошёл)
✅ Хорошо: каждый тест-кейс начинается с чистого состояния

8. Test Case vs Test Scenario vs Test Suite

TEST SUITE (набор тестов)
└── TEST SCENARIO (сценарий) — «Авторизация пользователя»
    ├── TEST CASE (тест-кейс) — «Вход с корректными данными»
    ├── TEST CASE — «Вход с неверным паролем»
    ├── TEST CASE — «Вход с пустым email»
    └── TEST CASE — «Блокировка после 5 неудачных попыток»
ТерминЧто это
Test SuiteНабор тест-кейсов для модуля / функции
Test ScenarioПользовательский сценарий (high-level)
Test CaseДетальные шаги проверки одного аспекта
Test StepОдин шаг внутри тест-кейса

9. Test Case в автоматизации (Playwright)

Каждый тест-кейс становится одним test() блоком:

typescripttypescript
import { test, expect } from "@playwright/test";
import { LoginPage } from "../pages/LoginPage";

// TC-AUTH-001: Успешный вход
test("TC-AUTH-001: вход с корректными учётными данными", async ({ page }) => {
  // Предусловие: пользователь не авторизован (свежий браузер)
  const loginPage = new LoginPage(page);

  // Шаги
  await test.step("открыть страницу входа", async () => {
    await loginPage.goto();
  });

  await test.step("ввести корректные данные и нажать войти", async () => {
    await loginPage.login("testuser@test.com", "TestPass123!");
  });

  // Ожидаемый результат
  await test.step("убедиться в успешном входе", async () => {
    await expect(page, "URL должен измениться на /dashboard").toHaveURL("/dashboard");
    await expect(
      page.getByText("Добро пожаловать"),
      "Должно отображаться приветствие"
    ).toBeVisible();
  });
});

// TC-AUTH-003: Блокировка после 5 неудачных попыток
test("TC-AUTH-003: блокировка после 5 неудачных попыток", async ({ page }) => {
  const loginPage = new LoginPage(page);
  await loginPage.goto();

  // Шаги: 5 неудачных попыток
  for (let attempt = 1; attempt <= 5; attempt++) {
    await test.step(`неудачная попытка ${attempt}`, async () => {
      await loginPage.login("testuser@test.com", "WrongPass123");
    });
  }

  // Ожидаемый результат после 5-й попытки
  await expect(
    loginPage.lockoutMessage,
    "Должно появиться сообщение о блокировке"
  ).toContainText("Аккаунт заблокирован");
  await expect(
    loginPage.submitButton,
    "Кнопка входа должна быть неактивна"
  ).toBeDisabled();
});

10. Приоритизация тест-кейсов

ПриоритетКогда выполнятьПримеры
CriticalВсегда, в первую очередьАвторизация, оплата
HighSmoke + RegressionОсновные бизнес-функции
MediumFull RegressionДополнительные сценарии
LowЕсли есть времяКосметические, редкие случаи

Итог

TEST CASE — это:
├── ID (уникальный идентификатор)
├── Название (что тестируем)
├── Предусловия (что должно быть готово)
├── Тестовые данные (конкретные значения)
├── Шаги (конкретная последовательность)
└── Ожидаемый результат (измеримый, конкретный)

Правила хорошего тест-кейса:
✓ Один тест — одна проверка
✓ Конкретные данные, не обобщения
✓ Измеримый ожидаемый результат
✓ Независим от других тестов
✓ Понятен любому члену команды