- •4.9.1. Изменяемость
- •4.9.2. Классы операций
- •98 Глава 4
- •4.9.3. Полнота
- •100 Глава 4
- •4.9.5. Операции egual, similar и copy
- •102 Глава 4
- •104 Глава 4
- •5. Исключительные ситуации
- •108 Глава 5
- •110 Глава 5
- •6.2.1. Сигнализация об исключительных ситуациях
- •5.2.2. Обработка исключительных ситуаций
- •112 Глава 5
- •5.2.3. Предложение resignal
- •6.2.4. Необрабатываемые исключительные ситуации
- •114 Глава 5
- •6.2.3. Предложение resignal
- •5.2.4. Необрабатываемые исключительные ситуации
- •116 Глава 5
- •118 Глава 5
- •118 Глава 5
- •120 Глава 5
- •122 Глава 5
- •124 Глава 5
- •128 Глава 6
- •130 Глава 6
- •6.2.1. Реализация итераторов
- •6.2.2. Использование итераторов
- •132 Глава 6
- •134 Глава 6
- •136 Глава 6
- •138 Глава 6
- •140 Глава 7
- •142 Глава 7
- •7.2. Абстракция данных
- •144 Глава 7
- •146 Глава 7
- •148 Глава 7
- •150 Глава 7
- •7.4. Генераторы
- •162 Глава 7
- •154 Глава 7
- •156 Глава 7
- •162 Глава 8
- •164 Глава 8
- •166 Глава 8
- •168 Глава 8
- •170 Глава 9
- •172 Глава 9
- •174 Глава 9
- •176 Глава 9
- •9.1.3. Пример
- •178 Глава 9
- •180 Глава 9
- •182 Глава 9
- •184 Глава 9
- •186 Глава 9
- •188 Глава 9
- •190 Глава 9
- •192 Глава. 9
- •194 Глава 9
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^ ситуаций вряд ли является реальной. В таких случаях мы останавливаемся на некотором приближении к полномаршрутному набору проверочных значений. Наиболее распространенным приближением является рассмотрение в качестве
