Тестирование программ с использованием генетических алгоритмов

УДК 004.8

ТЕСТИРОВАНИЕ ПРОГРАММ С ИСПОЛЬЗОВАНИЕМ ГЕНЕТИЧЕСКИХ АЛГОРИТМОВ

В.В. Мельникова; С.Л. Котов, к.э.н.; Б.В. Палюх, д.т.н.

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

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

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

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

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

Главной составляющей процедуры проведения сертификационных испытаний и одним из наиболее устоявшихся способов обеспечения качества

разработки ПО представляется тестирование. Оно входит в набор эффективных средств современной системы обеспечения качества программного продукта. Тестирование позволяет достаточно полно оценить трудоемкость ПС. Широко известна оценка распределения трудоемкости между фазами создания программного продукта: 40 %-20 %-40 % (рис. 1), из чего следует, что наибольший эффект в снижении трудоемкости может быть получен прежде всего на фазах тестирования (Testing) и проектирования (Design) [2].

'1 Cost to [B. Boehm]

fix error

---

Requirem. Code Testing

& Specific. Development

Design

Рис. 1. Схема оценки трудоемкости идентификации ошибок при создании ПС

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

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

Функциональные требования должны ранжироваться в зависимости от их сложности и важности. Для их проверки необходимы две категории тестов: тесты по спецификациям и тесты для ситуаций, не отраженных в требованиях. Целью тестов первой группы является демонстрация спо-

Рис. 2. Схема создания тестовой базы

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

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

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

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

Функция приспособленности должна удовлетворять следующему условию: чем лучше особь, тем выше приспособленность. Наиболее удобно выбрать фитнес-функцию, которая сопоставляет

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

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

1. Создать начальный набор кандидатов.

2. Оценить качество каждого кандидата в текущем наборе.

3. Выбрать пары наиболее качественных кандидатов для воспроизводства.

4. Применить оператор кроссовера.

5. Применить оператор мутации.

6. Если не выполнено условие останова, перейти к шагу 2.

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

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

Пусть Р - множество программных систем; Т -множество тестов; Е - множество тестовых наборов, то есть множество всех конечных подмножеств множества Т. Тогда задача генерации тестов может быть сформулирована следующим образом: для заданной тестируемой системы 8е Р построить тестовый набор ст е Е, удовлетворяющий заданному критерию полноты тестового покрытия F:Px£^{•, ±}, то есть такой набор ст, для которого F(S, ст)=».

Многие критерии полноты тестового покрытия, имеющие практическое применение, строятся по следующей схеме: для тестируемой системы S критерий F определяет множество элементов тес-

тового покрытия . Элементом тестового покрытия можно считать некий класс событий, которые могут произойти в ходе работы тестируемого ПС. По появлению в процессе исполнения программы элементов тестового покрытия и различных их комбинаций можно судить о полноте или качестве проверки, выполняемой данным тестовым набором. Например, элементами тестового покрытия могут быть исполняемые строки исходного кода (соответствующие событиям их исполнения), ребра графа потока управления, пути в графе потока управления, логические выражения, встречающиеся в исходном коде, и т.п. Кроме того, критерий F определяет логическую функцию х Т .1}, которая принимает значение

^д, t)=•, если элемент тестового покрытия q покрывается тестом 1 Тестовый набор ст для системы S удовлетворяет критерию полноты тестового покрытия F, если каждый его элемент из множества покрывается хотя бы одним тестом из тестового набора ст, то есть

1

Наиболее часто встречаются следующие критерии полноты тестового покрытия:

- каждый оператор в исходном коде выполняется хотя бы один раз;

- каждая ветвь графа потока управления выполняется хотя бы один раз;

- каждый путь графа потока управления исполнением выполняется хотя бы один раз;

- каждое логическое выражение хотя бы один раз вычисляется со значением «истина» и хотя бы один раз со значением «ложь»;

- тестовый набор убивает всех мутантов в заданном наборе.

Со многими критериями полноты тестового покрытия можно связать соответствующую метрику тестового покрытия, то есть функцию вида М:РхЕ^К Значение этой функции Мф, ст) имеет смысл числовой оценки того, насколько хорошо тестовый набор ст покрывает тестируемую систему S. Сам критерий при этом можно записать в виде Мф, ст)>а^ где ^ - минимальное пороговое значение метрики М для тестируемой системы S.

В частности, для критерия полноты тестового покрытия F, представимого в виде (1), можно ввести следующую метрику:

М'ф,ст) = |{я е :31 ест: 1^,1) = •} .

Сам критерий при этом примет вид

|{я е е ст: 1"

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

|{я е д^ ест :1Хя,1) = •}>* |0||.

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

Все эти метрики можно представить в виде (2).

Рассмотрим простейший генетический алгоритм для задачи генерации: для заданной тестовой системы S и заданного элемента тестового покрытия а построить тест tеT, удовлетворяющий условию !)=•.

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

В качестве множества кандидатов возьмем множество тестов Т, критерием полноты тестового покрытия определим критерий покрытия путей потока управления.

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

при 1<<„. Упорядоченным подмно-

жеством пути т15 т2,

, т„ назовем последователь-

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

Пусть есть два пути Я' = т', т',..., т' и

К" = <, т',...,< и пусть

Т12 = ТЬ>

= 4

причем 1<11<

<12<. <1т<1 и 1<]1<]2<.<]т<к. Тогда пути Я' и Я" имеют общее упорядоченное подмножество размера т.

Обозначим через длину пути Я, а че-

рез еотто„(К', Я") максимальный размер общего упорядоченного подмножества путей Я' и Я". Определим оценочную функцию для критерия покрытия путей потока управления следующим образом: -тк(1)=1е„^(К)+1е„^(раШ(1))-2еот-то„(Я, path(t)).

т

т

Здесь раШ(1) - путь, по которому приходит управление при выполнении теста 1. Значение в правой части равно количеству переходов в путях Я и раШ(1), не входящих в максимальное общее упорядоченное подмножество этих путей. Оно равно 0 тогда и только тогда, когда пути Я и раШ(1) совпадают.

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

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

Для оценки достаточности и полноты сформированных тестов можно воспользоваться мутационным критерием проверки: в программу Р вносят мутации (то есть искусственно создают программы-мутанты Р1, Р2); затем программа Р и ее мутанты тестируются на одном и том же наборе тестов (X, У). Если на наборе (X, У) подтверждается правильность программы Р и, кроме того, выявляются все внесенные в программы-мутанты ошибки, то набор тестов (X, У) соответствует му-

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

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

Таким образом, созданная с использованием генетических алгоритмов база тестов позволит значительно сократить время на проведение сертификационных испытаний и их трудоемкость. Экономический эффект достигается за счет экономии ресурсов, затраченных на повторное проведение сертификационных испытаний в целом, и составляет при цикле жизни приложения около трех лет от 20 до 45 %.

Литература

1. Полежаев В.А., Семенов М.Н., Мельникова В.В. Автоматизированная система оценки уровня налоговых рисков // Программные продукты и системы. 2008. № 4 (84).

2. Котляров В.П., Коликова Т.В. Основы современного тестирования программного обеспечения, разработанного на с#: учеб. пособие; [под ред. В.П. Котлярова]. СПб, 2004. С. 55-57.

3. Котов С.Л., Демирский А.А., Мещерякова В.В. Проведение сертификационных испытаний часто обновляющихся ПС с использованием автоматизированной тестовой базы // Вестн. ВНИИМАШ, 2010.

4. Семенов Н.А. Интеллектуальные информационные системы: учеб. пособие. Тверь: Изд-во ТГТУ, 2004. 1-е изд. С. 87-89.

5. Рутковская Д., Пилиньский М., Рутковский Л. Нейронные сети, генетические алгоритмы и нечеткие системы; [пер. с польск. И.Д. Рудинского]. М.: Горячая линия - Телеком, 2006. С. 261-264.

УДК 519.688

БИБЛИОТЕКА ДЛЯ ПОИСКА САЙТОВ СВЯЗЫВАНИЯ С ТРАНСКРИПЦИОННЫМИ ФАКТОРАМИ

Н.А. Горохов

Описывается разработанная авторами библиотека для поиска сайтов связывания с транскрипционными факторами (специфических фрагментов на ДНК, куда закрепляются регуляторные белки, называемые транскрипционными факторами). Она состоит из трех алгоритмов поиска: прямого поиска, поиска с использованием перестановок и за-глядывания вперед и суффиксных массивов. Библиотека ориентирована на большие объемы информации и позволяет производить поиск на последовательностях геномного масштаба с библиотекой из нескольких тысяч матриц.

Ключевые слова: весовые матрицы, сайты связывания с транскрипционными факторами, суффиксные массивы, геном, ДНК, программная система.

Регуляция генной экспрессии

является очень сложным процессом, особенно в многоклеточных эукариотических организмах [1].