- •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
176 Глава 9
эквивалента двух или более проходов через цикл и двух или более рекурсивных обращений к процедуре. Для получения набора проверочных данных для рассмотренной выше программы отыщем полномаршрутный набор значений для следующей программы»
j:=k
for i: int in int$from_to (1, 2) do if pred (i *j) then j :== j + I end end
В этой программе имеется только четыре маршрута. Полный набор данных для всех этих маршрутов может состоять, например, из следующих представителей:
1. pred (k) pred (2k + 2)
2. pred (k) ~ pred (2k + 2)
3. —pred (k) pred (2k)
4. —pred (k) — pred (2k)
Помимо этого, мы всегда включаем также случаи для каждой ветви условного выражения. Определим полномаршрутное тестирование для циклов и итераций следующим образом:
1. Для циклов с фиксированным числом проходов, как это было в предыдущем примере, будем использовать две итерации. Мы предпочтем сделать два прохода через цикл, поскольку к одной из распространенных ошибок относится отсутствие повторного задания начальных условий для цикла. Мы также должны убедиться в том, что ни в каком из случаев наши тесты не вызовут зацикливания.
2. Для циклов с переменным числом проходов используем в качестве значения этого числа нуль, единицу и двойку, и также включим тесты, предотвращающие зацикливание. Рассмотрим, например, следующий цикл:
while х S> 0 do
% некоторые действия end
Для такого цикла возможна ситуация, в которой не будет сделан ни один проход. Такой случай должен быть обязательно учтен в тестах, поскольку выполнение цикла в другой ситуации может быть причиной ошибки в программе.
3. Для рекурсивных процедур добавляются тесты для тех случаев, когда возврат из процедуры происходит без рекурсивных обращений, а также тесты, рассчитанные только на одно рекурсивное обращение.
Рассмотренное приближение к полномаршрутному тестированию, разумеется, далеко от идеала. Оно часто позволяет обнаружить ошибки, однако не дает никаких полных гарантий.
Тестирование и отладка
9.1.3. Пример
Для иллюстрации вышесказанного рассмотрим простую процедуру, проверяющую, является ли символьная строка палиндромом. Палиндромом называется строка, которая читается одинаково в обоих направлениях (например, слово deed). На рис. 9.2 приведена спецификация и реализация этой процедуры. Просматривая спецификацию, мы можем видеть, что необходимы тесты, возвращающие как значения true, так и значения false. Помимо этого, мы должны включить в качестве граничного условия нулевую строку. Проверочный набор может быть, например, следующим;
palindrome = proc (s: string) returns (bool)
effects Возвращает значение true, если s прочитывается одинаково в обоих направлениях. В противном случае возвращается значение false. Например, "deed" и " " являются палиндромами. palindrome == proc (s: string) returns (bool) low: int :== I high: int := string$size (s) while high > low do
if s [lowl— = s [high} then return (false) and low ;== low+ I high := high — I end return (true) end palindrome
Рис. 9.2. Процедура palindrome.
"" "deed" "ceed"
Анализ программы показывает, что мы должны проверить также следующие случаи: 1) цикл не выполняется; 2) после первого прохода возвращается значение false; 3) после первого прохода возвращается значение true; 4) после второго прохода возвращается значение false; 5) после второго прохода возвращается значение true.
Случаи 1), 4) и 5) уже учтены. Для случаев 2) и 3) мы должны рассмотреть ситуации "аЬ" и "аа". К этому моменту мы можем спросить себя, не пропущен ли какой-нибудь случай, и обратить внимание на то, что все проверочные строки содержат четное число символов. Следовательно, необходимо добавить в тест также и строки с нечетным числом символов. Эти строки должны включать в себя строку длиной 1 для проверки граничного случая. Наконец, мы должны разумным образом организовать последовательность тестов так, чтобы самый короткий из них выполнялся первым. Такое упорядочивание облегчает процедуру нахождения оши-, бок (см. разд. 9.4).
