Классы эквивалентности
Поле «возраст от 18 до 65». Целых значений внутри диапазона ровно 48, а вместе с недопустимыми их бесконечно много. Проверить каждое нельзя, а вот разложить на три группы можно: меньше восемнадцати, внутри, больше шестидесяти пяти. Три теста вместо бесконечности.
Стержень: один представитель класса заменяет весь класс, а недопустимых классов обычно больше, чем допустимых, и каждый берут отдельным тестом.
// Формулировки: «что такое класс эквивалентности?», «почему один недопустимый вход на тест?», «это только про числа?».
Класс и его представитель
Класс эквивалентности - группа значений, про которые ты ожидаешь одинакового поведения системы. Возраст 25 и возраст 40 для формы регистрации неразличимы: оба внутри допустимого диапазона, обработка одна и та же. Значит, достаточно взять любое из них.
Отсюда экономия. Тестов становится столько, сколько классов, а не сколько значений. Три теста вместо сорока восьми - и это только по допустимым; полный перебор с недопустимыми вообще не имеет конца.
// Сразу оговорка про смысл слова «ожидаешь». Класс - это твоя ГИПОТЕЗА об одинаковости, а не факт из кода. Если внутри диапазона есть скрытая развилка - скажем, для пенсионеров считается иначе, - твой класс на самом деле состоит из двух, и один представитель проверит только половину. Поэтому разбиение проверяют по требованиям и по коду, а не берут из головы.
- класс эквивалентности
- группа значений, для которых ожидается одинаковое поведение
- представитель
- одно значение из класса, заменяющее весь класс
Почему недопустимые берут по одному на тест
Допустимые классы можно смешивать в одном тесте: заполнил форму корректными значениями всех полей - проверил сразу всё. С недопустимыми так нельзя, и вот почему.
Отправил форму, где сразу и возраст 15, и почта без собаки, и пустое имя. Система вернула одну ошибку - про возраст. Проверил ли ты обработку кривой почты? Нет: до неё проверка могла не дойти. Первая же сработавшая проверка маскирует все остальные, и три недопустимых значения дают один настоящий тест вместо трёх.
// Поэтому правило такое: в тесте на недопустимое значение кривое поле ровно ОДНО, остальные заполнены корректно. Тогда понятно, что именно проверялось и что именно сломалось, если тест покраснел.
- маскирование ошибок
- первая сработавшая проверка скрывает остальные недопустимые значения
Классы есть не только у чисел
Техника работает с любым входом, а не только с диапазонами. У строки классы такие: пустая, из одного символа, обычная, максимальной длины, длиннее максимума, с пробелами по краям, с эмодзи и другими символами вне латиницы, с кавычками и угловыми скобками. У файла: нужный формат, чужой формат, битый файл, нулевого размера, слишком большой.
Классы бывают и на выходе. Если метод возвращает скидку, у результата есть свои группы - нулевая скидка, обычная, максимальная - и тесты подбирают так, чтобы каждая из них получилась.
// Отдельная группа, про которую забывают чаще всего: состояние системы. Пользователь новый, пользователь с историей, заблокированный, удалённый - это тоже классы, и один и тот же запрос ведёт себя в них по-разному. Классы входных полей при этом могут быть покрыты полностью.
- классы на выходе
- группы результатов, каждая из которых должна быть получена хотя бы раз
Как отвечать: «Что такое классы эквивалентности и зачем один недопустимый на тест?»
Класс эквивалентности - группа значений, для которых я ожидаю одинакового поведения системы, поэтому достаточно проверить одного представителя. На поле «возраст от 18 до 65» это даёт три класса вместо сорока восьми значений внутри диапазона и бесконечности за его пределами. Допустимые значения разных полей я спокойно комбинирую в одном тесте. А вот недопустимые беру строго по одному, потому что первая же сработавшая проверка маскирует остальные: отправишь форму с тремя ошибками сразу - получишь одно сообщение и не узнаешь, обрабатываются ли две другие. При этом я помню, что класс это моя гипотеза об одинаковости, а не факт: если внутри диапазона есть скрытая развилка в логике, класс на самом деле состоит из двух. Поэтому разбиение сверяю с требованиями, а на подозрительных местах беру больше одного представителя.
Почему это сильный ответ: техника объяснена через экономию с конкретными числами, отдельно обосновано правило про недопустимые значения и названо главное ограничение метода.
На чём валят
- −Три теста со значениями из одного класса. Работа утроена, покрытие прежнее.
- −Собрать все недопустимые значения в один тест. Сработает первая проверка и скроет остальные.
- −Забыть недопустимые классы вовсе: пустое значение, отсутствующее поле, не тот тип, чужой идентификатор.
- −Считать классы только у входных полей. Состояние пользователя и группы результатов - тоже классы.
- −Верить своему разбиению без сверки с требованиями. Скрытая развилка в логике делит класс надвое незаметно.
Проверьте себя
Пять вопросов из банка по этой подтеме. Всего их 13, остальные разбираются в тренажёре.
- Что такое класс эквивалентности в тест-дизайне?A)Группа входных значений, которые система обрабатывает одинаковоB)Полный список всех допустимых значений поля, каждое из которых обязательно проверяется отдельным тестомC)Значения на самых краях допустимого диапазона, где чаще всего возникают ошибки в условияхD)Набор тест-кейсов одинаковой серьёзности, сгруппированных для удобства прогона в одном наборе
показать ответ и разбор
+A)Группа входных значений, которые система обрабатывает одинаково// разбор: Классы эквивалентности делят входные данные на группы, внутри которых система, по предположению, ведёт себя одинаково: если одно значение класса вызовет баг, его вызовет и любое другое. Поэтому вместо перебора всех значений берут по одному представителю от класса — покрытие сохраняется, число тестов резко падает. Делят и валидные входы, и невалидные. Ключевая идея: не «сколько значений», а «сколько разных поведений» нужно проверить.
- Зачем при разбиении на классы проверяют и невалидные классы, а не только валидные?A)Невалидные классы проверяют по остаточному принципу, когда на них остаётся свободное времяB)Система должна корректно отвергать некорректный ввод (ошибка/сообщение), а не падатьC)Невалидный ввод в проде не встречается, если на форме стоит клиентская валидация полейD)Невалидные классы нужны для замера скорости работы системы под потоком ошибочных запросов
показать ответ и разбор
+B)Система должна корректно отвергать некорректный ввод (ошибка/сообщение), а не падать// разбор: Валидные классы проверяют, что система принимает и правильно обрабатывает корректные данные. Невалидные не менее важны: система обязана распознать некорректный ввод и отреагировать предсказуемо — вернуть ошибку, показать сообщение, не сломаться. Пропустив невалидные классы, легко выпустить продукт, который падает или молча портит данные на «плохом» вводе. Поэтому по одному представителю берут от каждого класса — и валидного, и невалидного.
- Как разбиение на классы эквивалентности сокращает число тестов, не теряя покрытия?A)Она отбрасывает часть требований к полю, снижая объём проверок за счёт неполного покрытияB)Она заменяет ручные тесты автоматическими, поэтому их успевает прогоняться больше за то же времяC)Вместо перебора всех значений берут по одному из каждого классаD)Она объединяет несколько полей формы в один тест, уменьшая общее число тест-кейсов
показать ответ и разбор
+C)Вместо перебора всех значений берут по одному из каждого класса// разбор: Идея опирается на допущение: значения одного класса система обрабатывает идентично, поэтому проверка двух значений одного класса избыточна — они тестируют одно и то же поведение. Разбив вход на N классов, достаточно N тестов (по представителю), чтобы покрыть все различимые поведения. Полный перебор дал бы тысячи значений при том же числе реально различных исходов. Экономия тем больше, чем шире диапазоны. Риск — если внутри «класса» поведение на деле неоднородно, представитель баг пропустит.
- Поле «возраст» принимает 18–65. На какие классы эквивалентности его делят?A)Два класса: чётные и нечётные значения возраста — их система считает по-разномуB)Шестьдесят пять классов — по одному тесту на каждое допустимое целое значение возрастаC)Один класс — валидный диапазон 18–65; некорректные значения на входе проверять незачемD)Три класса: меньше 18 (невалид), 18–65 (валид), больше 65 (невалид)
показать ответ и разбор
+D)Три класса: меньше 18 (невалид), 18–65 (валид), больше 65 (невалид)// разбор: Диапазон 18–65 задаёт один валидный класс (значения внутри) и два невалидных (ниже нижней границы и выше верхней). Достаточно трёх тестов — по представителю каждого класса, например 40 (валид), 10 и 80 (невалид). Это покрывает три различимых поведения: принять, отвергнуть как «слишком мало», отвергнуть как «слишком много». Отдельно граничные значения (17/18, 65/66) добавит смежная техника анализа границ.
- Почему считают, что для класса эквивалентности достаточно одного тестового значения?A)По допущению класса система обрабатывает все его значения одинаково, поэтому второй представитель проверит то же самоеB)Потому что тестировщику не хватает времени проверить больше одного значения из каждого классаC)Потому что система кэширует результат первого значения и возвращает его для остальных значений классаD)Потому что представителя класса выбирают строго из середины диапазона, и края уже не важны
показать ответ и разбор
+A)По допущению класса система обрабатывает все его значения одинаково, поэтому второй представитель проверит то же самое// разбор: Техника строится на допущении об однородности: раз значения класса проходят по одной ветке логики, поведение на них совпадает, и второй тест того же класса не добавляет информации — он покрывает уже покрытое. Отсюда правило «один представитель на класс». Практический нюанс: допущение верно, лишь если класс выделен правильно. Если под одной «эквивалентной» группой скрыты разные под-поведения (например, скрытый под-диапазон с особой обработкой), одного значения не хватит — класс надо дробить дальше.
дальше
Теорию прочитали. Навык ставится повторением
В Сеньорчике эта подтема идёт в ежедневных сессиях: движок возвращает её, пока ответы не станут уверенными, и ведёт прогресс отдельно по каждой подтеме. Теория внутри тоже бесплатна, лимит только на количество вопросов в день.