Эквивалентное разбиение помогает делить входные данные на классы, внутри которых система должна вести себя одинаково. Вместо проверки десятков похожих значений QA выбирает по одному-двум представителям из каждого значимого класса.
Базовая идея
Если система обрабатывает целый диапазон значений одинаково, нет смысла тестировать все значения подряд. Гораздо полезнее выделить классы: валидные, невалидные, пустые, слишком большие, запрещённые по формату и так далее.
Простой пример
Допустим, поле “Возраст” принимает значения от 18 до 60 включительно. Тогда можно выделить как минимум три класса: меньше 18, от 18 до 60, больше 60. Из каждого класса выбирается репрезентативное значение, а не полный перебор всех чисел.
Как применять на практике
- →Сначала пойми правила валидации и бизнес-смысл поля или параметра.
- →Выдели классы, где ожидаемое поведение действительно отличается.
- →Выбери по одному значению из каждого класса и отдельно подумай про границы.
- →Проверь не только позитивные, но и пустые, неверного типа, запрещённые и логически конфликтующие значения.
Частые ошибки
- →Выделять классы механически, не понимая бизнес-логики.
- →Забывать, что эквивалентные классы не заменяют анализ границ.
- →Считать значения эквивалентными, хотя для системы они обрабатываются по-разному.
- →Использовать только валидные классы и игнорировать негативные входы.
Эквивалентное разбиение особенно полезно для форм, API-параметров, фильтров, диапазонов, статусов и любых входов, где полный перебор нереален или бессмыслен. Его сила — в сокращении объёма тестов без потери логического покрытия.
Практический пример: допустимый целочисленный возраст
Учебное правило: приложение принимает целочисленный возраст от 18 до 65 включительно. Для этого правила выделим три непересекающихся класса: целые числа меньше 18, от 18 до 65 и больше 65. Сначала выберем представителя каждого, затем добавим границы.
Класс Представитель Ожидание
Целое меньше 18 16 Отклонить: возраст вне диапазона
Целое от 18 до 65 40 Принять
Целое больше 65 70 Отклонить: возраст вне диапазонаМодель предполагает сходную обработку значений внутри класса. Это гипотеза тест-дизайна, а не доказательство, что один пример обнаруживает любой дефект. Если для 60–65 лет появляется отдельный результат, разделите валидный класс. Не объединяйте разные исходы только потому, что у значений одинаковый тип данных.
Ошибки представления проверяем отдельно
Нужно определить и контракт передачи данных. В упражнении JSON-поле age обязательно и содержит целое число; строка, дробь и null недопустимы. Следующие случаи не являются дополнительными представителями трёх классов целых чисел.
Payload Ожидание
{} Отклонить: обязательное поле отсутствует
{"age": null} Отклонить: нужно целое число
{"age": "40"} Отклонить: нужно целое число
{"age": 40.5} Отклонить: нужно целое число
{"age": 40} ПринятьУпражнение и ответ
Покрывают ли 25, 40 и 55 три класса целых чисел? Нет: все три относятся к валидному классу. Набор 16, 40 и 70 покрывает все три; затем добавьте 17, 18, 19, 64, 65 и 66 для проверки особенностей границ. Ожидаемые исходы следуют из условия, а HTTP-коды и формат ошибок нужно согласовать в отдельном API-контракте.