Три категории
Каждая функция нуждается в тест-кейсах трёх категорий: позитивные тесты, подтверждающие работу 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 байт.
Проектирование полного покрытия
Для любой функции используйте систематический подход:
- Определите все поля ввода и их допустимые диапазоны
- Напишите позитивные кейсы для самых частых валидных сценариев
- Напишите граничные кейсы для min и max каждого ввода
- Напишите негативные кейсы для каждого типа невалидного ввода
- Добавьте специальные кейсы для null, пустых, спецсимволов, Unicode
Упражнение: Спроектируйте полный набор тестов
Спроектируйте позитивные, негативные и граничные тест-кейсы для формы регистрации:
- Username: 3-20 буквенно-цифровых символов, должен быть уникальным
- Email: Валидный формат email, должен быть уникальным
- Пароль: 8-128 символов, должен содержать заглавную, строчную, цифру, спецсимвол
- Возраст: 13-120, только целые числа
- Био профиля: Необязательно, макс. 500 символов
Напишите минимум 5 позитивных, 8 негативных и 6 граничных.
Решение
Позитивные тест-кейсы:
- Регистрация с валидным username (8 символов), валидный email, надёжный пароль, возраст 25, без био
- Регистрация с минимальным username (3 символа), валидный email, пароль со всеми типами символов, возраст 30, био 100 символов
- Регистрация с максимальным username (20 символов), валидный email, длинный пароль (50 символов), возраст 45, полное био 500 символов
- Регистрация с буквенно-цифровым username с цифрами, адрес Gmail, пароль со спецсимволами (!@#), возраст 18, пустое био
- Регистрация с валидными данными и проверка получения подтверждающего email
Негативные тест-кейсы:
- Регистрация с занятым username — ошибка: «Username already exists»
- Регистрация с уже зарегистрированным email — ошибка: «Email already registered»
- Регистрация с невалидным форматом email (без @) — ошибка валидации
- Регистрация с паролем без заглавной буквы — ошибка: «Must contain uppercase letter»
- Регистрация с паролем без цифры — ошибка: «Must contain a digit»
- Регистрация с паролем без спецсимвола — ошибка с указанием требования
- Регистрация с нецелым возрастом (25.5) — ошибка валидации
- Регистрация с пустыми обязательными полями — каждое показывает «This field is required»
Граничные тест-кейсы:
- Username 2 символа (ниже min) — отклонено
- Username 3 символа (минимум) — принято
- Username 20 символов (максимум) — принято
- Username 21 символ (выше max) — отклонено
- Возраст 12 (ниже минимума) — отклонено: «Минимум 13 лет»
- Возраст 13 (минимум) — принято
- Возраст 120 (максимум) — принято
- Возраст 121 (выше максимума) — отклонено
- Пароль 7 символов — отклонено
- Пароль 8 символов (все требования соблюдены) — принято
- Био 500 символов — принято
- Био 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
- Комбинируйте категории для полного покрытия каждой функции