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

Прошлый урок дал семь категорий негативных проверок — они подсказывают, в какую сторону смотреть в поисках бага. Но не отвечают на вопрос, какое именно значение внутри категории взять. Поле «Возраст» на нашем учебном полигоне принимает число от 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)
БВалидный класс (1-10)
ВНевалидный класс (больше 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.

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

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

Проверить ответ →

Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →

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

Принято, если указано: 3 валидных класса — по одному на каждый вариант списка (курьер, самовывоз, почта), так как у каждого своя логика расчёта; и минимум 1 невалидный класс — значение не из списка (например, «доставка дроном» или пустое значение), полученное в обход интерфейса.

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

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

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

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

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

Критерий приёмки: принято, если дан ответ «нет» и объяснение указывает, что «AB12CD» и «XY99ZZ» относятся к одному и тому же валидному классу эквивалентности — система обрабатывает их одним и тем же кодом, и если один представитель класса не нашёл баг, второй представитель того же класса, скорее всего, тоже его не найдёт.

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

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

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

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

Задание. Означает ли разный текст сообщений об ошибке, что -10 и 200 нужно относить к одному классу эквивалентности или к разным классам? Ответь одним словом.

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

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

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

Проверить ответ →

Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →

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

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

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

Проверить ответ →

Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →

Что дальше

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

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

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