Эквивалентное тестирование и анализ граничных условий

Базовые понятия

Хороший тест имеет приемлемую вероятность обнаружения ошибки и, как уже отмечалось исчерпывающее входное тестирование программы невозможно. Следовательно, тестирование программы ограничивается использованием небольшого подмножества всех возможных

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

Правильно выбранный тест этого подмножества должен обладать двумя свойствами:

a) уменьшать, причем более чем на единицу, число других тестов, которые должны быть разработаны для достижения заранее определенной цели «приемлемого» тестирования;

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

Указанные свойства, несмотря на их кажущееся подобие, описывают два различных положения. Во-первых, каждый тест должен включать столько различных входных условий, сколько это возможно, с тем, чтобы минимизировать общее число необходимых тестов. Во-вторых, необходимо пытаться разбить входную область программы на конечное число классов эквивалентности так, чтобы можно было предположить (конечно, не абсолютно уверенно), что каждый тест, являющийся представителем некоторого класса, эквивалентен любому другому тесту этого класса. Иными словами, если один тест класса эквивалентности обнаруживает ошибку, то следует ожидать, что и все другие тесты этого класса эквивалентности будут обнаруживать ту же самую ошибку. Наоборот, если тест не обнаруживает ошибки, то следует ожидать, что ни один тест этого класса эквивалентности не будет обнаруживать ошибки (в том случае, когда некоторое подмножество класса эквивалентности не попадает в пределы любого другого класса эквивалентности, так как классы эквивалентности могут пересекаться).

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

a) определённое значение;

b) диапазон значений;

c) множество конкретных значений;

d) булево выражение (true, false).

При анализе граничных значений следует соблюдать следующие правила:

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

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

c) Если внутренняя структура данных имеет предписанные границы, то разрабатываются тестовые варианты, проверяющие эти границы.

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

Осуществление тестирования

Разработка тестов методом эквивалентного разбиения осуществляется в два этапа:

a) выделение классов эквивалентности;

b) построение тестовых вариантов (тестов).

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

a) Назначение каждому классу эквивалентности уникального номера.

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

c) Запись тестов, каждый из которых покрывает один и только один из непокрытых неправильных классов эквивалентности, до тех пор, пока все неправильные классы эквивалентности не будут покрыты тестами.

Данный способ тестирования представляется на примере всё того же алгоритма сортировки вставкой. Производится сортировка массива чисел по возрастанию значений.

Итак, предусловия таковы:

¾ массив состоит из однородных элементов;

¾ массив ограничен размерностью N.

Эквивалентные разбиения:

¾ массив состоит из одного элемента;

¾ размерность массива от 2 до N элементов;

¾ размерность массива равна N.

Постусловия:

¾ массив упорядочен по возрастанию;

¾ массив не упорядочен.

 

 

Рисунок 15 – Дерево разбиения для процедуры Insertion_Sort

Условимся, что N = 1000. Класс эквивалентности 3 покрывает класс эквивалентности 1 и 2, поэтому два тестовых варианта будут избыточными. Для наглядности перечислены все тестовые варианты:

ТВ 1: Исходные данные: N = 1, A = {8};

Ожидаемый результат: A = {8}; массив упорядочен.

ТВ 2: Исходные данные: N = 1000, A = {5, 12, 8, 256, …, 90};

Ожидаемый результат: A = {…}; массив упорядочен.

ТВ 3: Исходные данные: N = 6, A = {1, 5, 6, 3, 256, 9};

Ожидаемый результат: A = {1, 3, 5, 6, 9, 256}; массив упорядочен.

ТВ 4: Исходные данные: N = 7, A = {1, 2, 6, 4, %, 20, 11};

Ожидаемый результат: Error 1 – встречен нечисловой символ; массив не упорядочен.

ТВ 5: Исходные данные: N = 0, A = {};

Ожидаемый результат: Error 2 – длина массива A = 0, сортировка невозможна; массив не упорядочен.

ТВ 6: Исходные данные: N = 4, A = {};

Ожидаемый результат: Error 3 – массив A пуст, сортировка невозможна; массив не упорядочен.

ТВ 7: Исходные данные: N = 3, A = {13, 7, 8, 7, 9, 10, 22, 58};

Ожидаемый результат: Error 4 – длина массива A > N; массив не упорядочен.