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

170 Глава 9

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

Альтернативой верификации служит тестирование. Легко можем убедиться в том, что для некоторого набора входных зна­чений программа работает правильно, простой проверкой ее ра­боты с этими значениями. Если набор возможных входных зна­чений невелик, то возможна полная проверка (для каждого из входных значений). Но для большинства программ входной на­бор слишком велик (зачастую бесконечен) и полная проверка не представляется возможной. Однако грамотно подобранный на­бор проверочных значений может в большой степени укрепить нашу уверенность в том, что программа функционирует пра­вильно. Хорошо произведенный тест позволяет выявить боль­шинство ошибок в программах.

В данной главе мы сфокусируем свое внимание на тестирова­нии как методе проверки достоверности программ. Рассмотрим, как выбирать соответствующие тесты и как организовать про­цесс тестирования. Обсудим также процесс отладки и защитное программирование.

9.1. Тестирование

,i Тестирование представляет собой процесс выполнения про-1 граммы для некоторого набора проверочных значений и сравне-^ ния полученных результатов с ожидаемыми. Цель_тести р о^ания заключается в выявлении возможных ошибок~Тестирование~не указывает^конкретное^местонахождепие ошибки, иго осуществ­ляется при отладке. При тестировании программы мы анализи­руем взаимосвязь между входными и выходными значениями. При отладке программы мы также заинтересованы в подобной взаимосвязи, однако при этом также обращаем свое внимание на промежуточные результаты вычислений.

Успех тестирования заключается в выборе подходящего на­бора проверочных данных. Как уже говорилось, исчерпывающее тестирование для большинства программ осуществить невозможно. Например, если программа принимает на входе три целых числа, каждое из которых может изменяться в диапазоне от 1 до 1000, то полная проверка потребует выполнения программы миллион раз. Если каждый прогон программы занимает по времени одну секунду, то на полную проверку потребуется немногим более 31 года.

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

.четными. В этом случае достаточно будет проверки этой про-раммы с каким-либо четным числом, каким-либо нечетным, а »кже с нулем.

M.I. Тестирование методом черного ящика

Тестовые значения выбираются с учетом спецификации и са-^мой реализации программы. При тестировании методом черного 'ящика мы выбираем проверочные да^ные^^сходя^из одлои^спе->.дификации, и не учитываем внутреннюю^структуру 'программы.' 1Т1кой подход р^аспространён во многих инженёрных"дйсципли-нах и имеет ряд существенных преимуществ. Основным преиму­ществом является то, что процедура тестирования не находится в прямой зависимости от проверяемой компоненты. Например, предположим, что автор программы сделал ошибочное предполо­жение о том, что для некоторого класса входных значений про­грамма использоваться не будет. Исходя из этого, он не включил в программу анализ подобной ситуации. Если данные для проверки были подобраны на основании анализа программы, то вследствие этого неверного предположения проверяющий мог быть легко введен в заблуждение. Вторым преимуществом тестирования та­кого рода является независимость его по отношению к измене­ниям в реализации. Проверочные данные не требуется изменять даже в том случае, если в программе были произведены значи­тельные изменения. Наконец, преимуществом является также и то, что результаты тестирования могут быть проанализированы людьми, незнакомыми с внутренней структурой проверяемой про­граммы.

Пути тестирования „спецификации. Хорошим способом реа­лизации тестирования методом черного ящика является тестиро­вание, основанное на анализе различных частей спецификации. Такими частями могут быть предложения requires и effects. Рас­смотрим пример тестирования на основе анализа предложения requires. Пусть имеется следующая спецификация:

sqrt = proc (х: real, epsilon: real) returns (ans: real) ; requires х^з 0 & (.00001 < epsilon < .001) effects (х — epsilon ^ ans * ans ^ x + epsilon)

В приведенной спецификации предложение requires представляет собой конъюнкцию двух термов:

1. х>0

2. (.00001 < epsilon < .001).

Для выделения условий, при которых предложение requires будет удовлетворено, мы должны проверить парные комбинации путей, при которых должно удовлетворяться каждое из условий. Поскольку первое условие есть дизъюнкция двух примитивных

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