- Что это
- Особенности
- Стандартные действия
- Примеры
- Типы
- Советы
- Преимущества/недостатки
- Чем отличается от анализа граничных значений
Что такое классы эквивалентности
Коротко: выбранные тестировщиком наборы данных (диапазоны), которые подаются на ввод в модуль, и это должно приводить к одинаковым результатам.
Методика группировки и разделения тестовых входных данных на некие эквивалентные классы. Широко применяемая техника тестирования черного ящика; относится к базовым; всегда спрашивают на собеседованиях. Альтернативное название: эквивалентное разбиение.
Как гласит Первый принцип тестирования, “полное тестирование программы невозможно, или займет недопустимо длительное время”. Причина в том, что нужно проверить слишком много комбинаций тестовых данных.
Например, слушатель курсов программирования написал простейший калькулятор, и нужно протестировать в нем (хотя бы) все возможные операции сложения (а их 10 в 16 степени, то есть 10 квадриллионов), на это понадобятся миллиарды лет.
Классы эквивалентности помогают тестировщику получить четкие результаты за ограниченное время, покрывая множество тестовых сценариев. Улучшается качество тест-кейсов, устраняется избыточность, возможная в других методиках.
Особенности
- Это методика черного ящика (то есть тестировщик не видит код, является “внешним наблюдателем” по отношению к программе)
- Еще одна формулировка КЭ: формируются группы (классы) тестовых вводов с одинаковым поведением
- Суть в том, что если один член класса ведет себя каким-то образом, то и все остальные члены должны вести себя так же
- Применяется на любом этапе жизненного цикла тестирования
- В том числе в юнит-тестировании, интеграционном, системном и приемочном тестировании
- Тест-кейсы основаны на классах (а не на отдельных тестовых вводах, которых может быть огромное количество). Это экономит рабочее время, потому как не создается много избыточных тест-кейсов.
- Техника применяется, когда тестовые данные можно поделить на интервалы и наборы дискретных значений (то есть почти всегда)
- Как правило, в QA применяется сочетание классов эквивалентности и граничных значений — это дает более надежные результаты.
Стандартные действия по методике
- Правильно определяются классы эквивалентности, это главное.
- Выбирается один представитель (член) в каждом классе. Из каждого эквивалентного набора тестов выбирается один тест.
- Выполнение тестов от каждого класса.
- Если времени достаточно (или ситуация требует, см. далее о типах), берутся несколько членов из каждого класса. Но у опытного тестировщика классы определены правильно с начала, поэтому несколько членов будут не обязательны (избыточны = покажут те же результаты).
Пример
Есть приложение, принимающее на ввод число из 2 или 3 цифр. Из условия понятно, что диапазон возможных чисел — достаточно большой, и все варианты проверить получается неэкономно.
- Теперь эти числа группируем, формируя из них классы эквивалентности. Вместо проверки сотен чисел сформируем из них 4 эквивалентных класса, и разделим вводы на категорию валидных и невалидных.
- Один элемент из класса как бы представляет весь класс. Например, число 122 представляет класс “трехзначные числа”. Поданное на ввод, число 122 не вызывает ошибку в приложении (тест пройден). Из этого делаем вывод, что все другие члены класса “Трехзначные” также будут нормально приняты приложением. А если тест не пройдет с числом 122, то предполагается, что все трехзначные числа будут вызывать ошибку.
- А теперь берем число 7 из класса “однозначные числа”, то есть невалидный ввод. Ожидается, что приложение выдаст ошибку в ответ на заведомо невалидный ввод, и это будет значить, что оно работает правильно, и предполагается, что остальные однозначные числа также будут вызывать ошибку.
Еще пример
Есть приложение, в которое подается число от 10 до 100, и затем вычисляется его корень. Эквивалентные классы будут такими:
Класс | Описание |
---|---|
Числа от 10 до 100 | Дата-сет для позитивного сценария |
Числа от 0 до 9 | Дата-сет для негативного сценария |
Числа больше 100 | Тоже не примет приложение |
Отрицательные числа | Усложняем задачу |
Буквы | Еще усложняем |
Специальные символы типа %^&# | И еще такой отдельный класс |
Типы классов эквивалентности ( * )
- Weak Normal. Тестируется по одной переменной из каждого класса. Поэтому еще называется предположением об одной ошибке (single fault assumption)
- Strong Normal, или предположение о нескольких ошибках. Создаются тест-кейсы из каждого элемента в множестве прямого произведения эквивалентности. Это улучшает охват тестирования, поскольку покрывает все возможные классы, позволяя проверить все возможные комбинации вводов.
- Weak Robust, как и Weak Normal, тестирует одну переменную из каждого КЭ, но фокусируется на тест-кейсах с невалидными значениями.
- Strong Robust. Создаются тест-кейсы для всех валидных и невалидных элементов произведения эквивалентного класса. Это “неэкономный” тип КЭ, не уменьшающий избыточность тест-кейсов.
Советы
- Robust-типы применяются, если условия ошибки являются высокоприоритетными для проверки, и в сложных функциях
- Robust применяется, если невалидные значения вызывают runtime-ошибки в системе (в языках со строгой типизацией)
- Берутся одно валидное и оно невалидное значение, если входные условия в приложении не очень ясны
- Установление правильной эквивалентности может требовать опыта, и усилий
- Чем больше создано классов, тем вероятнее, что много тестов окажутся избыточными
- И чем меньше классов, тем выше вероятность пропуска ошибок
Преимущества и недостатки
Плюсы
- Главное — уменьшает количество тест-кейсов, не уменьшая покрытие
- Уменьшает время тестирования и упрощает процесс, меньше данных обрабатывается
- Применяется на всех этапах и уровнях тестирования
- Позволяет сфокусироваться на небольших наборах данных, что улучшает вероятность найти больше багов
- Тесты получаются более структурированными
- Подходит для проектов с ограничением времени и ресурсов (то есть всегда)
Минусы
- Не учитывает условия по граничным значениям (поэтому надо сочетать с анализом граничных значений)
- Подбор эквивалентных классов — сложная вещь для новичков
Разница между классами эквивалентности и анализом граничных значений
Классы эквивалентности | Граничные значения |
---|---|
Стандартная техника «черного ящика», с которой начинают тестирование | Часто последующий этап «черного ящика», продолжение тестирования после эквивалентных классов |
Применяется на любом этапе тестирования: юнит-, интеграционное, системное, и пр. | Как дополнение к КЭ и как часть негативного или стресс-тестирования |
Техника: тестовые данные делятся на эквивалентные классы, которые “должны вести себя одинаково” | Техника: проверяются “значения на границах” классов |
Экономит время на тестирование, меньше тест-кейсов и они более эффективные | Уменьшает общее время выполнения тестов, делая поиск багов быстрее и проще |
Стандартно тестируется только по одному значению из каждого эквивалентного класса | Тест-кейсы создаются из граничных значений классов |
Альтернативное название: эквивалентное разбиение | Альтернативное название: проверка границ диапазона |
Техника эквивалентных классов так важна в тестировании, и настолько часто применяется, что в ISTQB есть отдельный тип тестового покрытия — покрытие эквивалентного разбиения, «процент эквивалентных областей, проверенных набором тестов».