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

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).

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