Шаг 7.
Метод контрольных тестов

    На этом шаге мы рассмотрим использвание метода контрольных тестов.

    Как бы ни была тщательно проверена и "прокручена" программа за столом, решающим этапом, устанавливающим ее пригодность для работы, является контроль программы по результатам ее выполнения на компьютере.

    Мы рассмотрим здесь универсальный метод контроля - метод контрольных тестов (Test - испытание, проверка).

    Тестирование - это процесс исполнения программы на компьютере с целью обнаружения ошибок. Поясним это определение.

    Тестом будем называть информацию, состоящую из исходных данных, специально подобранных для отлаживаемой программы, и из соответствующих им эталонных результатов (не только окончательных, но и промежуточных), используемых в дальнейшем для контроля правильности работы программы.

    Если поставить целью демонстрацию отсутствия ошибок, то мы подсознательно будем стремиться к этой цели, выбирая тестовые данные, на которых вероятность появления ошибки мала. В то же время, если нашей задачей станет обнаружение ошибок, то создаваемый нами тест будет обладать большей вероятностью обнаружения ошибки. Такой подход заметнее повысит качество программы.

    Тестирование - процесс деструктивный (то есть обратный созидательному, конструктивному). Именно этим и объясняется, почему многие считают его трудным. Большинство людей склонно к конструктивному процессу созидания объектов и в меньшей степени - к деструктивному процессу разделения на части. Для усиления определения тестирования проанализируем два понятия - "удачный" и "неудачный". Большинство назовет тестовый прогон неудачным, если обнаружена ошибка и, наоборот, удачным, если он прошел без ошибок. Из определения тестирования следует противоположное:


    Вопрос о позиции программиста по отношению к продукту его труда связан, как это показано Вейнбергом, с принципами безличного программирования и когнитивного диссонанса.

    Когнитивный диссонанс - это психологический принцип, который руководит действиями человека, чьи представления о себе оказались под угрозой. Программист, искренне считающий программу продолжением своего "я", не будет пытаться найти все ошибки в ней. Напротив, он постарается показать, что программа правильна, даже если там будут находиться чудовищные для постороннего взгляда ошибки.

    Спасти в такой ситуации может безличное программирование. Вместо того, чтобы быть скрытным и защищать свою программу, программист занимает противоположную позицию: он открыто приглашает других программистов читать и конструктивно критиковать ее. Когда кто-то находит ошибку в его программе, программист, конечно, не должен радоваться, что ошибся; его позиция примерно такова: "О! Мы нашли ошибку в нашей программе! Хорошо, что мы нашли ее сейчас, а не позже! Поучимся на этой ошибке, а заодно посмотрим, не найдем ли еще!" Программист, обнаруживший ошибку в чужой программе, не кричит: "Посмотри на свою идиотскую ошибку!", а реагирует примерно так: "Как любопытно! Интересно, не сделал ли и я такой ошибки в написанном мною модуле?"

    При использовании метода тестов


    Таким образом, контроль программы сводится к тому, чтобы подобрать систему тестов, получение правильных результатов для которой гарантировало бы правильную работу программы и для остальных исходных данных из области, указанной в решаемой задаче.

    Для реализации метода контрольных тестов должны быть изготовлены или заранее известны эталонные результаты, на основании сверки с которыми получаемых тестовых результатов, можно было бы сделать вывод о правильности работы программы на данном тесте.

    Эталонные результаты для вычислительных задач можно получить, осуществляя вычисления вручную, применяя результаты, полученные ранее на другом компьютере или по другой программе, или, используя известные факты, свойства, физические законы.

    Разрабатывая систему тестов, нужно стремиться к тому, чтобы успешный пропуск ее на компьютере доказывал наличие ошибок в программе (или отдельном ее блоке), хотя для многих достаточно сложных программ, особенно если над ними работает несколько программистов, можно практически говорить лишь о большей или меньшей вероятности правильности программы. Это объясняется тем, что изготовление и пропуск всех тестов, необходимых для доказательства, может потребовать такого объема работ, который затянет этап контроля на многие месяцы или годы. Поэтому при разработке системы тестов наряду с задачей всестороннего и глубокого тестирования, стоит задача минимизации количества необходимых тестовых результатов, машинного времени и усилий программиста.

    В большинстве случаев при использовании метода контрольных тестов вопрос о доказательстве отсутствия ошибок практически можно ставить лишь для небольших блоков (модулей) программы, а для целой программы приходится ограничиваться той или иной вероятностью отсутствия ошибок в программе.

    Неоднократно экспериментально установлено, что в любой сложной программе в процессе эксплуатации обнаруживаются ошибки, даже если проведено самое тщательное тестирование. Тем самым утверждается объективная реальность, заключающаяся в невозможности формализовать и обеспечить абсолютную полноту всех эталонных значений, а также провести всеобъемлющее исчерпывающее тестирование и устранить все ошибки в сложных программах.

    Опыт показывает, что до начала тестирования число ошибок в сложных программах - порядка 1-2% от общего числа операторов в программе. Самое тщательное тестирование сложных программ позволяет получить программы с вероятностью ошибки в каждом операторе 0,0001 - 0,00001, то есть несколько ошибок может остаться.

    После завершения тестирования программы в течение нескольких лет эксплуатации могут быть выявлены еще десятки ошибок!

    На следующем шаге мы перечислим основные принципы тестирования.




Предыдущий шаг Cодержание Следующий шаг