Классы эквивалентности и граничные значения на примерах

Проверить все возможные значения нельзя. Эти две техники отвечают на вопрос, какие значения выбрать, чтобы проверок стало мало, а покрытие осталось прежним.

Классы эквивалентности: почему хватает одного значения

Идея простая: если система обрабатывает группу значений одинаково, достаточно проверить одно из группы. Такая группа и называется классом эквивалентности.

Поле «возраст», принимаются значения от 18 до 65. Классы:

КлассПример значенияОжидание
Меньше 1810Отказ с понятным текстом
От 18 до 6530Принято
Больше 6580Отказ
Не числоabcОтказ
ПустоОтказ, поле обязательное

Пять проверок вместо перебора всех чисел. Проверять 30, 31 и 32 бессмысленно: они из одного класса, и код обрабатывает их одинаково.

Граничные значения: ошибки живут на краях

Внутри класса код одинаков, а вот на границе программисты регулярно путают < и <=. Поэтому к каждой границе берут три точки: перед ней, на ней и сразу после.

Для диапазона 18–65 это значения 17, 18, 19 и 64, 65, 66. Часто ограничиваются двумя на границу — 17, 18 и 65, 66, — этого достаточно в большинстве случаев.

Класс эквивалентности говорит, что проверять. Граница — где именно сломается.

Границы есть не только у чисел

⚠️ Граница из требований, а не из поля

Если написано «скидка 10% при заказе от 5000 ₽», то граница — 5000, и проверять надо 4999, 5000, 5001. Ограничение поля ввода тут ни при чём: логика скидки живёт отдельно.

Как применять на практике: порядок действий

  1. Выпишите из требований все ограничения: диапазоны, длины, форматы, обязательность.
  2. Для каждого разбейте значения на классы — верные и неверные.
  3. Возьмите по одному представителю каждого класса.
  4. Добавьте границы для всех числовых и размерных ограничений.
  5. Проверьте, что каждый неверный класс проверяется отдельно: иначе одна ошибка замаскирует другую.

Последний пункт часто пропускают. Если отправить форму с пустым именем и неверной почтой сразу, вы увидите одно сообщение и не узнаете, ловится ли второе условие.

Разбор на форме регистрации

Возьмём требования: имя от 2 до 30 символов, почта обязательна, пароль от 8 до 64 символов, согласие обязательно. Сколько проверок получится?

ПолеКлассыГраницы
Имяпусто · короче 2 · норма · длиннее 30 · только пробелы · цифры и символы1, 2, 30, 31
Почтапусто · без @ · без домена · норма · с пробелами по краям · кириллица
Парольпусто · короче 8 · норма · длиннее 647, 8, 64, 65
Согласиене отмечено · отмечено

Итого около двадцати проверок вместо бесконечного перебора. Причём каждая осмысленна: за ней стоит либо отдельная ветка логики, либо место, где путают знак сравнения.

Отдельно отметьте пункт «с пробелами по краям» у почты. Формально это не класс и не граница, а типовая ошибка обработки: пользователь копирует адрес вместе с пробелом, а сервер не обрезает его и не находит пользователя. Такие проверки добавляются к техникам из опыта — техники дают каркас, опыт наполняет его деталями.

Частая ошибка: класс определён по полю, а не по логике

Новички разбивают значения по тому, что видят в интерфейсе: поле числовое — значит классы «число» и «не число». Но система обрабатывает данные по своим правилам, и классы задаются ими.

Пример: поле «количество товара» принимает числа от 1 до 99. Кажется, три класса. Но если по требованиям при количестве больше 10 меняется способ доставки, а от 50 включается оптовая цена, то классов уже пять — и границы появляются на 10 и 50, которых в описании поля нет вовсе.

Вывод: разбиение делается по требованиям и логике обработки, а не по типу поля. Поэтому техника всегда начинается с чтения требований, а не с открытия формы.

Чего эти техники не находят

Честно о границах применимости: классы и границы работают с отдельными полями. Дефекты, возникающие от сочетания параметров, они не ловят.

Пример: скидка считается верно, доставка считается верно, а вместе с промокодом сумма уходит в минус. Для таких случаев есть попарное тестирование и таблицы решений — они как раз про комбинации.

Готовый список значений, которые стоит подставлять в любое поле, собран в чек-листе тестирования формы.

Обязательно ли выписывать классы на бумаге?

На старте — да, иначе половина классов теряется. С опытом разбиение происходит в голове, но в сложных случаях к записи возвращаются все: когда ограничений больше трёх, память подводит.

Сколько значений брать на границе — два или три?

Классический вариант — три (до, на, после), сокращённый — два (на границе и сразу за ней). Для внутренней границы диапазона обычно хватает двух.

Нужно ли проверять несколько значений из одного класса?

Нет, в этом смысл техники. Исключение — если есть подозрение, что внутри класса логика неоднородна: тогда это на самом деле два класса.

Как отвечать про эти техники на собеседовании?

Не определением, а примером: возьмите поле возраста и покажите классы и границы. Так сразу видно, что вы техникой пользовались, а не читали о ней.