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

172 Глава 9

иртание и отладка

термов (х >- 0 есть сокращение от х =•= 0 1 х> 0), то оно может быть удовлетворено двумя способами. Это оставляет нам ситуа­ции, при которых требования в предложении requires удовлетво­ряются:

1. х = 0 & .00001 < epsilon < .001.

2. х > 0 & .00001 < epsilon < .001.

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

Сформировать набор данных, который будет проверять все условия, заданные в предложении requires спецификации, до­вольно затруднительно. Может оказаться затруднительным даже установление того, какие условия должны быть проверены. На­пример, в приведенной выше спецификации программы sqrt мы ' предполагаем, что программа иногда возвратит точный результат, иногда результат, чуть меньший, чем точное значение квадрат­ного корня, а иногда — чуть больший. Программа же, которая всегда возвращает чуть большее или равное значение, будет вполне приемлемой. Мы окажемся не в состоянии подыскать данные, при которых возвращаемый результат чуть меньше ожи­даемого, однако мы не можем знать этого без анализа текста про­граммы. Фактически, без анализа текста программы мы не имеем представления о том, какие классы входных данных разбивают результаты на три категории.

Тем не менее мы должны внимательно проанализировать предложение effects и попытаться отыскать данные, которые ему удовлетворяют. Например, рассмотрим операцию intset$member:

member = proc (s: intset, х: int) returns (bool) effects Возвращает значение true, если х принадлежит s; в противном

случае возвращается значение false.

Предложение effects в этой спецификации представляет собой конъюнкцию: либо х принадлежит s, либо нет.

Часто тестирование, основанное на анализе предложения ef­fects, проверяет функционирование программ обработки ошибок. Отсутствие сигнала о возникновении исключительноя ситуации при запрещенных значениях входных параметров является столь же серьезной ошибкой, что и неверная работа программы при нор­мальных значениях. Следовательно, данные теста должны про­верять все возможные реакции программы. Рассмотрим, напри­мер, следующую спецификацию:

search^ proc (a: array lint], х: int) returns': int) signals (notJn) •-' effects Если х не принадлежит а, то возвращается i, такое, что a [i]=x;

в противном случае — сообщение not-in.

анной ситуации мы должны включить в проверку оба теста—. тай, когда х принадлежит а, и случай, когда х не принадле-: • а. Аналогично, если при выполнении программы sqrt возни-ают исключительные ситуации, а не значения, указанные в пред-ожении requires, то мы должны включить тесты, проверяющие акие ситуации.

Проверка граничных условий. Программа должна быть всегда Проверена с «типичными» входными значениями — например, Массивом или набором, содержащим несколько элементов, или целым числом, находящимся в границах между максимальным и 1минимальным значением, выдаваемым программой. Важно также ^проверить программу с нетипичными входными данными, которые Принято называть граничными.

t Анализ всех случаев, обусловленных предложением requires, ^Предполагает также проверку ряда граничных ситуаций — на-; пример, случай, при котором программа sqrt должна извлечь квадратный корень из нуля. Однако такой анализ не учитывает 'все граничные ситуации. Весьма важно проверить максимально возможное число таких ситуаций. Подобные проверки позволяют выявить два распространенных вида ошибок:

1. Логические ошибки, при которых обработка граничного условия не приводит к выходу на специальную подпрограмму его обработки, и

2. Отсутствие проверки условий, которые могут привести к возникновению исключительной ситуации в языке, расположен­ном на более низком уровне, или в аппаратной части (например, арифметическое переполнение).

Для составления тестов, проверяющих второй тип ошибки, хорошим приемом является использование проверочных данных, покрывающих все комбинации максимально и минимально допу­стимых значений всех тех числовых аргументов, изменение ко­торых происходит в пределах некоторых границ. Например, тесты для программы sqrt должны включать случаи со значением для epsilon, очень близким к 0.001 и 0.00001. При работе со стро­ковыми данными тесты должны включать пустую строку и строку из одного символа. Для массивов мы должны проверить пустой и односимвольный массивы.

Наложение ошибок. Другой вид граничного условия возникает в том,случае, когда один изменяемый объект связывается с двумя различными формальными параметрами, рассмотрим, например, процедуру

append, array -= proc (a I, a2: array [int]) modifies al и a2 effects Удаляет элементы из a2 и помещает их в конец al

К.

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