Классы эквивалентности и граничные значения на примерах
Проверить все возможные значения нельзя. Эти две техники отвечают на вопрос, какие значения выбрать, чтобы проверок стало мало, а покрытие осталось прежним.
Классы эквивалентности: почему хватает одного значения
Идея простая: если система обрабатывает группу значений одинаково, достаточно проверить одно из группы. Такая группа и называется классом эквивалентности.
Поле «возраст», принимаются значения от 18 до 65. Классы:
| Класс | Пример значения | Ожидание |
|---|---|---|
| Меньше 18 | 10 | Отказ с понятным текстом |
| От 18 до 65 | 30 | Принято |
| Больше 65 | 80 | Отказ |
| Не число | abc | Отказ |
| Пусто | Отказ, поле обязательное |
Пять проверок вместо перебора всех чисел. Проверять 30, 31 и 32 бессмысленно: они из одного класса, и код обрабатывает их одинаково.
Граничные значения: ошибки живут на краях
Внутри класса код одинаков, а вот на границе программисты регулярно путают < и <=. Поэтому к каждой границе берут три точки: перед ней, на ней и сразу после.
Для диапазона 18–65 это значения 17, 18, 19 и 64, 65, 66. Часто ограничиваются двумя на границу — 17, 18 и 65, 66, — этого достаточно в большинстве случаев.
Класс эквивалентности говорит, что проверять. Граница — где именно сломается.
Границы есть не только у чисел
- Длина строки. Поле до 40 символов: 39, 40, 41. И отдельно — пустая строка и одни пробелы.
- Даты. Вчера, сегодня, завтра относительно ограничения. Плюс 29 февраля и 31-е число в тридцатидневном месяце.
- Количество. Ноль элементов, один, максимум, максимум плюс один. Пустой список ломает интерфейсы чаще всего.
- Деньги. Ноль, копейки, отрицательное, очень большая сумма. Отдельно — сумма ровно на границе скидки.
- Время. Полночь, конец месяца, смена часового пояса, переход на летнее время.
Если написано «скидка 10% при заказе от 5000 ₽», то граница — 5000, и проверять надо 4999, 5000, 5001. Ограничение поля ввода тут ни при чём: логика скидки живёт отдельно.
Как применять на практике: порядок действий
- Выпишите из требований все ограничения: диапазоны, длины, форматы, обязательность.
- Для каждого разбейте значения на классы — верные и неверные.
- Возьмите по одному представителю каждого класса.
- Добавьте границы для всех числовых и размерных ограничений.
- Проверьте, что каждый неверный класс проверяется отдельно: иначе одна ошибка замаскирует другую.
Последний пункт часто пропускают. Если отправить форму с пустым именем и неверной почтой сразу, вы увидите одно сообщение и не узнаете, ловится ли второе условие.
Разбор на форме регистрации
Возьмём требования: имя от 2 до 30 символов, почта обязательна, пароль от 8 до 64 символов, согласие обязательно. Сколько проверок получится?
| Поле | Классы | Границы |
|---|---|---|
| Имя | пусто · короче 2 · норма · длиннее 30 · только пробелы · цифры и символы | 1, 2, 30, 31 |
| Почта | пусто · без @ · без домена · норма · с пробелами по краям · кириллица | — |
| Пароль | пусто · короче 8 · норма · длиннее 64 | 7, 8, 64, 65 |
| Согласие | не отмечено · отмечено | — |
Итого около двадцати проверок вместо бесконечного перебора. Причём каждая осмысленна: за ней стоит либо отдельная ветка логики, либо место, где путают знак сравнения.
Отдельно отметьте пункт «с пробелами по краям» у почты. Формально это не класс и не граница, а типовая ошибка обработки: пользователь копирует адрес вместе с пробелом, а сервер не обрезает его и не находит пользователя. Такие проверки добавляются к техникам из опыта — техники дают каркас, опыт наполняет его деталями.
Частая ошибка: класс определён по полю, а не по логике
Новички разбивают значения по тому, что видят в интерфейсе: поле числовое — значит классы «число» и «не число». Но система обрабатывает данные по своим правилам, и классы задаются ими.
Пример: поле «количество товара» принимает числа от 1 до 99. Кажется, три класса. Но если по требованиям при количестве больше 10 меняется способ доставки, а от 50 включается оптовая цена, то классов уже пять — и границы появляются на 10 и 50, которых в описании поля нет вовсе.
Вывод: разбиение делается по требованиям и логике обработки, а не по типу поля. Поэтому техника всегда начинается с чтения требований, а не с открытия формы.
Чего эти техники не находят
Честно о границах применимости: классы и границы работают с отдельными полями. Дефекты, возникающие от сочетания параметров, они не ловят.
Пример: скидка считается верно, доставка считается верно, а вместе с промокодом сумма уходит в минус. Для таких случаев есть попарное тестирование и таблицы решений — они как раз про комбинации.
Готовый список значений, которые стоит подставлять в любое поле, собран в чек-листе тестирования формы.
Обязательно ли выписывать классы на бумаге?
На старте — да, иначе половина классов теряется. С опытом разбиение происходит в голове, но в сложных случаях к записи возвращаются все: когда ограничений больше трёх, память подводит.
Сколько значений брать на границе — два или три?
Классический вариант — три (до, на, после), сокращённый — два (на границе и сразу за ней). Для внутренней границы диапазона обычно хватает двух.
Нужно ли проверять несколько значений из одного класса?
Нет, в этом смысл техники. Исключение — если есть подозрение, что внутри класса логика неоднородна: тогда это на самом деле два класса.
Как отвечать про эти техники на собеседовании?
Не определением, а примером: возьмите поле возраста и покажите классы и границы. Так сразу видно, что вы техникой пользовались, а не читали о ней.