Вы находитесь на странице: 1из 3

Техника анализа классов эквивалентности

Определение

Наверное, вы догадываетесь, что полное тестирование даже простой программы невозможно. А


если и возможно, но займет много лет.

Возьмем, к примеру, калькулятор. Сколько комбинаций входных параметров нужно


протестировать? Давайте ограничимся только операцией сложения. 2 числа по 8 знаков – это
108*108= 1016 комбинаций. Если прикинуть, что на каждый тест мы потратим около 10 секунд, то
время полного тестирования займет у нас 1017 секунд, то есть больше 3 миллиардов лет
непрерывных тестов.

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

Как раз для этих целей используется техника разбиения на классы эквивалентности. Давайте
дадим ей неформальное определение:

Это техника, которая заключается в разбиении всего набора тестов на классы


эквивалентности с последующим сокращением числа тестов.

Эта техника рекомендует проведение тестов для всех классов эквивалентности, хотя бы по
одному тесту для каждого класса.

Цели техники анализа классов эквивалентности

Целью данной техники является не только сокращение числа тестов, но и сохранение


приемлемого тестового покрытия.

Здесь мы видим конфликт между сокращением количества тестов и сохранением способности


тестов находить ошибки. Но мы вынуждены идти на этот компромисс, если хотим сократить
количество тестов.

При использовании этой техники тестировщик должен помнить о том, что:


 Слишком большое количество эквивалентных классов увеличивает вероятность, что
множество тестов будет лишним (избыточным).
 Слишком малое число эквивалентных классов увеличивает вероятность, что ошибки
продукта будут пропущены.

Эквивалентные тесты

Давайте договоримся о том, какие тесты мы будем считать эквивалентными.

Два теста считаются эквивалентными, если:


 Они тестируют одну и ту же вещь (функцию, модуль, часть системы).
 Если один из тестов ловит ошибку, то другой скорее всего тоже её поймает.
 Если один из них не ловит ошибку, то другой скорее всего тоже не поймает
Если же мы говорим об эквивалентности входных параметров программы, то входные параметры,
которые приводят к одинаковому поведению программы, мы будем считать эквивалентными.

Как можно использовать технику

Давайте перейдем от теории к практике.


Примерный алгоритм использования техники такой:

1. Определить классы эквивалентности. Это главный шаг техники. От него во многом 


зависит эффективность её применения.
2. Затем нужно выбрать одного представителя от каждого класса. На этом шаге из
каждого эквивалентного набора тестов мы выбираем один тест.
3. Нужно выполнить тесты. На этом шаге мы выполняем тесты от каждого класса
эквивалентности.
Если есть время, можно протестировать еще несколько представителей от каждого класса. Но
нужно иметь в виду, что если мы правильно выполнили первый шаг, то есть правильно
определили классы эквивалентности, то дополнительные тесты скорее всего будут избыточными и
дадут тот же результат.

На первом шаге, когда мы определяем классы эквивалентности, нам могут здорово помочь
программисты. Они могут подсказать, как программа ведет себя при тех или иных входных
параметрах.

Можно разбивать тесты на классы эквивалентности по разным принципам. От этого


эффективность нашего тестирования может выиграть. Например, если мы тестируем поле ввода,
которое принимает максимум 5 символов, то мы можем выбрать разные принципы разбиения на
классы эквивалентности:
 По количеству символов
 По типу символов (цифры, буквы, спец символы)

Пример использования техники

Давайте рассмотрим пример: функцию подсчета комиссии при отмене бронирования авиабилетов.

Предположим, что размер комиссии зависит от времени до вылета, когда совершена отмена:

 За 5 суток до вылета комиссия составляет 0%


 Меньше 5 суток, но больше 24 часов – 50% 
 Меньше 24 часов, но до вылета – 75%
 После вылета – 100%

Теперь давайте пойдем по шагам:

1. Определим классы эквивалентности (для каждого теста из этих классов мы ожидаем


получить одинаковый результат):

 1 класс: время до вылета > 5 суток


 2 класс: 24 часа < время до вылета < 5 суток
 3 класс: 0 часов < время до вылета < 24 часа
 4 класс: время до вылета < 0 часов (вылет уже состоялся) 

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

 время до вылета = 10 суток (тест из 1-го класса)


 время до вылета = 3 суток (тест из 2-го класса)
 время до вылета = 12 часов (тест из 3-го класса)
 время до вылета = -30 мин (тест из 4-го класса)
3. Выполним тесты:

 Отменим бронь за 10 суток до вылета и проверим, что комиссия составила 0%.


 Отменим бронь за 3 суток до вылета и проверим, что комиссия составила 50%.
 Отменим бронь за 12 часов до вылета и проверим, что комиссия составила 75%.  
 Отменим бронь через 30 мин после вылета и проверим, что комиссия составила 100%.

Мы видим, что у нас осталось всего 4 теста. А сколько возможных тестов существует?

Даже если мы введем ограничение, что отмена бронирования может произойти в рамках 10 суток
до вылета и 1 суток после вылета, то у нас будет около 950400 возможных тестов (посчитано
количество секунд в 11 сутках).

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

Плюсы и минусы техники анализа классов эквивалентности

Как и любая другая техника, анализа классов эквивалентности имеет достоинства и недостатки.
 К плюсам можно отнести заметное сокращение времени и улучшение
структурированности тестирования.
 К минусам можно отнести то, что при неправильном использовании техники мы рискуем
потерять баги.
Еще раз напомню важный принцип разбиения на классы эквивалентности:
 Слишком большое количество эквивалентных классов увеличивает вероятность, что
большинство тестов будет лишним (избыточным)
 Слишком малое число эквивалентных классов, хоть и уменьшает время тестирования, но
увеличивает вероятность, что ошибки продукта будут пропущены.

Тестировщик должен постоянно держать это в голове.

Он может сделать из этого вывод о том, что лучше перестраховаться и разбить набор тестов на
большее число эквивалентных классов (или взять больше одного теста из каждого класса), чем
сократить их число и пропустить ошибки.

При использовании этой техники мы должны видеть не только ее положительное влияние


(сокращение количества тестов), но и возможные проблемы, которые она может вызвать (пропуск
серьезных ошибок).

Поэтому тестировщик должен подходить к разбиению на классы эквивалентности очень


ответственно.

Оценить