- •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
184 Глава 9
ирование и отладка
всячески избегать. Они более склонны к ошибкам, чем автоматизированные драйверы и заглушки, затрудняют создание хорошего набора тестировочных данных, а также усложняют воспроизводимость тестов. Воспроизводимость тестов является особенно важной. Рассмотрим одну из типичных ситуаций, возникающих при тестировании.
1. Программа проверяется для входных значений с 1 до п и при этом ошибок не обнаруживается.
2. Тестирование программы с п + 1 значением приводит к обнаружению ошибки.
3. Отладка позволяет внести исправления, после которых программа работает с п + 1 значением правильно.
4. Тестирование продолжается со значения п + 2. Такая последовательность довольно неразумна, поскольку существует немалая вероятность того, что внесенные в программу изменения, заставившие работать ее правильно со значением п + 1, могут в то же время привести к ошибочным результатам для значений с 1 по п. При внесении любых, даже небольших изменений необходимо убедиться в том, что программа по-прежнему правильно выполняет выполнявшиеся ранее тесты. Такой метод называется регрессивным тестированием. Регрессивное тестирование удобно только в тех случаях, когда имеются средства, позволяющие без больших затрат перезапустить старые тесты.
Драйверы и заглушки должны создаваться с большой осторожностью. Все возможные ошибки хотелось бы приписать тестируемой программе. Однако при неаккуратном написании драйверов и заглушек они могут внести и свои собственные ошибки. В этом случае программист может тратить на тестирование и отладку тестировочных программ массу времени.
9.4. Отладка
Тестирование позволяет нам устаноаить наличие ошибки в программе, однако знание симптома еще далеко от установления действительной причины. С того момента, как нам становится известным наличие ошибки, особую важность в процессе отладки приобретает тактика ее локализации и устранения. Отличия в степени эффективности отладки программ различными людьми слишком велики для того, чтобы мы могли предложить некоторый магический способ, облегчающий этот процесс. Большая часть того, что мы могли бы сказать по этому поводу, опирается на обычный здравый смысл.
Отладка представляет собой процесс понимания и исправления ошибок. При отладке мы стараемся локализовать проблему, проводя различные простые проверки, регистрирующие ошибку, и, просматривая промежуточные значения, выделить часть про-
_ммы, содержащую ошибку. По мере сбора фактов, подтвер-ающих наличие ошибки, формулируется гипотеза и делается пытка подтвердить ее дальнейшим тестированием. Когда нам кется, что причина ошибки установлена, мы просматриваем утветствующий кусок программы, желая найти ошибку и ис-равить ее. В гл. II рассматриваются способы анализа программ, ^легчающие данный процесс.
Ошибки обязаны своим существованием самому программисту. сегда имейте в виду, что отладка отнимает гораздо больше вре-ени, чем программирование. Задача написания изначально эрректной программы вполне оправданна. Поэтому перед запуском программы внимательно просмотрите ее текст и .убедитесь 1 том, что вы хорошо понимаете те действия, которые данная Программа должна выполнять. Независимо от ваших способно-п-ей и усилий вероятность того, что программа сразу же станет работать правильно, достаточно мала. По этой причине вы должны вроектировать, записывать и документировать ваши программы Ьтаким образом, чтобы максимально облегчить процесс тестиро-1вания и отладки. Одним из способов является создание относи-1тельно небольших модулей, которые могут быть проверены неза-1висимо от оставшейся части программы. В большой степени это ряожет быть достигнуто в том случае, если вы будете придержи-1ваться рассмотренных ранее соображений. Создавайте структуры ^данных и связывайте с каждой из них инвариант представления 1с максимальными ограничениями. Для каждой из процедур при-г водите связные и понятные спецификации. В этом случае к мо-1рменту их тестирования вы будете четко знать, каковы должны быть ^входные значения и какой результат должен быть получен в от-lbct на каждое возможное входное значение. 1~ Помимо общей стратегии тестирования необходим также тща-
•_ тельно разработанный план поэтапной отладки. Перед началом
работы 'примите окончательное решение о том, что вы хотите сде-глать и как вы собираетесь это осуществить. Вы должны знать, f каковы должны быть исходные данные и какой результат вы собираетесь получить. Если вы не обдумали вопрос о входных данных достаточно тщательно, то весьма вероятно, что вы потратите массу времени на бесполезную работу.
Неплохую схему отладки предлагает так называемый научный подход. Сущность его заключается в следующем.
-. 1. Начинайте с изучения уже доступных данных.
• ' 2. Сформулируйте гипотезу, которая корректна для таких .Данных.
3. Проведите несколько раз эксперимент, который в состоянии подтвердить гипотезу.
. Рассмотрим программу, принимающую на входе положитель-:ное целое число и возвращающую значение true, если число
