курсовая работа. Учебное пособие по дисциплине технология разработки программного обеспечения специальность Программирование в компьютерных системах
Скачать 7.57 Mb.
|
Глава 13. Структурное тестирование ПО 1.Основные понятия и принципы тестирования ПО Тестирование – процесс выполнения программы с целью обнаружения ошибок. Шаги процесса задаются тестами. Каждый тест определяет: свой набор исходных данных и условий для запуска программы; набор ожидаемых результатов работы программы. Другое название теста – тестовый вариант. Полную проверку программы гарантирует исчерпывающее тестирование. Оно требует проверить все наборы исходных данных, все варианты их обработки и включает большое количество тестовых вариантов. Исчерпывающее тестирование во многих случаях остается только мечтой – срабатывают ресурсные ограничения (прежде всего, ограничения по времени). Хорошим считают тестовый вариант с высокой вероятностью обнаружения еще не раскрытой ошибки. Успешным называют тест, который обнаруживает до сих пор не раскрытую ошибку. Целью проектирования тестовых вариантов является систематическое обнаружение различных классов ошибок при минимальных затратах времени и стоимости. Тестирование обеспечивает: обнаружение ошибок; демонстрацию соответствия функций программы ее назначению; демонстрацию реализации требований к характеристикам программы; отображение надежности как индикатора качества программы. Тестирование не может показать отсутствия дефектов (оно может показывать только присутствие дефектов). Важно помнить это (скорее печальное) утверждение при проведении тестирования. Рассмотрим информационные потоки процесса тестирования. Они показаны на рис. 1. Рис. 1. Информационные потоки процесса тестирования На входе процесса тестирования три потока: текст программы; исходные данные для запуска программы; ожидаемые результаты. Выполняются тесты, все полученные результаты оцениваются. Это значит, что реальные результаты тестов сравниваются с ожидаемыми результатами. Когда обнаруживается несовпадение, фиксируется ошибка – начинается отладка. Процесс отладки непредсказуем по времени. На поиск места дефекта и исправления может потребоваться час, день, месяц. Неопределенность в отладке приводит к большим трудностям в планировании действий. После сбора и оценивания результатов тестирования начинается отображение качества и надежности ПО. Если регулярно встречаются серьезные ошибки, требующие проектных изменений, то качество и надежность ПО подозрительны, констатируется необходимость усиления тестирования. С другой стороны, если функции ПО реализованы правильно, а обнаруженные ошибки легко исправляются, может быть сделан один из двух выводов: качество и надежность ПО удовлетворительны; тесты не способны обнаруживать серьезные ошибки. В конечном счете, если тесты не обнаруживают ошибок, появляется сомнение в том, что тестовые варианты достаточно продуманны и что в ПО нет скрытых ошибок. Такие ошибки будут, в конечном итоге, обнаруживаться пользователями и корректироваться разработчиком на этапе сопровождения (когда стоимость исправления возрастает в 60 – 100 раз по сравнению с этапом разработки). Результаты, накопленные в ходе тестирования, могут оцениваться и более формальным способом. Для этого используют модели надежности ПО, выполняющие прогноз надежности по реальным данным об интенсивности ошибок. Существуют 2 принципа тестирования программы: функциональное тестирование (тестирование «черного ящика»); структурное тестирование (тестирование «белого ящика»). 2.Тестирование «черного ящика» Известны: функции программы. Исследуется: работа каждой функции на всей области определения. Как показано на рис. 2, основное место приложения тестов «черного ящика» - интерфейс ПО. Рис. 2. Тестирование «черного ящика» Эти тесты демонстрируют: как выполняются функции программ; как принимаются исходные данные; как вырабатываются результаты; как сохраняется целостность внешней информации. При тестировании «черного ящика» рассматриваются системные характеристики программ, игнорируется их внутренняя логическая структура. Исчерпывающее тестирование, как правило, невозможно. Например, если в программе 10 входных величин и каждая принимает по 10 значений, то потребуется 10 тестовых вариантов. Отметим также, что тестирование «черного ящика» не реагирует на многие особенности программных ошибок. 3.Тестирование «белого ящика» Известна: внутренняя структура программы. Исследуются: внутренние элементы программы и связи между ними (рис. 3). Объектом тестирования здесь является не внешнее, а внутреннее поведение программы. Проверяется корректность построения всех элементов программы и правильность их взаимодействия друг с другом. Обычно анализируются управляющие связи элементов, реже – информационные связи. Тестирование по принципу «белого ящика» характеризуется степенью, в какой тесты выполняют или покрывают логику (исходный текст) программы. Исчерпывающее тестирование также затруднительно. Рис. 3. Тестирование «белого ящика» Обычно тестирование «белого ящика» основано на анализе управляющей структуры программы. Программа считается полностью проверенной, если проведено исчерпывающее тестирование маршрутов (путей) ее графа управления. В этом случае формируются тестовые варианты, в которых: гарантируется проверка всех независимых маршрутов программы; проходятся ветви True, False для всех логических решений; выполняются все циклы (в пределах их границ и диапазонов); анализируется правильность внутренних структур данных. Недостатки тестирования «белого ящика»: Количество независимых маршрутов может быть очень велико. Например, если цикл в программе выполняется раз, а внутри цикла имеется ветвлений, то количество маршрутов вычисляется по формуле При n = 5 и k= 20 количество маршрутов m = 10 . Примем, что на разработку, выполнение и оценку теста по одному маршруту расходуется 1 мс. Тогда при работе 24 часа в сутки 365 дней в году на тестирование уйдет 3170 лет. Исчерпывающее тестирование маршрутов не гарантирует соответствия программы исходным требованиям к ней. В программе могут быть пропущены некоторые маршруты. нельзя обнаружить ошибки, появления которых зависит от обрабатываемых данных (это ошибки, обусловленные выражениями типа if abs (a-b) < eps…, if (a+b+c)/3=a…). Достоинства тестирования «белого ящика» связаны с тем, что принцип «белого ящика» позволяет учесть особенности программных ошибок: Количество ошибок минимально в «центре» и максимально на «периферии» программы. Предварительные предположения о вероятности потока управления или данных в программе часто бывают некорректны. В результате типовым может стать маршрут, модель вычислений по которому проработана слабо. При записи алгоритма ПО в виде текста на языке программирования возможно внесение типовых ошибок трансляции (синтаксических и семантических). Некоторые результаты в программе зависят не от исходных данных, а от внутренних состояний программы. Каждая из этих причин является аргументом для проведения тестирования по принципу «белого ящика». Тесты «черного ящика» не смогут реагировать на ошибки таких типов. Способ тестирования базового пути Тестирование базового пути – это способ, который основан на принципе «белого ящика». Автор этого способа – Том МакКейб. Способ тестирования базового пути дает возможность: получить оценку комплексной сложности программы; использовать эту оценку для определения необходимого количества тестовых вариантов. Тестовые варианты разрабатываются для проверки базового множества путей (маршрутов) в программе. Они гарантируют однократное выполнение каждого оператора программы при тестировании. Цикломатическая сложность Цикломатическая сложность – метрика ПО, которая обеспечивает количественную оценку логической сложности программы. В способе тестирования базового пути цикломатическая сложность определяет: количество независимых путей в базовом множестве программы; верхнюю оценку количества тестов, которое гарантирует однократное выполнение всех операторов. Независимым называется любой путь, который вводит новый оператор обработки или новое условие. Путь начинается в начальном узле, а заканчивается в конечном узле графа. Независимые пути формируются в порядке от самого короткого к самому длинному. Все независимые пути графа образуют базовое множество. Свойство базового множества: тесты, обеспечивающие его проверку, гарантируют: однократное выполнение каждого оператора; выполнение каждого условия по True-ветви и по False-ветви. мощность базового множества равна цикломатической сложности потокового графа. Значение 2-го свойства трудно переоценивать – оно дает априорную оценку количества независимых путей, которое имеет смысл искать в графе. Цикломатическая сложность определяется по формуле : где Е – количество дуг, N - количество узлов потокового графа; Способы тестирования условий Цель этого семейства способов тестирования – строить тестовые варианты для проверки логических условий программы. При этом желательно обеспечить охват операторов из всех ветвей программы. Рассмотрим используемую здесь терминологию. Простое условие – булева переменная или выражение отношения. Выражение отношения имеет вид Е1 <оператор отношения> Е2, где Е1, Е2 – арифметические выражения, а в качестве оператора отношения используется один из следующих операторов: Составное условие состоит из нескольких простых условий, булевых операторов и круглых скобок. Будем применять булевы операторы OR, AND (&), NOT. Условия, не содержащие выражений отношения, называют булевыми выражениями. Таким образом, элементами условия являются: булев оператор, булева переменная, пара скобок (заключающая простое или составное условие), оператор отношения, арифметическое выражение. Эти элементы определяют типы ошибок в условиях. Если условие некорректно, то некорректен по меньшей мере один из элементов условия. Следовательно, в условии возможны следующие типы ошибок: ошибка булева оператора (наличие некорректных / отсутствующих / избыточных булевых операторов); ошибка булевой переменной; ошибка булевой скобки; ошибка оператора отношения; ошибка арифметического выражения. Способ тестирования условий ориентирован на тестирование каждого условия в программе. Методики тестирования условий имеют два достоинства. Во-первых, достаточно просто выполнить измерение тестового покрытия условия. Во-вторых, тестовое покрытие условий в программе – это фундамент для генерации дополнительных тестов программы. Целью тестирования условий является определение не только ошибок в условиях, но и других ошибок в программах. Если набор тестов для программы А эффективен для обнаружения ошибок в условиях, содержащихся в А, то вероятно, что этот набор также эффективен для обнаружения других ошибок в А. Кроме того, если методика тестирования эффективна для обнаружения ошибок в условии, то вероятно, что эта методика будет эффективна для обнаружения ошибок в программе. Существует несколько методик тестирования условий. 1.Простейшая методика – тестирование ветвей. Здесь для составного условия С проверяется: каждое простое условие (входящее в него); True-ветвь; False-ветвь. 2.Другая методика – тестирование области определения. В ней для выражения отношения требуется генерация 3-4 тестов. Выражение вида Е1 <оператор отношения> Е2, Проверяется тремя тестами, которые формируют значение Е1 большим, чем Е2, равным Е2 и меньшим, чем Е2. Если оператор отношения неправилен, а Е1 и Е2 корректны, то эти три теста гарантируют обнаружение ошибки оператора отношения. Для определения ошибок в Е1 и Е2 тест должен сформировать значение Е1 большим или меньшим, чем Е2, причем обеспечить как можно меньшую разницу между этими значениями. Для булевых выражений с n переменными требуется набор из тестов. Этот набор позволяет обнаружить ошибки булевых операторов, переменных и скобок, но практичен только при малом n. Впрочем, если в булево выражение каждая булева переменная входит только один раз, то количество тестов легко уменьшается. Обсудим способ тестирования условий, базирующийся на приведенных выше методиках. Тестирование циклов Цикл – наиболее распространенная конструкция алгоритмов, реализуемых в ПО. Тестирование циклов производится по принципу «белого ящика», при проверке циклов основное внимание обращается на правильность конструкций циклов. Различают 4 типа циклов: простые, вложенные, объединенные, неструктурированные. Простые циклы Объединенные циклы Вложенные циклы Неструктурированные циклы Простые циклы Для проверки простых циклов с количеством повторений n может использоваться один из следующих наборов тестов: прогон всего цикла; только один проход цикла; два прохода цикла; m проходов цикла, где m < n; n – 1, n, n + 1проходов цикла. Вложенные циклы С увеличением уровня вложенности циклов количество возможных путей резко возрастает. Это приводит к нереализуемому количеству тестов. Для сокращения количества тестов применяется специальная методика, в которой используются такие понятия, как объемлющий и вложенные циклы (рис. 11). Рис. 11. Объемлющий и вложенный циклы Порядок тестирования вложенных циклов иллюстрирует рис.12. Рис.12. Шаги тестирования вложенных циклов Шаги тестирования. Выбираем самый внутренний цикл. Устанавливаются минимальные значения параметров всех остальных циклов. Для внутреннего цикла проводятся тесты простого цикла. Добавляются тесты для исключительных значений и значений, выходящих за пределы рабочего диапазона. Переходят в следующий по порядку объемлющий цикл. Выполняют его тестирование. При этом сохраняются минимальные значения параметров для всех внешних (объемлющих) циклов и типовые значения для всех вложенных циклов. Работа продолжается до тех пор, пока не будет протестированы все циклы. Объединенные циклы Если каждый из циклов независим от других, то используется техника тестирования простых циклов. При наличии зависимости (например, конечное значение счетчика первого цикла используется как начальное значение счетчика второго цикла) используется методика для вложенных циклов. Неструктурированные циклы Неструктурированные циклы тестированию не подлежат. Этот тип циклов должен быть переделан с помощью структурированных программных конструкций. Контрольные вопросы Определите понятие тестирования. Что такое тест? Что такое исчерпывающее тестирование? Какие задачи решает тестирование? Каких задач не решает тестирование? Какие принципы тестирования вы знаете? В чем их отличие? В чем состоит суть тестирования «черного ящика»? В чем состоит суть тестирования «белого ящика»? В чем достоинства и недостатки каждого из принципов тестирования? Поясните понятие базового пути. Какие способы вычисления цикломатической сложности вы знаете? Поясните особенности тестирования циклов. Каковы шаги тестирования вложенных циклов? |