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