Со времени разработки самых первых программ объемы и сложность разрабатываемых программных систем увеличились во много раз. Программное управление применяется во многих отраслях – начиная от обычных прикладных применений типа редактирования текстов до ответственных задач, например, управления ядерными реакторами, где цена ошибки может оказаться очень высокой.
Наиболее значимыми с точки зрения трудоемкости и стоимости этапами жизненного цикла современных программных систем являются этапы верификации и поддержки, в том числе локализации и исправления найденных дефектов. Таким образом, снижение затрат на этих этапах существенно влияет на итоговую стоимость программного продукта и поэтому несомненно является актуальной задачей. Поэтому вопросам верификации и контроля качества программных систем всегда уделялось должное внимание со стороны научного сообщества – им посвящено множество исследований как отечественных, так и зарубежных ученых – В.В. Липаева, П.П. Пархоменко, В.И. Сагунова, В.Ю. Борзова, А.А. Шалыто, G.J. Myers, C.V. Ramamoorthy, E.M. Clarke и других.
Существуют различные пути снижения стоимости поиска и устранения дефектов, в частности, автоматизация тестирования и поиск ошибок на ранних стадиях жизненного цикла. В настоящее время с целью выявления дефектов все чаще используются формальные методы верификации, основанные на статическом анализе и символьном выполнении программ. Отметим, что сложность современных программных систем ставит новые проблемы перед специалистами по тестированию программного обеспечения, в частности:
● тестирование программной системы в целом редко представляет собой задачу, решаемую за приемлемое время в рамках жизненного цикла динамично развивающегося программного продукта;
● написанные тесты быстро устаревают в силу постоянного обновления кодовой базы;
● как требования к программной системе, так и описания интерфейсов и возможностей с трудом поддаются формализации и зачастую сформулированы нечетко;
● даже незначительные изменения в кодовой базе могут приводить к необходимости регрессионного тестирования и, как следствие, к значительным затратам и вероятным дефектам;
● расчет структурных метрик полноты тестирования обычно не реализуем на практике на поздних стадиях верификации программной системы (при тестировании «черного ящика») в силу недопустимости инструментирования на этом этапе.
● чем позднее обнаруживаются дефекты, тем больше затраты на их исправление – таким образом, нахождение дефектов на стадии разработки (при тестировании «белого ящика» или структурном тестировании) позволяет снизить общие затраты на стабилизацию программного продукта.
При тестировании сложных программных систем на практике применяется иерархический подход, заключающийся в разбиении системы на компоненты и модули с последующим проведением тестирования на различных уровнях (модульного, интеграционного и системного тестирования). Однако существующие алгоритмы разбиения программных комплексов на модули требуют указания количества предполагаемых модулей в комплексе, но данное значение в большинстве случаев не известно тестировщику. Кроме этого, на пути реализации известных алгоритмов возникают сложности, связанные с большим объемом вычислений, как следствие, исследования в данной области по-прежнему актуальны.
Проблема регрессионного тестирования и обновления тестов может быть решена за счет автоматизации тестирования и применения техники генерации тестовых данных в тех случаях, когда это экономически оправдано. В настоящее время ведутся активные исследования в области совместного использования формальных методов верификации и динамической верификации. К такому синтетическому подходу относится динамическое символьное выполнение (в англоязычных источниках получившее название concolic testing), получившее должное освещение в работах Koushik Sen (утилита CUTE), ученых из группы Microsoft Research – P. Godefroid, M. Levin (система Microsoft SAGE) и многих других. Вместе с тем в данной области остается ряд нерешенных проблем, поэтому исследования в области формальной верификации (в том числе формальной динамической верификации), несомненно, являются актуальными.
Отдельные проблемы привносит популярный ныне объектно-ориентированный подход к программированию. По сравнению с классическим структурным императивным программированием ООП существенно упрощает разработку сложных программных систем, позволяя еще на этапе проектировать четко разделить систему на компоненты и разграничить ответственность отдельных частей системы. Вместе с тем объектно-ориентированный подход привносит новые типы ошибок, которые не могут обнаруживаться классическими методами структурного тестирования.
Монография посвящена структурному тестированию программных систем на различных его уровнях – от модульного тестирования до системного. Вниманию читателя предлагаются как обзор существующих подходов к тестированию и актуальных проблем верификации, так и авторские разработки, от теоретического описания до аспектов практического применения.
В первой главе приведен обзор существующих методов верификации. Особое внимание уделено тестированию программных систем, его актуальным проблемам и существующим способам их решения.
В последующих главах описаны результаты исследований авторов в области структурного тестирования сложных программных систем. Изложены разработанные модели и методы, формирующие целостный подход к тестированию и позволяющие решить следующие задачи:
● автоматическое разбиение программной системы на модули с целью их дальнейшего параллельного тестирования;
● оценка полноты тестирования с помощью динамического анализа программной системы;
● генерация тестовых воздействий при модульном тестировании;
● генерация тестовых сценариев для интеграционного тестирования объектно-ориентированных программ.
Применение предложенных методов наглядно продемонстрировано на вычислительных экспериментах на реальном программном обеспечении.
Монография будет полезна для специалистов, ответственных за проектирование и производство сложных программных продуктов высокого качества, также может использоваться в качестве учебного пособия по тестированию программного обеспечения.
Библиографическая ссылка
Ломакина Л.С., Базина А.С., Вигура А.Н., Киселев А.В. ТЕОРИЯ И ПРАКТИКА СТРУКТУРНОГО ТЕСТИРОВАНИЯ ПРОГРАММНЫХ СИСТЕМ (МОНОГРАФИЯ) // Международный журнал экспериментального образования. – 2015. – № 12-1. – С. 134-136;URL: https://expeducation.ru/ru/article/view?id=8769 (дата обращения: 02.12.2024).