Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
45
Добавлен:
23.03.2015
Размер:
884 Кб
Скачать

174 Глава 9

'естиромние и отладка

которая была реализована следующим образом)

append.array == proc (al, a2: array [int]) ai = array [int] while ai$size (a2) ^> 0 do ai$addh (al, a2 [ai$low(a2)]) ai$reml (a2) end end append, array

Любые проверочные значения, у которых al и a2 связаны с од­ним и тем же непустым массивом, приведут к возникновению в про­цедуре append.array серьезной ошибки.

9.1.2. Тестирование на основании текста программы

Приступая к проверке, лучше всего начать с проверки методом черного ящика. Однако при основательной проверке программы этот метод редко оказывается эффективным. Без просмотра текста самой программы невозможно сказать, какие проверки могут предоставить новую информацию. Следовательно, при использо­вании метода черного ящика неизвестно, какой объем всех воз­можных проверок будет осуществлен. Например, предположим, что некоторые выходные результаты программа выбирает из таб­лицы, а некоторые вычисляет. Если тест, основанный на методе черного ящика, включает только значения, которые программа должна отыскать в таблице, то информация о той части программы, которая ответственна за вычисления, получена не будет.

Хорошим способом реализации проверки методом черного ящика является выбо^^азличных^маршруюв^путей проверки. Главная цель в этом случае — создание теста, в котором каждый путь проверяются по крайней мере одним членом из набора. Мы говорим в этомслучае, что набор данных для теста является полно­маршрутным. В гл. II мы рассмотрим прием подсчета путей те­стирования программы. Сейчас мы будем исходить из неформаль­ных аргументов. Рассмотрим программу

max_of_three == proc (х, у, z: int) returns (int) if x>y

then if x ^> z then return (х) else return (z) end else if у > z then return (y) else return (z) end end end max_oL three

Несмотря на тот факт, что существует п" входных значений, где п есть допускаемый языком программирования диапазон для целых чисел, для проверки данной программы имеется только четыре маршрута. Следовательно, концепция проверки всех мар­шрутов позволяет нам разбить проверочные данные на четыре класса. В первом из классов х больше, чем у и z. В другом — х

ьше, чем г, но меньше, чем у, и т.д. Представители этих че-)ех классов есть

3,2,4 1,2,1 1,2,3

Легко показать, что проверка всех маршрутов недостаточна для обнаружения всех ошибок. Рассмотрим программу

шах. of. three == proc (х, у, z: int) returns (int) return (х) end max. of. three

Набор для теста содержит только тройку 2,1,1

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

Другая потенциальная проблема, связанная со стратегией тестирования, основанной на выборе полномаршрутной проверки, заключается в наличии порой слишком большого числа маршру­тов. Это делает ее непрактичной. Рассмотрим фрагмент программы на рис. 9.1. Как видно из последующего анализа, в этой программе имеется У"" маршрутов. Оператор if обусловливает выполнение одной или другой ветви программы, и оба этих маршрута приво­дят к выполнению следующего прохода цикла. Следовательно, для каждого прохода через i-ю итерацию имеется два прохода через (i + 1)-ю итерацию. Поскольку к первой итерации ведет только один маршрут, то число маршрутов по выходу из i-й ите­рации составляет 21. Следовательно, из 100-й итерации существует 2"° выхода.

j:=k

for i: int in int$fromJo (1, 100) do if pred (i *j) then j :== j + I end end

Рис. 9.1. Программа с большим числом маршрутов.

Проверка 2^ ситуаций вряд ли является реальной. В таких случаях мы останавливаемся на некотором приближении к полно­маршрутному набору проверочных значений. Наиболее распро­страненным приближением является рассмотрение в качестве

Соседние файлы в папке POSIBNIK