Файл: Отладка и тестирование программ: основные подходы и ограничения (Тестирование программ)..pdf

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 16.06.2023

Просмотров: 282

Скачиваний: 2

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Последнее утверждение имеет два слабых пункта: во-первых, число не повторяющих друг друга маршрутов — астрономическое; во-вторых, даже если каждый маршрут может быть проверен, сама программа может содержать ошибки (например, некоторые маршруты пропущены).

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

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

1.3 Сравнение методов тестирования

  • Восходящее тестирование.

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

При восходящем тестировании для каждого модуля необходим драйвер: нужно подавать тесты в соответствии с сопряжением тестируемого модуля. Одно из возможных решений — создать для каждого модуля небольшую ведущую программу. Тестовые данные представляются как “встроенные” непосредственно в эту программу переменные и структуры данных, и она многократно вызывает тестируемый модуль, с каждым вызовом передавая ему новые тестовые данные. Имеется и лучшее решение: воспользоваться программой тестирования модулей — это инструмент тестирования, позволяющий описывать тесты на специальном языке и избавляющий от необходимости писать драйверы.


  • Нисходящее тестирование.

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

  • Модифицированный нисходящий метод.

Этот метод имеет еще один существенный недостаток, касающийся полноты тестирования. Предположим, что есть большая программа и где-то ближе к нижнему ее уровню находится модуль, созданный для вычисления корней квадратного уравнения. Для заданных входных переменных А, В и С он решает уравнение AX2+BX+C=0 .

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

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


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

  • Метод большого скачка.

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

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

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

  • Метод сандвича.

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

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

Применение метода сандвича - это разумный подход к интеграции крупных программ, таких, как операционная система или пакет прикладных программ.

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

  • Модифицированный метод сандвича.

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


Рассмотрим с позиций надежности программного обеспечении стратегии тестирования и сравним их по семи критериям (табл.1 ).

Таблица 1

Качественная оценка подхода к сборке

метод

восходящий

нисходящий

модифицированный нисходящий

метод большого скачка

метод сандвича

модифицированный метод сандвича

сборка

рано

рано

рано

поздно

рано

рано

время до появления работающего варианта программы

поздно

рано

рано

поздно

рано

рано

нужны ли драйверы или готовые инструменты

да

нет

да

да

частично

да

нужны ли заглушки

нет

да

да

да

частично

частично

параллелизм в начале работы

средний

слабый

средний

высокий

средний

высокий

возможность тестировать отдельные пути

легко

трудно

легко

трудно

средне

легко

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

легко

трудно

трудно

легко

трудно

трудно

Итак. Первый критерий - время до момента сборки модулей, - это является важным при обнаружении ошибок в сопряжениях и предположениях модулей о свойствах друг друга.

Второй критерий - время до момента создания первых работающих «скелетных» версий программы, поскольку здесь могут проявиться главные дефекты проектирования.

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

Пятый критерий - мера параллелизма, который возможен в начале или на ранних стадиях тестирования (но не концу цикла тестирования).

Шестой критерий связан с ответом на вопрос: возможно ли проверить любой конкретный путь и любое условие в программе?

Седьмой критерий характеризует сложность планирования, надзора и управления в процессе тестирования.

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


Ранняя сборка и раннее получение работающего каркаса программы, а также возможность тестировать любые конкретные условия, представляются наиболее важными, им дается вес 3.

Сложность подготовки заглушек, планирования и управления последовательностью тестов также важны, они получают вес 2.

Третий критерий, необходимость драйверов - вес 1 ввиду доступности общих инструментов тестирования.

Критерий, связанный с параллелизмом работы, имеет вес 1 (он может быть важен по другим причинам, но на надежность сильно не влияет).

Шестой критерий - вес 3.

Седьмой критерий получает вес 2.

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

Таблица 2

Взвешенная оценка подхода к сборке

метод

восходящий

нисходящий

модифицированный нисходящий

метод большого скачка

метод сандвича

модифицированный метод сандвича

сборка

рано+

рано+

рано+

поздно-

рано+

рано+

время до появления работающего варианта программы

поздно-

рано+

рано+

поздно-

рано+

рано+

нужны ли драйверы или готовые инструменты

да-

нет+

да-

да-

частично

да-

нужны ли заглушки

нет+

да-

да-

да-

частично

частично

параллелизм в начале работы

средний

слабый-

средний

высокий+

средний

высокий+

возможность тестировать отдельные пути

легко+

трудно-

легко+

трудно-

средне

легко-

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

легко+

трудно-

трудно-

легко+

трудно-

трудно-