№37 (Надежность программного обеспечения) (1006294), страница 3
Текст из файла (страница 3)
Символические выражения путей программы могут быть получены либо прямой подстановкой, либо обратной подстановкой. Прямая подстановка соответствует действиям, проделываемым при реализации определенного пути в структуре программы. При прямой подстановке символическое исполнение осуществляемся для каждого исполняемого оператора с запоминанием промежуточных символических выражений переменных. В случае обратной подстановки ограничения на входные переменные строятся «снизу вверх» при прохождении пути на графе программы в обратном направлении. В результате получаются такие же ограничения, как и при прямой подстановке. Однако при обратной подстановке не понадобится память для запоминании символических записей переменных. Зато при прямой подстановке имеется возможность раннего обнаружения неосуществимых путей с противоречивыми ограничениями на исходные данные.
При символическом тестировании определенную трудность представляют циклические участки программы, поскольку в данном случае число итераций неизвестно.
Наиболее просто проблема может быть преодолена подстановкой некоторого заранее оцененного числа итераций. Однако при этом полученные ограничении могут оказаться не точными. Второе затруднение связано с наличием в программе модулей. Последнее преодолевается с символическим исполнением модулей, встречающихся на данном пути. Третье затруднение связано с символическим выполнением массивов данных. Дело в том, что в некоторых случаях значение переменного устанавливается только в ходе исполнения программы. Это затруднение может быть преодолено введением дополнительных (гипотетических) ограничений, соответствующих различным возможным случаям.
Генерирование структурных тестов. Названных выше недостатков лишено структурное тестирование программ на конкретных числовых исходных данных.
Генерирование тестов заключается в выборе: множества путей, полностью покрывающих граф программы, и в определении тестовых данных, на которых эти пути выполняются.
Граф программы (граф управления) — структурная модель программы, показывающая связь между ее элементами. Вершины графа изображают операторы разветвления и объединения, а дуги — операторы обработки и передачи данных. Граф представляется в виде упакованной матрицы смежности (УМС). Упакованная матрица смежности
графа с v вершинами —это
матрица (l — максимальная степень выхода i-й вершины). Степень входа dвх(vi) и выхода dвых(vi) некоторой вершины графа означает соответственно количество входящих и выходящих из вершин дуг. Каждая строка i УМС заполняется в произвольном порядке номерами вершин, которые являются смежными с вершиной i.
Представление графов в виде УМС имеет следующие преимущества по сравнению с другими существующими представлениями:
для больших графов число столбцов УМС значительно меньше, чем число столбцов соответствующей матрицы смежности;
относительно просто моделируется процесс движения по графу для построения путей;
уменьшается время обработки графов.
За критерий тестирования взят критерий ветвей, где под ветвью программы понимается некоторая последовательность операторов, выполняемых строго один за другим. Таким образом, ветвь — линейный участок программы. Для построения минимального покрытия граф разбивается па DD-пути с использованием УМС исходного графа. Множество вершин, у которых степень выхода dвых(vi)>1 , входная и выходная вершины обозначаются как D-вершины. Тогда DD-путь— простой путь между двумя D-вершинами, такой, что в его пределах нет D-вершин. Затем определяются циклы и петли и исключаются замыкающие их дуги.
Предлагаемый алгоритм построения минимального покрытия (МПОК) графа состоит из следующих этапов,
Этап 1. Просматривается i-я вершина и определяется смежная вершина j, номер которой
является максимальным среди номеров смежных вершин, где i
{1, N-1;} N - количество
вершин графа.
Этап 2. Просматривается дуга (vi, vj). Если dвых(
)>1 и dвх(
)>1, го дуга g(vi, vj) исключается.
Если dвых(
)>1 и dвх(
)=1,то дуга h(vi, vj) отмечается/
Этап 3. Если dвых(
)=1 и dвх(
)>1 и если на пути не имеется дуги типа g, то исключаются
рассматриваемая дуга и дуга типа h. отмеченная в этапе 2.
Этап 4. Подставляется i = j и повторяются этапы I—3 до тех пор, пока j не приравнивается
номеру конечной (выходной) вершины. Зафиксируется путь в виде последовательности
значений j.
Этап 5. Повторяются этапы 1—4 до тех пор, пока в построенном пути не останется дуг типа g и
h..
В общем случае множества тестов, приводящие к исполнению всех операторов и всех разветвлений в программе, являются не обязательно достаточными с точки зрении проверки всех функций, выполняемых программой. Однако тестирование всех путей в структуре программы нецелесообразно или даже невозможно из-за их большого количества. Компромиссным решением будет тестирование выборки путей, обеспечивающей испытание важнейших взаимодействий между частями программы. На графе, описывающем программу, такие взаимодействия могут быть моделированы введением пар вершин, которые должны взаимодействовать по крайней мере при одном тесте.
Таким образом, построение покрытия не всегда целесообразно полностью формализовать. В отдельных случаях необходимо учесть соображения содержательного характера, вытекающие из назначения программы и из требований к программе.
ФУНКЦИОНАЛЬНЫЕ МЕТОДЫ ТЕСТИРОВАНИЯ ПРОГРАММ
Основное требование к любой программе или программной системе сводится к тому, что программа должна выполнить заданные функции. Поэтому естественно подходить к определению безошибочности программы с точки зрения соответствия этой программы заданию, спецификации или эталону. При этом возникают проблемы — 1) выбор тестов и 2) оценка правильности результата прохождения каждого теста.
В случае структурного тестирования тесты выбираются исходя из требования тестировать все элементы структуры программы, а контрольные значения для оценки правильности прохождения теста могут быть ввиду их относительно небольшого количества легко рассчитаны вручную. Однако построение системы тестов структурным тестированием наталкивается на трудности, если тестируемая программа имеет сложную структуру. Дело в том, что для построения тестов необходимо исходить из структуры программы.
Установление фактической структуры большой программы путем анализа ее текста на ЭВМ требует значительного машинного времени. При этом нет никакой гарантии того, что фактическая структура программы соответствует требуемой и что имеющие места различия удастся установить. Также нет уверенности в том, что (однократная) проверка каждого элемента структуры программы обеспечивает достаточную степень безошибочности программы. Поэтому наряду со структурным тестированием нашло развитие функциональное тестирование, основанное па непосредственной проверке соответствия выполняемых программой функций поставленным требованиям. Вопрос о выборе тестов при этом может быть решен различными путями. Одна возможность — выбор тестов по содержательному принципу. Вторая возможность — стохастический выбор тестов.
При выборе тестов по содержательному признаку необходимо исходить из конкретной задачи и какие-либо общие рекомендации здесь вряд ли возможны.
При стохастическом выборе тестов (стохастическое тестирование) требуется, чтобы тесты в статистическом смысле соответствовали решаемым задачам. В таком случае возможна количественная оценка вероятности того, что в тестируемой программе нет ошибок. Появляется также возможность обосновать количество необходимых тестов. Кроме того, упрощается процедура генерирования тестов.
Основой стохастического тестирования должна являться адекватность тестовых и эксплуатационных входных наборов по статистическим критериям.
Если входы тестируемой программы имеют непрерывный характер, то нужно требовать, чтобы (многомерная) функция плотности распределения входов при тестировании программы совпала с функцией плотности распределения входов, возникающей при эксплуатации программы. Практически достаточно, если требовать совпадения моментов первого, второго, а иногда и третьего-четвертого порядков этих распределений.
Если входы тестируемой программы имеют дискретный характер, необходимо, чтобы не только безусловные, но и условные вероятности возникновения отдельных дискретных значений входов для тестовых и для эксплуатационных наборов совпали. Оценка через моменты, так же как и в случае непрерывных распределений, имеет приближенный характер. Практически у большинства программ есть как непрерывные, так и дискретные входы.
Так как статистические моменты распределения определимы как для непрерывных, так и для дискретных случайных величин, то такие смешанные дискретно-непрерывные наборы целесообразно генерировать по критерию совпадения моментов.
Д
опустим, что в ходе статистических исследований потоков данных, поступающих на входы тестируемой программы, были установлены оценки математического ожидания i-й переменной:
оценки центрального момента к-го порядка для i-й переменой
оценки
корреляционного момента между i-й и j-й переменой
где
- измеренное значение i-й переменной в v-м эксперименте; п — число экспериментов; r — число переменных.















