Эквивалентное разбиение

Как использовать equivalence partitioning, чтобы сокращать число тестов без потери смысла и выбирать действительно репрезентативные данные.

Обновлено:

Содержание

Эквивалентное разбиение помогает делить входные данные на классы, внутри которых система должна вести себя одинаково. Вместо проверки десятков похожих значений QA выбирает по одному-двум представителям из каждого значимого класса.

Базовая идея

Если система обрабатывает целый диапазон значений одинаково, нет смысла тестировать все значения подряд. Гораздо полезнее выделить классы: валидные, невалидные, пустые, слишком большие, запрещённые по формату и так далее.

Простой пример

Допустим, поле “Возраст” принимает значения от 18 до 60 включительно. Тогда можно выделить как минимум три класса: меньше 18, от 18 до 60, больше 60. Из каждого класса выбирается репрезентативное значение, а не полный перебор всех чисел.

Как применять на практике

  • →Сначала пойми правила валидации и бизнес-смысл поля или параметра.
  • →Выдели классы, где ожидаемое поведение действительно отличается.
  • →Выбери по одному значению из каждого класса и отдельно подумай про границы.
  • →Проверь не только позитивные, но и пустые, неверного типа, запрещённые и логически конфликтующие значения.

Частые ошибки

  • →Выделять классы механически, не понимая бизнес-логики.
  • →Забывать, что эквивалентные классы не заменяют анализ границ.
  • →Считать значения эквивалентными, хотя для системы они обрабатываются по-разному.
  • →Использовать только валидные классы и игнорировать негативные входы.

Эквивалентное разбиение особенно полезно для форм, API-параметров, фильтров, диапазонов, статусов и любых входов, где полный перебор нереален или бессмыслен. Его сила — в сокращении объёма тестов без потери логического покрытия.

Практический пример: допустимый целочисленный возраст

Учебное правило: приложение принимает целочисленный возраст от 18 до 65 включительно. Для этого правила выделим три непересекающихся класса: целые числа меньше 18, от 18 до 65 и больше 65. Сначала выберем представителя каждого, затем добавим границы.

plain text
Класс	Представитель	Ожидание
Целое меньше 18	16	Отклонить: возраст вне диапазона
Целое от 18 до 65	40	Принять
Целое больше 65	70	Отклонить: возраст вне диапазона

Модель предполагает сходную обработку значений внутри класса. Это гипотеза тест-дизайна, а не доказательство, что один пример обнаруживает любой дефект. Если для 60–65 лет появляется отдельный результат, разделите валидный класс. Не объединяйте разные исходы только потому, что у значений одинаковый тип данных.

Ошибки представления проверяем отдельно

Нужно определить и контракт передачи данных. В упражнении JSON-поле age обязательно и содержит целое число; строка, дробь и null недопустимы. Следующие случаи не являются дополнительными представителями трёх классов целых чисел.

plain text
Payload	Ожидание
{}	Отклонить: обязательное поле отсутствует
{"age": null}	Отклонить: нужно целое число
{"age": "40"}	Отклонить: нужно целое число
{"age": 40.5}	Отклонить: нужно целое число
{"age": 40}	Принять

Упражнение и ответ

Покрывают ли 25, 40 и 55 три класса целых чисел? Нет: все три относятся к валидному классу. Набор 16, 40 и 70 покрывает все три; затем добавьте 17, 18, 19, 64, 65 и 66 для проверки особенностей границ. Ожидаемые исходы следуют из условия, а HTTP-коды и формат ошибок нужно согласовать в отдельном API-контракте.

Продолжить изучение

Граничные значения

Таблицы решений

Справочник по техникам: программа ISTQB CTFL, разделы 4.2 и 5.5. Примеры выше — самостоятельные учебные сценарии.