Надежность информационных систем 115
совсем исключить такую возможность, лучше разрабатывать самопроверя-
ющиеся тесты, либо пользоваться инструментами тестирования, способными
автоматически сверять ожидаемые и фактические результаты.
Хотя эта аксиома чрезвычайно важна, иногда, например при тестирова-
нии математического программного обеспечения, приходится допускать ис-
ключения. Математическое программное обеспечение обладает тем свойством,
что выходные данные являются только приближением правильного результа-
та. Это происходит из-за использования конечных вычислительных процес-
сов вместо бесконечных математических процессов, из-за ошибок округления,
связанных с конечной точностью машинной арифметики и неточного пред-
ставления чисел в двоичной машине, а также ошибок из-за конечной точности
представления входных данных и констант. Поэтому во многих случаях ока-
зывается важной не абсолютная точность, а корреляция ошибок. Например,
когда математическая программа возвращает массив чисел, может оказать-
ся важным, чтобы вычисленное решение было точным решением для набора
входных данных, аппроксимирующего реальные входные данные. Поэтому
при тестировании математического программного обеспечения прогнозиро-
вание точных выходных данных затруднительно.
Следует Избегть невоспроизводимых тестов
, не тестировать их “с ле-
ту”. Использование диалоговых систем иногда мешает хорошему тестирова-
нию. Для того чтобы тестировать программу в пакетной системе, програм-
мист обычно должен оформить тест в виде специальной ведущей программы
или в виде файла тестовых данных. В условиях диалога программист слиш-
ком часто выполняет тестирование “с лету”, т. е., сидя за терминалом, задает
конкретные значения и выполняет программу, чтобы “посмотреть, что по-
лучится”. Это — неряшливая и по многим причинам нежелательная форма
тестирования. Основной ее недостаток в том, что такие тесты мимолетны;
они исчезают по окончании их выполнения. Всякий раз, когда программу по-
надобится тестировать повторно (например, после исправления ошибок или
после модификации), придется придумывать тесты заново.
Тестирование обходится слишком дорого и без этих дополнительных рас-
ходов. Никогда не используйте тестов, которые тут же выбрасываются (если
только программа не такова, что ее саму тут же надо выбросить). Более того,
тесты следует документировать и хранить в такой форме, чтобы каждый мог
использовать их повторно.
Готовьте тесты как для правильных, так и для неправильных входных
данных. Многие программисты ориентируются в своих тестах на “разумные”
условия на входе, забывая о последствиях появления непредусмотренных или
ошибочных входных данных. Однако многие ошибки, которые потом неожи-