Научная статья на тему 'Редукция операторов алгоритма для оптимизации времени структурной генерации модульных тестов'

Редукция операторов алгоритма для оптимизации времени структурной генерации модульных тестов Текст научной статьи по специальности «Компьютерные и информационные науки»

CC BY
126
38
i Надоели баннеры? Вы всегда можете отключить рекламу.
i Надоели баннеры? Вы всегда можете отключить рекламу.
iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

Текст научной работы на тему «Редукция операторов алгоритма для оптимизации времени структурной генерации модульных тестов»

Редукция операторов алгоритма для оптимизации времени структурной генерации модульных тестов

А.В. Ребриков

Московский государственный технический университет им. Н.Э. Баумана, кафедра

«Программное обеспечение ЭВМ и АСУ» rerbrikov a@mail.ru

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

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

Необходимость разработки метода для неполной верификации программных систем обусловлена отсутствием единого синтетического метода такой верификации [4]. Существующие аналоги являются узкоспециализированными, не обеспечивают требуемой степени покрытия кода или требуемого уровня автоматизации верификации [4].

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

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

[5].

Для алгоритмов можно использовать известные зависимости по данным и по управлению, определения которых даны в статье [5]. Отношение зависимости между операторами алгоритма может быть выявлено по описанию алгоритма и используется для предсказания возможного хода его выполнения. Существует два основных типа зависимости в последовательной программе: зависимости по управлению, которые определяются управляющими конструкциями программы, и зависимости по данным, которые определяются переменными, используемыми в алгоритме.

Под алгоритмом понимается кортеж (G,Var), где

G = (, E, п0) - управляющий граф алгоритма, N - множество вершин, каждая из

которых соответствует оператору алгоритма, E - множество дуг, соответствующих переходу управления в алгоритме, n0 е N - начальная вершина алгоритма, Var -

множество переменных алгоритма.

Оператор s е N зависит по управлению от предиката с, который содержится в операторе условного ветвления, если в структуре потока управления алгоритма, от выбора пути выполнения, на который потенциально влияет с, зависит, будет ли выполнен оператор s. Оператор s е N зависит по данным от оператора s'e N, если данные, определяемые в s’, используются в s, потенциально могут достичь s через последовательность присваиваний переменных.

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

Рис. 1 - Функциональная модель масштабирования алгоритма

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

Формально уровень абстракции [6] а определяется как отображение множества операторов алгоритма G.N во множество всех подмножеств переменных алгоритма 2Уаг, объединенных со специальным элементом р:

а : О.Ы ^ 2Уаг и р},

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

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

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

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

Результаты выполнения

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

синтаксической зависимости, зависимости по управлению и данным. Для построенного остаточного алгоритма с помощью структурной генерации [7, 8] строится наборы тестов, затем определяется уровень покрытия и другие

статистические характеристики тестов.

Рис. 3 - Влияние глубины абстракции на время генерации и число найденных ошибок На рис. 3 показано время генерации для различных символьных решателей, использованных в разработанном программном комплексе, в зависимости от глубины абстракции, а также число обнаруженных ошибок. График числа обнаруженных ошибок позволяет определить примерный уровень насыщения при глубине абстракции 3, после которого не происходит существенного повышения качества тестирования.

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

Случайные тесты Граничные значения Случайные тесты Граничные значения Структурная генерация

■ Число тестов, шт. ■ Покрытие. % ■ Число тестов, шт. ■ Время генерации

тестов, с

Рис. 4 - Сравнение способов генерации тестов по времени и степени покрытия кода

Проведенные исследования позволили:

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

• установить значение числа ложных срабатываний: из 47 найденных ошибок 44 были подтверждены составленными вручную тестами;

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

Кроме того, структурная генерация тестов применима к нецелочисленным алгоритмам, которые не могут быть проверены с помощью формальной верификации.

Эксперименты проводились на модулях с открытым исходным кодом репозитория CPAN [9]. Программный комплекс, реализующий данную схему для алгоритмов, записанных на языке Perl, зарегистрирован в Объединенном фонде алгоритмов и программ под номером ЕСПД .02076881.00425-01.

Список литературы

1. Майерс Г. Искусство тестирования программ. М., "Финансы и статистика", 1982. - 174с.

2. Ben-Ari. M. Principles of Spin // Springer Verlag. - 2008. - P. 216. of Software), volume 3639 of Lecture Notes in Computer Science, San Francisco, August 2005. Springer-Verlag.

3. Burch J., Clarke E., McMillan K., Dill D., and Hwang L. Symbolic model checking: 10Л20 states and beyond // Information and Computation. - 1992. - Vol. 98, № 2. -P. 142-170.

4. Кулямин В.В. Методы верификации программного обеспечения / Всероссийский конкурсный отбор обзорно-аналитических статей по приоритетному направлению "Информационно-телекоммуникационные системы", 2008. - 117 с.

5. Podgurski, A. and Clarke, L. A. 1990. A Formal Model of Program Dependences and its Implications for Software Testing, Debugging, and Maintenance. IEEE Trans. Softw. Eng. 16, 9 (Sep. 1990), 965-979

6. Савенков К.О. Масштабирование дискретно-событийных имитационных моделей // Диссертация (кф-мн, 05.13.133), ф-т ВМиК МГУ, 2007.

7. Рудаков И.В., Ребриков А.В. Неполная верификация систем, представленных в виде вероятностных автоматов с нечеткой функцией переходов / Информатика и системы управления в XXI веке: Сборник трудов молодых учёных, аспирантов и студентов МГТУ им. Н.Э. Баумана. - 2010.

8. Ребриков А.В., Рудаков И.В. Неполная верификация систем, представленных в

виде вероятностных автоматов с нечеткой функцией переходов / Материалы тринадцатого научно-практического семинара "Новые информационные технологии в автоматизированных системах. - М.: Московский

государственный институт электроники и математики, 2010. - с. 291-293.

9. Comprehensive Perl Archive Network [Электрон. ресурс]. Режим доступа: http://cpan.org/, свободный

i Надоели баннеры? Вы всегда можете отключить рекламу.