Классы эквивалентности

Прошлый урок дал семь категорий негативных проверок — они подсказывают, в какую сторону смотреть в поисках бага. Но не отвечают на вопрос, какое именно значение внутри категории взять. Поле «Возраст» на нашем учебном полигоне принимает число от 18 до 99. Категория «граница длины» или «неверный тип» не назовёт тебе одно конкретное число для негативной проверки — а вариантов бесконечно много: 17? 0? -5? 1 000 000? Проверять каждое из них по отдельности — не хватит никакого спринта.

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

Класс эквивалентности: одна проверка вместо тысячи

Класс эквивалентности — это множество входных значений, которые система должна обработать одинаково: провести по одной и той же логике, одной и той же ветке кода. Все числа от 18 до 99 в поле «Возраст» попадают в одну ветку — «значение принято». Все числа меньше 18 — в другую ветку — «отказ, меньше минимума». Внутри одной ветки система не различает 45 и 46: для неё это один и тот же случай.

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

Как построить классы для числового поля

Возьмём поле «Возраст» с требованием «целое число от 18 до 99». У числового диапазона всегда минимум три класса: значения меньше минимальной границы (невалидный), значения внутри диапазона (валидный) и значения больше максимальной границы (невалидный). Меньше 18 и больше 99 — это два разных невалидных класса, а не один: они дают разные сообщения об ошибке («вам должно быть больше 18 лет» и «проверьте год рождения»), значит, обрабатываются разным кодом.

Есть и четвёртый класс, который легко упустить: нечисловой ввод. Буквы, пробел, спецсимволы — это не «маленькое» и не «большое» число, а вообще не число. Такой ввод обычно проверяется раньше и другим кодом (валидация типа), чем сравнение с границами диапазона — поэтому это отдельный класс, а не часть класса «меньше 18».

Представитель класса — любое значение внутри него, и необязательно рядом с границей: для валидного класса подойдёт 45, для невалидного «меньше 18» подойдёт и -5, и 0, и 10 — любое из них с равной вероятностью найдёт баг, если баг вообще в этой ветке кода. Осознанный выбор значения ровно на границе — это отдельная техника, разберём её в следующем уроке.

  Поле «Возраст»: допустимо число от 18 до 99

  +----------------+  +--------------------+  +----------------+
  | НЕВАЛИДНЫЙ     |  | ВАЛИДНЫЙ            |  | НЕВАЛИДНЫЙ     |
  | меньше 18      |  | 18 - 99             |  | больше 99      |
  | представитель: |  | представитель:      |  | представитель: |
  | -5             |  | 45                  |  | 150            |
  +----------------+  +--------------------+  +----------------+

  Отдельный класс, не входит в числовую линию:
  +-----------------------------------+
  | НЕЧИСЛОВОЙ ВВОД                    |
  | представитель: «двадцать»         |
  +-----------------------------------+

Классы не только для чисел

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

Если каждый способ оплаты запускает свою отдельную логику — свой платёжный шлюз, свой формат запроса — то это три разных валидных класса, а не один: карта, СБП и баланс придётся проверить по отдельности, по одному представителю на каждый. А вот невалидный класс здесь один: любое значение, которого нет в списке — например, значение «crypto», подставленное в обход интерфейса напрямую в запрос к серверу.

Прежде чем решать, сколько представителей нужно полю с конечным набором значений, важно понять: обрабатывает ли система эти значения одинаково или по-разному? Если одинаково — один класс, один представитель хватит на все варианты списка. Если по-разному — у каждого варианта свой класс.

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

Контрольный вопрос. Поле «Количество товаров в корзине» принимает целое число от 1 до 10. К какому классу относится значение 3?

АВалидный класс (1-10)
БНевалидный класс (меньше 1)
ВНевалидный класс (больше 10)

Подсказка: Сравни число с границами диапазона из требования.

Онлайн-проверка ответа появится позже

Контрольный вопрос. Что такое класс эквивалентности?

АМножество значений, которые система обрабатывает одинаково
БСписок всех возможных негативных проверок для поля
ВЕдинственное значение, которое обязательно нужно проверить

Подсказка: Вспомни определение из начала урока: что объединяет значения внутри одного класса.

Онлайн-проверка ответа появится позже

Контрольный вопрос. Поле «Возраст» принимает число от 18 до 99. Тестировщик уже проверил представителя валидного класса — число 45 — и баг не нашёлся. Нужно ли дополнительно проверять числа 46, 47, 48?

АДа, но проверить нужно только чётные числа из диапазона
БНет, они в том же классе, что и уже проверенное 45
ВДа, каждое число диапазона нужно проверить отдельно

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

Онлайн-проверка ответа появится позже

Контрольный вопрос. В форме оплаты есть поле «Способ оплаты» со значениями карта / СБП / баланс, заданными выпадающим списком. Какое из значений будет представителем НЕВАЛИДНОГО класса?

Акарта из выпадающего списка
Б«crypto», которого нет
ВСБП из выпадающего списка

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

Онлайн-проверка ответа появится позже

Контрольный вопрос. Поле «Оценка за курс» принимает целое число от 1 до 5. Какие пары значений находятся в одном и том же ВАЛИДНОМ классе эквивалентности? Выбери все подходящие.

Выберите все верные варианты.

А2 и 4
Б0 и 6
В1 и 5
Г-1 и 10

Подсказка: Валидный класс — это диапазон 1-5 целиком. Невалидные классы «меньше 1» и «больше 5» — это два РАЗНЫХ класса, а не один.

Онлайн-проверка ответа появится позже

Контрольный вопрос. Поле «Индекс» должно принимать ровно 6 цифр. Тестировщик вводит в него буквы «ABCDEF». К какому типу класса относится такой ввод?

АВалидный
БНевалидный

Подсказка: Буквы вместо цифр — это не значение внутри диапазона, а совсем другой тип данных.

Онлайн-проверка ответа появится позже

Контрольный вопрос. Как называется множество значений, которые система обрабатывает одинаково, и поэтому достаточно проверить только одно из них? Ответь термином из двух слов, как в уроке.

Подсказка: Термин вынесен в заголовок урока.

Онлайн-проверка ответа появится позже

Задание. Сколько минимум классов эквивалентности нужно выделить для этого числового диапазона, не считая нечисловой ввод? Ответь числом.

Поле «Количество мест на курс» принимает целое число от 1 до 30.

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

✅ Готово, если: ты ввёл(а) верный ответ, и онлайн-проверка его приняла.

Онлайн-проверка ответа появится позже

Задание. Опиши классы эквивалентности для этого поля: сколько валидных классов нужно выделить и почему именно столько, какой невалидный класс, и приведи по одному представителю на каждый класс. Ответ — нумерованный список.

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

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

✅ Готово, если: ответ раскрывает то, что просит критерий приёмки в задании выше.

Онлайн-проверка ответа появится позже

Задание. Нужно ли для полноты проверки взять ещё один валидный код, например «XY99ZZ», раз оба относятся к одному валидному классу? Ответь да или нет и объясни почему.

Требование: поле «Промокод» принимает строку из 6 символов (латиница и цифры). Тестировщик уже проверил представителя валидного класса — код «AB12CD» — и он сработал верно.

Подсказка: Вспомни главное свойство класса: обязательно ли проверять больше одного представителя одного и того же класса, если система обрабатывает их одинаково?

✅ Готово, если: ответ раскрывает то, что просит критерий приёмки в задании выше.

Онлайн-проверка ответа появится позже

Задание. Тексты сообщений у -10 и 200 не совпадают. Какими друг относительно друга получаются их классы эквивалентности? Ответь одним словом.

Поле «Скидка в процентах» принимает целое число от 0 до 50. Тестировщик проверяет значение -10 (меньше диапазона) и получает сообщение «скидка не может быть отрицательной». Затем он проверяет значение 200 (больше диапазона) и тоже получает сообщение об ошибке, но с ДРУГИМ текстом: «недопустимое значение скидки».

Подсказка: Класс эквивалентности определяется тем, КАК система обрабатывает значение (какой код срабатывает), а не просто тем, что оба значения невалидны.

✅ Готово, если: ты ввёл(а) верный ответ, и онлайн-проверка его приняла.

Онлайн-проверка ответа появится позже

Контрольный вопрос. Зачем тестировщику вообще нужны классы эквивалентности?

АЧтобы автоматически сгенерировать все тестовые данные для формы
БЧтобы не проверять каждое значение поля, а по одному на класс
ВЧтобы гарантированно найти все баги в поле без единого пропуска

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

Онлайн-проверка ответа появится позже

Что дальше

Представитель класса — это любое значение внутри него, и в этом уроке мы намеренно брали значения подальше от границ: -5, 45, 150. Но практика тестирования показывает: баги концентрируются не в середине класса, а ровно на его стыке с соседним классом — на границе. В следующем уроке разберём, как выбирать представителей осознанно, прямо на границе, и находить классический баг off-by-one.

← Назад  ·  ↑ В начало урока  ·  ⌂ В начало курса  ·  Вперёд →

Школа Виктора Комлева