Тестирование и отладка
Тестирование. Именно тестирование, а не отладка является центральным моментом заключительной стадии разработки программы. Цель тестирования — убедиться в том что программа функционирует как следует, что она соответствует спецификациям и что она решает реальную задачу. Это — бескомпромиссная цель и, кроме того, очень важная, а насколько она реальна, по крайней мере в принципе, можно решить лишь тогда, когда она будет достигнута. Цель отладки — устранить ошибки в программе, и здесь не обязательно добиваться такого же результата, как при тестировании.
При тестировании выявляются ошибки, которые должны быть исправлены. При отладке же на любой стадии некоторые части программы могут остаться не оттестированными, поскольку рассматриваются только те ошибки, которые проявляются, а остальные так и остаются не затронутыми. Кроме того, поскольку процесс обнаружения ошибок подчиняется закону насыщения, имеет смысл прекратить поиск, когда остается лишь относительно небольшое число ошибок И усилия, направленные на дальнейший поиск, не оправданны. Однако этот момент трудно определить, и программа будет правильно работать не при всех условиях.
В идеальном случае программа должна быть оттестирована для всех возможных комбинаций входных данных, а выходные данные для каждой комбинации должны сравниваться с предварительно рассчитанными правильным результатами. Однако почти для всех программ, даже для самых простых, существует бесконечное число возможных комбинаций входных данных или, по меньшей мере, это число столь велико, что его можно считать бесконечным. Рассмотрим для примера программу сложения трех чисел.
Каждое целое число может изменяться от + 00 до — 00, поэтому число различных комбинаций входных данных бесконечно. Даже если заключить целые числа в разумные пределы, скажем, ± 8Х106, то по-прежнему существует так много комбинаций, что их невозможно проверить вручную. Скептически настроенный читателям мы предлагаем произвести эти вычисления самим К счастью, внутренние операции вычислительной системы можно рассматривать обобщенно: если они работают с одним набором операндов, то они будут работать, в определенных пределах, для любого аналогичного набора операндов.
Менее удачно, что такое же утверждение неверно для программ или частей программ, в которые содержатся условные переходы. Тестирование поэтому должно быть сосредоточено на проверке небольших отдельных фрагментов программы, которые обладают указанными свойствами. Тогда можно будет сделать вывод о том, что если эти небольшие фрагменты правильно работают для одного набора входных данных, то они будут правильно работать и для всех остальных наборов. Главное заключается в том, чтобы определить, достаточно ли прост выбранный фрагмент программы, чтобы его можно было проверить описанным способом.
Это требование выполняется путем определения, по какой ветви пойдет выполнение программы, т. е. определения последовательности команд, которые должны быть выполнены для данного набора входных данных. Если они работают правильно, то для всех остальных наборов входных данных, обработка которых пойдет по той же ветви, также будут получены правильные результаты. Поскольку в большинстве программ содержатся условные переходы, будет существовать множество альтернативных ветвей по различным фрагментам программы и, следовательно, очень много различных ветвей по коду. Для исчерпывающего тестирования или проверки программы требуется проверка каждой из этих ветвей.

