«Протестируй поле ввода возраста» это, пожалуй, самая частая практическая задача на собеседовании тестировщика. Её решают двумя техниками, которые почти всегда идут вместе: разбиение на классы эквивалентности и анализ граничных значений.
Классы эквивалентности
Класс эквивалентности это множество значений, которые система по требованиям должна обрабатывать одинаково. Если одно значение класса находит дефект, то его найдут и остальные, а если не находит, то остальные тоже не найдут. Поэтому из класса достаточно взять одно значение.
Пример: поле «Возраст», целые от 18 до 60.
| Класс | Валидный? | Представитель |
|---|---|---|
| меньше 18 | нет | 5 |
| от 18 до 60 | да | 35 |
| больше 60 | нет | 75 |
Невалидных классов два, а не один: «слишком мало» и «слишком много» часто обрабатываются разными ветками кода и дают разные сообщения.
Кроме диапазона, классы дают формат ввода:
- пустое значение;
- строка из пробелов;
- не число (
abc); - дробное число (
18,5), разные разделители (запятая и точка); - отрицательное число;
- ведущие нули, пробелы по краям;
- очень длинная строка.
Пустое значение забывают чаще всего, хотя у обязательного поля для него своя ветка и своё сообщение.
Граничные значения
Ошибки любят границы: > вместо >=, «до» вместо «до включительно», ошибка на единицу. Поэтому на каждой границе берут несколько значений.
Двухточечный анализ: сама граница и ближайшее значение из соседнего класса.
Возраст 18..60: 17, 18, 60, 61
Трёхточечный анализ: граница и оба соседа.
Возраст 18..60: 17, 18, 19, 59, 60, 61
Трёхточечный ловит больше: например, если в коде написано age == 18 вместо age >= 18, двухточечный набор (17 и 18) это пропустит, а 19 покажет.
Шаг значения
Сосед определяется шагом:
- целые: 17 и 18;
- копейки: 4999,99 и 5000,00;
- температура с шагом 0,1: −30,1 и −30,0;
- длина строки: 7 и 8 символов для пароля «от 8 до 20»;
- даты: день до и день после.
Чьей стороне принадлежит граница
Читай требования внимательно. «До 1 кг включительно 300 ₽, свыше 1 кг 500 ₽»: граница 1,000 кг принадлежит дешёвому тарифу, её сосед при шаге в грамм 1,001 кг. Если требование звучит как «скидка детям до 18 лет» и непонятно, входит ли 18, не угадывай. Это дефект требований, вопрос к их автору.
Неявные границы
Требования говорят «любое положительное целое», но реализация всё равно ограничена:
- тип в коде (32-битное целое: максимум 2147483647);
- длина колонки в базе (
varchar(255)); - лимит размера тела запроса на сервере или прокси;
- максимальный размер загружаемого файла.
Их ищут в документации API, схеме БД, у разработчиков.
Относительные границы
Иногда граница зависит от другого поля: «дата выезда позже даты заезда на 1-30 ночей». Проверяй разницу 0, 1, 30 и 31 ночь при разных датах заезда: конец месяца, 29 февраля, Новый год.
Как собрать тесты
- Выпиши входные параметры и требования к ним.
- Разбей каждый на валидные и невалидные классы.
- Найди границы между классами.
- Выбери значения: представители и границы.
- Составь тесты: валидные значения разных полей объединяй, невалидные проверяй по одному.
Последнее правило важно. Если в одном тесте два невалидных поля, первая ошибка валидации замаскирует вторую. Пример: у двух полей по одному валидному и по два невалидных класса. Минимум тестов: 1 позитивный + 4 негативных = 5.
Не забудь сервер
Если фронт не даёт ввести 100 000,01 ₽, это удобство, а не защита. Отправь то же значение запросом в API через DevTools, Postman или cURL: сервер обязан отказать.
Частые ошибки
- Проверять только 18 и 60, без 17 и 61.
- Объединять «меньше» и «больше» в один невалидный класс.
- Брать соседей с шагом 1 там, где шаг 0,01.
- Забывать пустое значение и пробелы.
- Проверять границы только в интерфейсе.
Что спросят на собесе
- Протестируй поле «Возраст» от 18 до 60.
- Что такое класс эквивалентности? Почему из класса берут одно значение?
- Чем двухточечный анализ границ отличается от трёхточечного?
- Сколько тестов нужно для формы из двух полей?
- Какие границы есть у поля, если требования их не указывают?