Три категории

Каждая функция нуждается в тест-кейсах трёх категорий: позитивные тесты, подтверждающие работу happy path, негативные тесты, проверяющие обработку ошибок, и граничные тесты, проверяющие крайние значения. Пропуск любой категории оставляет опасные пробелы.

Позитивные тест-кейсы

Позитивные тест-кейсы проверяют, что система работает корректно с валидным вводом при ожидаемых условиях. Они представляют пути, по которым пойдёт большинство пользователей.

Характеристики:

  • Используют валидные, ожидаемые значения ввода
  • Следуют предусмотренному рабочему процессу
  • Проверяют успешные результаты
  • Отвечают: «Работает ли функция как задумано?»

Пример — Форма входа:

Позитивный TC-1: Пользователь входит с валидным email и паролем
Позитивный TC-2: Пользователь входит с валидным username и паролем
Позитивный TC-3: Пользователь входит и "Запомнить меня" сохраняет сессию на 30 дней

Пример — Корзина покупок:

Позитивный TC-1: Добавить один товар в пустую корзину
Позитивный TC-2: Добавить несколько единиц одного товара
Позитивный TC-3: Обновить количество с 1 до 5
Позитивный TC-4: Применить валидный код купона и проверить скидку

Негативные тест-кейсы

Негативные тест-кейсы проверяют, что система обрабатывает невалидный ввод корректно — показывая правильные сообщения об ошибках, не падая и не раскрывая конфиденциальные данные.

Характеристики:

  • Используют невалидный, неожиданный или вредоносный ввод
  • Тестируют обработку ошибок и валидацию
  • Проверяют соответствующие сообщения об ошибках
  • Отвечают: «Отказывает ли функция безопасно?»

Пример — Форма входа:

Негативный TC-1: Вход с неправильным паролем — сообщение об ошибке
Негативный TC-2: Вход с несуществующим email — общая ошибка (без утечки информации)
Негативный TC-3: Вход с пустыми полями — ошибка валидации
Негативный TC-4: Вход с SQL-инъекцией в поле email — ввод санитизирован
Негативный TC-5: Отправка формы с XSS-нагрузкой в email — ввод экранирован

Граничные тест-кейсы

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

Правило граничных значений: Для диапазона [min, max] проверяйте:

  • Одно значение ниже минимума (min - 1)
  • Минимальное значение (min)
  • Одно значение выше минимума (min + 1)
  • Одно значение ниже максимума (max - 1)
  • Максимальное значение (max)
  • Одно значение выше максимума (max + 1)

Пример — Поле возраста (принимает 18-65):

ЗначениеКатегорияОжидаемый результат
17Ниже границыОтклонено: «Минимум 18 лет»
18Нижняя границаПринято
19Чуть выше нижнейПринято
64Чуть ниже верхнейПринято
65Верхняя границаПринято
66Выше границыОтклонено: «Максимум 65 лет»

Пример — Поле пароля (8-64 символа):

ЗначениеКатегорияОжидаемый результат
7 символовНиже минимумаОтклонено: «Минимум 8 символов»
8 символовГраница минимумаПринято
9 символовЧуть выше минимумаПринято
63 символаЧуть ниже максимумаПринято
64 символаГраница максимумаПринято
65 символовВыше максимумаОтклонено: «Максимум 64 символа»

Распространённые типы границ

Длина строки

Тестируйте пустую строку, 1 символ, минимальную длину, максимальную длину, максимум + 1.

Числовые диапазоны

Тестируйте минимум - 1, минимум, максимум, максимум + 1, ноль, отрицательные числа.

Поля дат

Тестируйте вчера vs сегодня (для будущих дат), конец месяца, високосный год (29 февраля).

Коллекции/Списки

Тестируйте пустой список, один элемент, максимум элементов, максимум + 1.

Загрузка файлов

Тестируйте пустой файл, минимальный размер, максимальный размер, максимум + 1 байт.

Проектирование полного покрытия

Для любой функции используйте систематический подход:

  1. Определите все поля ввода и их допустимые диапазоны
  2. Напишите позитивные кейсы для самых частых валидных сценариев
  3. Напишите граничные кейсы для min и max каждого ввода
  4. Напишите негативные кейсы для каждого типа невалидного ввода
  5. Добавьте специальные кейсы для null, пустых, спецсимволов, Unicode

Упражнение: Спроектируйте полный набор тестов

Спроектируйте позитивные, негативные и граничные тест-кейсы для формы регистрации:

  • Username: 3-20 буквенно-цифровых символов, должен быть уникальным
  • Email: Валидный формат email, должен быть уникальным
  • Пароль: 8-128 символов, должен содержать заглавную, строчную, цифру, спецсимвол
  • Возраст: 13-120, только целые числа
  • Био профиля: Необязательно, макс. 500 символов

Напишите минимум 5 позитивных, 8 негативных и 6 граничных.

Решение

Позитивные тест-кейсы:

  1. Регистрация с валидным username (8 символов), валидный email, надёжный пароль, возраст 25, без био
  2. Регистрация с минимальным username (3 символа), валидный email, пароль со всеми типами символов, возраст 30, био 100 символов
  3. Регистрация с максимальным username (20 символов), валидный email, длинный пароль (50 символов), возраст 45, полное био 500 символов
  4. Регистрация с буквенно-цифровым username с цифрами, адрес Gmail, пароль со спецсимволами (!@#), возраст 18, пустое био
  5. Регистрация с валидными данными и проверка получения подтверждающего email

Негативные тест-кейсы:

  1. Регистрация с занятым username — ошибка: «Username already exists»
  2. Регистрация с уже зарегистрированным email — ошибка: «Email already registered»
  3. Регистрация с невалидным форматом email (без @) — ошибка валидации
  4. Регистрация с паролем без заглавной буквы — ошибка: «Must contain uppercase letter»
  5. Регистрация с паролем без цифры — ошибка: «Must contain a digit»
  6. Регистрация с паролем без спецсимвола — ошибка с указанием требования
  7. Регистрация с нецелым возрастом (25.5) — ошибка валидации
  8. Регистрация с пустыми обязательными полями — каждое показывает «This field is required»

Граничные тест-кейсы:

  1. Username 2 символа (ниже min) — отклонено
  2. Username 3 символа (минимум) — принято
  3. Username 20 символов (максимум) — принято
  4. Username 21 символ (выше max) — отклонено
  5. Возраст 12 (ниже минимума) — отклонено: «Минимум 13 лет»
  6. Возраст 13 (минимум) — принято
  7. Возраст 120 (максимум) — принято
  8. Возраст 121 (выше максимума) — отклонено
  9. Пароль 7 символов — отклонено
  10. Пароль 8 символов (все требования соблюдены) — принято
  11. Био 500 символов — принято
  12. Био 501 символ — отклонено или обрезано

Советы профессионалов

Совет 1: Правило 80/20 работает — 80% багов находят на границах и в негативных сценариях, а не в happy path.

Совет 2: Для каждого позитивного тест-кейса спросите «Что может пойти не так?» для генерации негативных.

Совет 3: Рассмотрите комбинации — что происходит, когда два граничных значения введены одновременно?

Совет 4: Не забывайте null и пустые значения — это самые упускаемые граничные случаи и источник NullPointerException в продакшене.

Ключевые выводы

  • Три категории: позитивные (валидный ввод, happy path), негативные (невалидный ввод, обработка ошибок), граничные (предельные значения)
  • Граничное тестирование проверяет min, max и один шаг за каждым краем
  • Большинство багов живут на границах — инвестируйте туда время тестирования
  • Для каждого поля: ниже min, min, min+1, max-1, max, выше max
  • Негативное тестирование защищает от падений, утечки данных и плохого UX
  • Комбинируйте категории для полного покрытия каждой функции