УДК 519.711.2
ИССЛЕДОВАНИЕ МЕТРИК ОЦЕНКИ КОДА ПРИ ФОРМИРОВАНИИ НАБОРОВ ДАННЫХ С ИСПОЛЬЗОВАНИЕМ ГЕНЕТИЧЕСКОГО АЛГОРИТМА
К.Е. Сердюков, Т.В. Авдеенко
При разработке программного обеспечения даже самые высококвалифицированные разработчики допускают ошибки. Тестировщикам необходимо обеспечить достаточно высокий уровень покрытия кода, то есть необходимо проверить максимально возможное количество путей программного кода. Одним из шагов, который достаточно сложно автоматизировать из-за большого количества возможных комбинаций, является подбор входных данных для обеспечения максимального покрытия кода. Применение генетического алгоритма позволяет найти достаточно большое количество комбинаций входных данных, каждая из которых будет проверять определенный путь кода. Благодаря настройкам генетического алгоритма и использованию различных метрик, можно найти различные части программного кода, соответствующих определенным требованиям. В данной статье рассматривается возможность разработки метода генерации тестовых данных на основе генетического алгоритма и анализируются результаты работы алгоритма при использовании некоторых метрик по оценки кода.
Ключевые слова: генетический алгоритм, тестирование, автоматическая генерация тестов.
1. Введение
Одним из наиболее важных этапов программной инженерии является тестирование. Соответствие разработанной программы заданным требованиям, соблюдение логики в процессах обработки данных и получение верных конечных результатов - всё это является целями тестирования.
Разработка большинства видов дизайнов и шаблонов для тестирования чаще всего происходит вручную, без использования каких-либо систем автоматизации. Из-за этого процесс тестирования становится невероятно сложным и затратным как по времени, так и по финансам, если подходить к нему со всей серьёзностью. Для тестирования некоторых программных систем может уходить до 50% всех временных затрат от всего процесса разработки.
Одной из главных целей тестирования является создания такого тестового набора, который обеспечивал бы достаточно высокий уровень качества конечного продукта за счёт проверки большинства путей программного кода, то есть для обеспечения максимального покрытия кода.
Исходя из вышесказанного можно сделать вывод, что автоматизация определённых этапов тестирования, например, автоматизации подбора тестовых данных, может существенно снизить затраты на этап тестирования. Есть и другие преимущества от автоматизации, не настолько очевидные - большая вероятность нахождения мелких ошибок, прозрачность подготовки тестов, тестирование одновременно с разработкой программы и т.д. [1]
Масштабирование разработки привело к появлению огромных программных систем, в процессе разработки которых принимают участие десятки программистов, каждый из которых обладает собственным стилем написания кода и каждых имеет различные компетенции. Несмотря на то, что вместе с этим появились системы, позволяющие обеспечить высокий уровень совместной разработки, имеющие функционал контроля за изменениями и возможностями проверки качества кода, финальный продукт далеко не всегда соответствует заданным на этапе планирования требованиям.
По этой причине существенно возрастает необходимость качественного и всестороннего тестирования. Необходимо не только находить ошибки в программном коде, но и логические нестыковки. Чтобы как можно более подробно протестировать как программу в целом, так и отдельные её части, необходима не только команда тестировщиков, но и подготовительная деятельность - определение набора входных данных, которые протестировали бы определённые части программы [2].
Тестирование не является стандартизированным процессом, оно зависит от многих факторов, большая часть которых меняется от одной программы к другой. Поэтому учёные пришли к выводу об использовании некоторых исследований в области искусственного интеллекта, которые бы позволили создать гибридную систему автоматической разработки тестов
3, 4].
2. Генетические алгоритмы
Генетический алгоритм отлично показывают себя в решении не стандартизированных задач, задач с неполными данными или для задач, в которых невозможно применение оптимизационных методов из-за сложности реализации или длительности выполнения [6, 7].
Генетический алгоритм считается выполненным, если пройдено определённое число итераций (количество итераций желательно ограничивать, так как генетический алгоритм работает на основе проб и ошибок, что является достаточно длительным процессом), либо, если было получено удовлетворительное значение функции приспособленности. Как правило, генетический алгоритм решает задачи максимизации или минимизации и адекватность каждого решения (хромосомы) оценивается с помощью функции приспособленности.
Генетический алгоритм работает последующему принципу:
- Происходит инициализация. Вводится функция приспособленности. Формируется начальная популяция. В классической теории начальная популяции формируется случайным заполнением каждого гена в хромосомах. Но для увеличения скорости сходимости решения, начальная популяция может быть задана определённым образом, либо заранее проанализированы случайные значения для исключения определённо не подходящих генов.
- Оценка популяции [8]. Каждая из хромосом оценивается функцией приспособленности. На основе заданных требований, хромосомы получают определённое значение, обозначающее, насколько хорошо решение соответствует проблеме.
- Селекция или отбор. После того, как каждая из хромосом получила собственное значение, происходит отбор наилучших хромосом. Селекция может производиться разными методами, например, из отсортированных по значению функции приспособленности выбираются первые п хромосом, либо будут выбираться только наиболее подходящие, но не меньше п и т. д.
- Скрещивание [9]. После селекции и выбора подходящих для решения проблемы хромосом, они скрещиваются между собой. Случайные хромосомы из всех «избранных» в случайном порядке образовывают новые хромосомы. Скрещивание происходит на основе выбора определённой позиции в двух хромосомах и замене частей друг друга. После того, как получится необходимое число новых хромосом для создания популяции, алгоритм переходит к следующему шагу.
- Мутация. В случайном порядке случайный ген может поменять значения на случайное. Основной смысл в мутация такой же, как и в биологии - привнести генетическое разнообразие в популяцию. Главная цель мутаций состоит в получении решений, которые не могли бы получиться с имеющимися генами. Это позволит, во-первых, избежать попадания в локальные экстремумы, так как мутация может позволить перевести алгоритм на другой путь и во-вторых, «разбавить» популяцию, чтобы избежать ситуации, когда во всей популяции будут только одинаковые хромосомы, которые не будут вообще двигаться к решению.
После того, как проведены все шаги, оценивается, достигла ли популяция желаемой точности решения или было получено необходимо число поколений, и если да, то алгоритм прекращает работу. Иначе цикл уже с новой популяцией повторяется, пока условия не будут достигнуты.
3. Виды метрик для оценки сложности кода
Автоматизация подбора входных данных за счёт проверки путей позволит сконцентрировать внимание на тех частях программы, которые более всего нуждаются в тестировании. Первоочередной задачей в таком случае становится нахождение таких путей. В первую очередь для этого необходимо определиться со способами определения сложности программного пути, другими словами, с метриками.
Разные метрики необходимы из-за разных требований к подбору данных. Кроме того, метрики могут обеспечить разное покрытие кода -какое число операций из всего кода можно будет проверить при тестировании. Чем больше покрытие кода предложенных наборов данных, тем больший объем операций можно будет проверить на ошибки, что увеличивает качество конечного продукта.
3.1. Количественные метрики
В первую очередь будут рассмотрены метрики с количественными характеристиками. Они относительно проще метрик, основанных на теории графов, и применяются в большинстве случаев. Данные метрики вычисляются на основе исходного кода программ.
1. АВС-метрика (Б^раМск). Считается количество присваиваний значений переменным (показатель А), логических проверок (показатель В) и вызовов функций (показатель С). Мера так и обозначается тройкой зна-
432
чений, к примеру, ABC = (3,4,7). Но при оценивании сложности программного кода, вычисляется одно значение - квадратный корень из суммы квадратов всех трех значений, что показано в формуле (1).
F = VА2+В2+С2 (1)
Недостатком данной метрики является то, что она может иметь нулевое значение для некоторых непустых программных единиц.
2. Метрики Джилба (Jilb). Считается сложность программы, основанная на количестве операторов цикла и условных операторов, el - абсолютная сложность, которая считается по формуле (2).
el = CL/n, (2)
где п - общее количество операторов программы, CL - относительная сложность программы по Джилбу, то есть количество условных операторов и циклов.
Данная метрика хорошо отражает сложность в понимании кода и трудоемкость разработки, несмотря на простоту вычисления. Существует также несколько разновидностей этой метрики (отдельно для условных операторов и циклов, для ненормальных выходов из управляющих операторов и функций, для модулей и связей между ними и так далее).
3. Метрики Холстеда (Halstead). Данные метрики позволяют частично учесть возможную запись одной и той же функциональности разным количеством строк и операторов. Они основываются на большом множестве количественных показателей, таких, как число уникальных операндов программы, число уникальных операторов программы, общее число операндов, общее число операторов, теоретическое число уникальных операндов и теоретическое число уникальных операторов. С помощью этих показателей и различных формул определяются сложность понимания программы, уровень качества программирования, уровень языка выражения, трудоемкость кодирования программы, оценка интеллектуальных усилий при разработке программы, характеризующая число требуемых элементарных решений при написании программы и информационное содержание программы (данная характеристика позволяет определить умственные затраты на создание программы).
4. Модифицированная метрика Парето для расчёта весов, которая используется в данной статье, может настраиваться модификаторами снижения веса. Подробнее про данную метрику будет рассказано в п. 4 данной статьи при постановке задачи.
3.2. Метрики сложности потока управления программы
Метрики определения сложности потока управления программ в качестве основы используют представление программы в виде графа управления программ, где операции определяются как вершины графов.
1. Цикломатическая сложность, или метрика Мак-Кейба (McCabe). Одна из наиболее известных и широко используемых метрик оценки сложности программ для различных языков программирования. Для графа потока управления цикломатическая сложность процедуры или функции вычисляется по формуле (3).
V(G) = e - n + 2p, (3)
где e - количество дуг, n - количество вершин, p - число компонент связности графа потока управления. Число компонент связности — это количество дуг, которые надо добавить для преобразования графа в сильно связный. В основном для правильно написанных программ граф потока управления получается замыканием дугами вершин, соответствующих точкам выхода и вершин точек входа.
Для правильной программы с одной точкой входа и одной точкой выхода p = 1. Из-за этого формула часто встречается в виде (4).
V(G)=e - n + 2 (4)
В качестве недостатка выступает то, что оценка цикломатической сложности не различает условные и циклические конструкции. Кроме этого, не различается сложность предикатов, например, выражаемую числом входящих в них переменных. Но эти недостатки решаются рядом модификаций, в частности, метрики Хансена, Майерса, Пивоварского.
3 Метрика Хансена (Hanson). Сложность оценивается парой чисел -цикломатическая сложность и число операторов, тем самым метрика становится более чувствительной к структурированности программы.
4. Топологическая мера Чена (Chen). Считается число пересечений границ между областями, образуемыми графом программы. Этот метод возможно применять только к структурированным программам с последовательным соединением управляющих конструкций. В ином случае, мера Чена существенно зависит от условных и безусловных переходов. В этом случае можно указать нижнюю и верхнюю границы меры, 2 и m+1, где m -число логических операторов при их взаимной вложенности. Если граф потока управления имеет только одну компоненту связности, мера Чена совпадает с цикломатической мерой Мак- Кейба.
5. Метрика Вудворда (Woodword). Число узлов (точек пересечения) линий передачи управления на полях листинга программы. В метрике не учитывается ни сложность предикатов, ни размер кода в принципе. Метрика пригодна лишь для статического представления программы. Глубина вложенности управляющих конструкций также не всегда точно учитывается - например, если вложенный условный оператор if не имеет ветви else, то значение меры Вудворда будет на 1 меньше, чем в случае вложенного if с обеими ветвями.
6. Метрики Харрисона и Мейджела (Harrison&Magel). В отличии от предыдущей, учитывают уровень вложенности и размер программы. Каждой вершине графа потока управления присваивается начальная сложность. Далее, для каждой предикатной вершины выделяется ее сфера влияния - подграф, порожденный вершинами, которые являются концами исходящих из нее дуг, а также вершинами, достижимыми из каждой такой вершины (нижняя граница подграфа), и вершинами, лежащими на путях из предикатной вершины в какую-нибудь нижнюю границу. Приведенная сложность предикатной вершины есть сумма начальных или приведенных сложностей вершин, входящих в ее сферу влияния, плюс начальная сложность самой предикатной вершины. Функциональное отношение (SCORT) — это отношение числа вершин в управляющем графе к его функциональ-
434
ной сложности, причем из числа вершин исключаются терминальные. Функциональная мера (SCOPE) программы — это сумма приведенных сложностей всех вершин управляющего графа. Функциональное отношение способно принимать разные значения для графов с одинаковым цик-ломатическим числом, таким образом повышая чувствительность метрик этой группы к вложенности управляющих конструкций.
7. Метрика Пивоварского. Позволяет учесть различия не только между структурированными и неструктурированными программами, но и между последовательными и вложенными управляющими конструкциями. Она считается по формуле (5).
N{G) = v*(G) + Z(Pi), (5)
где v*(G) - модифицированная цикломатическая сложность, при вычислении которой оператор множественных условий с п выходами рассматривается не как п - 1 операторов, а как один логический оператор. Pi - глубина вложенности i-й предикатной вершины (число всех сфер влияния предикатов, которые либо полностью содержатся в сфере рассматриваемой вершины, либо пересекаются с ней). Глубина вложенности увеличивается за счет вложенности не самих предикатов, а сфер влияния. Следовательно, при переходе от последовательных программ к вложенным, и далее к неструктурированным программам, мера Пивоварского возрастает, что является ее преимуществом перед многими другими мерами данной группы.
8. Метрика граничных значений вычисляется по формуле (6).
S0=l-(v-l)/Sa, (6)
где SO - относительная граничная сложность программы, Sa - абсолютная граничная сложность программы, v - общее число вершин графа потока управления. Абсолютная граничная сложность является суммой приведенных сложностей всех вершин графа. В свою очередь, для принимающих вершин, кроме конечной, приведенная сложность вершины определяется равной 1, для второй приведенная сложность равна 0. Принимающая вершина - такая вершина графа потока управления, положительная степень которой (т.е. число исходящих дуг) не превышает 1. Если положительная степень больше или равна 2, то вершина является вершиной отбора.
4. Постановка задачи
Использование генетических алгоритмов в процессе тестирования позволяют обеспечить нахождение наиболее сложных частей программы, в которых риски из-за допущения ошибок наиболее велики. Оценивание происходит за счёт использования функции приспособленности, в качестве параметров которой выступают веса каждой проходимой операции [5].
Задачу по подбору входных тестовых данных можно условно разделить на три подзадачи:
1) Поиск входных данных для прохода по одному наиболее сложному пути кода. Сложность определяется выбранной метрикой для оценки кода;
2) Исключение или снижение весов операций на пути, для которого были подобраны данные, из расчёта функции приспособленности для других путей;
3) Подбор тестовых данных для множества путей программного кода.
Ограничение на количество наборов входных данных устанавливается после этапа разработки и позволит сконцентрироваться на определённых путях [10].
Весь алгоритм выполняется циклически - запускается процедура поиска входных данных для одного пути, после чего операции в этом пути исключаются из вычислений подбора входных данных, и снова запускается алгоритм поиска данных для одного пути.
В качестве подробного рассмотрения работы метода подбора входных данных на основе генетического алгоритма, используется модифицированная метрика Паретто, работающая по следующему принципу:
- Первой операции назначается определённый вес, например, в 100 единиц.
- Каждой последующей операции так же назначается вес - если нет никаких условий или циклов, вес берётся в соответствии с предыдущей операцией.
- Условия разделяют вес в соответствии с правилом - если условие содержит только одну ветвь (только if...), то вес каждой операции снижается на 80%. Если условие разделяется на несколько ветвей (if.else.), то вес делится на равнозначные части - для двух ветвях 50%/50%, для трёх 33%/33%/33% и т.д.
- Веса операций в цикле остаются, но также могут умножаться на определённых вес, если необходимо.
- Все вложенные ограничения суммируются, например, для двух вложенных условий вес операций будет равен 80% * 80% = 64%
Программный код для анализа и представленный для него граф потока управления показан на рисунке.
0. public static void Mairi(int m, int intn) {
1. intsum=05avg = 0;
2. if(m< i)
3- {
4. use_ra = m;
5}
6. llll11.1 I.' V.lllt| Ill|
7. Console.WriteLineC'Enter the Array Elements ");
5. for (j - 0- j <m: j—)
9- {
io.4j] = i|
ll.if(a[j]>n)
13.аЩ=п
14.)
15.)
16.for (k= 0: k< m: k—)
17.{
18.5шп-= a[k];
lf-i
20.avg— sum / m;
2 l.Console.WriteLine("Average is {0}", avg);
22_Console.ReadLineO;
23.)
Программный код и граф с назначенными весами анализируемой
программы
436
5. Результаты работы алгоритма
Для тестирования метода используется 4 случайно сформированных набора данных - (10,5,12); (3,4,10); (25,30,11); (5,3,17).
В табл. 1 представлены наборы данных, рассчитанное целевое значение функции приспособленности и ранг, определяющий наилучший набор.
Таблица 1
Первоначальные варианты наборов данных
№ Набор данных Х Р(Х) Ранг
1 (10,5,12) 896 3
2 (3,4,10) 1196 2
3 (25,30,11) 1308 1
4 (5,3,17) 896 3
В данном случае в качестве наборов данных для селекции будут использоваться 2 и 3 варианты. Для того, чтобы получить дополнительно два новых варианта, их значения будут перемешаны и дополнены некоторой вероятностью мутации.
Деление наборов будет происходить по первой и второй позиции -при скрещивании (Х,Х,Х) и (У,У,У) будут получены переменные -(Х,Х,У), (Х,У,У), (У,Х,Х) и (У,У,Х). Родительские значения остаются для сохранения чистоты скрещивания, т.е. по сравнению с нулевым поколением в первом будут добавлены 2 новых набора. В последующих поколениях будет сохраняться 6 наборов данных. В результате скрещивания, будет получены наборы данных, отражённые в табл. 2.
Таблица 2
Новые наборы данных, полученные в результате скрещивания
№ Х У Новый набор Мутация
1 (3,4,10) (25,30,11) (3,4,11) (3,4,13)
2 (3,4,10) (25,30,11) (3,30,11) (3,30,11)
3 (3,4,10) (25,30,11) (25,4,10) (25,4,10)
4 (3,4,10) (25,30,11) (25,30,10) (25,30,10)
В итоге к дополнительным двум родительским наборам добавятся ещё два - (3,4,13) и (25,30,10). В табл. 3 показаны все новые варианты тестовых наборов данных.
Таблица 3
Первое поколение тестовых данных
№ Набор данных Х Р(Х) Ранг Поколение
1 (3,4,10) 1196 2 0
2 (25,30,11) 1308 1 0
3 (3,4,13) 1196 2 1
4 (3,30,11) 1308 1 1
5 (25,4,10) 896 3 1
6 (25,30,10) 1308 1 1
При одинаковых рангах приоритет будет у наборов из более нового поколения. В последнем поколении было получено 3 набора данных, которые проверяют больше всего путей программы - (25,30,11), (3,30,11) и (25,30,10). Первый набор был получен из первого поколения, поэтому он будет исключён и в результате останется два варианта - (3,30,11) и (25,30,10).
Из-за маленькой начальной выборки и небольшого кода наборы данных достаточно быстро пришли к нахождению пересекающихся значений - 30 на второй позиции и 10 на третьей. Поэтому продолжать проводить итерации перестаёт иметь смысл - уже в следующем поколении наборы будут состоять преимущественно из повторяющихся наборов.
Для данного программного кода можно использовать тестовые наборы данных, полученных в последнем поколении. Приоритетность зависит от полученного ранга.
Таким образом, используя генетические алгоритмы можно найти такие начальные тестовые начальные значения, которые бы в полной мере проверяли все варианты программы в зависимости от назначенных весов. Это проверяется через максимизацию функций приспособленности, так как наиболее широко описывающий тестовый вариант проходит через те пути, которые имеют наибольший вес.
6. Оценивание метрик для применения в функции приспособленности
Для исследования проведено несколько тестов работы алгоритма с четырьмя различными метриками - модифицированной метрикой, на основе правила Паретто, метрики SLOC по оценке количества строк кода, метрики ABC и метрики Джилба.
Для тестирования используется другой код большего размера, в котором есть множество путей выполнения. Заранее рассчитанный один из путей является критическим, то есть в нём введено наибольшее число операций. Подбор входных данных для данного пути будет являться решением подзадачи и по этим данным можно будет определить, насколько точно подбираются данные. Проход по критическому пути будет в том случае, если из подобранных данных 1-е и 3-е значения больше 50 и 1 значение меньше 3. Поэтому анализируя данные можно с лёгкостью понять, подобрались ли они для критического пути.
Используются следующие настройки алгоритма:
- Количество поколений - 100
- Количество популяций в одном поколении - 100
- Диапазон принимаемых значений данных - (0, 100)
Для представления результатов ниже представлена табл. 4, в которой отражены нулевая популяция (данные подобраны случайно), первое поколение и последнее поколение, являющееся решением.
438
Таблица 4
Результаты работы алгоритма с использование разных метрик
Вариант\Поколение 0 1 99
Модифицированная мет] рика с правилом Паретто
1 (70, 9, 78) = 164100 (75, 67, 82) = 164100 (70, 9, 78) = 164100
2 (75, 67, 82) = 164100 (61, 29, 94) = 164100 (70, 9, 78) = 164100
3 (61, 29, 94) = 164100 (63, 52, 87) = 164100 (75, 67, 82) = 164100
4 (63, 52, 87) = 164100 (63, 49, 83) = 164100 (75, 67, 82) = 164100
5 (63, 49, 83) = 164100 (70, 9, 78) = 164100 (75, 67, 82) = 164100
6 (5, 68, 90) = 96382 (63, 52, 87) = 164100 (75, 67, 82) = 164100
7 (60, 37, 3) = 32500 (70, 9, 78) = 164100 (75, 67, 82) = 164100
8 (12, 80, 49) = 16000 (70, 9, 78) = 164100 (70, 9, 78) = 164100
9 (47, 12, 17) = 16000 (70, 9, 78) = 164100 (70, 9, 78) = 164100
10 (53, 35, 76) = 16000 (61, 29, 94) = 164100 (75, 67, 82) = 164100
Метрика БЬОС
Вариант\Поколение 0 1 99
1 (64, 14, 96) = 6411 (68, 50, 94) = 6411 (63, 72, 91) = 6411
2 (68, 50, 94) = 6411 (80, 70, 88) = 6411 (68, 50, 94) = 6411
3 (80, 70, 88) = 6411 (65, 81, 89) = 6411 (68, 50, 94) = 6411
4 (65, 81, 89) = 6411 (63, 72, 91) = 6411 (63, 72, 91) = 6411
5 (63, 72, 91) = 6411 (74, 83, 76) = 6411 (80, 70, 88) = 6411
6 (74, 83, 76) = 6411 (64, 69, 91) = 6411 (68, 50, 94) = 6411
7 (64, 69, 91) = 6411 (69, 88, 85) = 6411 (68, 50, 94) = 6411
8 (69, 88, 85) = 6411 (64, 14, 96) = 6411 (63, 72, 91) = 6411
9 (5, 39, 72) = 3618 (63, 72, 91) = 6411 (63, 72, 91) = 6411
10 (2, 67, 73) = 3618 (68, 50, 94) = 6411 (80, 70, 88) = 6411
Метрика АБС
Вариант\Поколение 0 1 99
1 (95, 27, 97) = 6351 (77, 36, 98) = 6351 (69, 46, 78) = 6351
2 (77, 36, 98) = 6351 (69, 46, 78) = 6351 (77, 36, 98) = 6351
3 (69, 46, 78) = 6351 (61, 65, 95) = 6351 (69, 46, 78) = 6351
4 (61, 65, 95) = 6351 (95, 27, 97) = 6351 (69, 46, 78) = 6351
5 (5, 67, 92) = 3538 (61, 65, 95) = 6351 (69, 46, 78) = 6351
6 (5, 87, 95) = 3538 (95, 27, 97) = 6351 (69, 46, 78) = 6351
7 (1, 35, 60) = 3538 (61, 65, 95) = 6351 (69, 46, 78) = 6351
8 (1, 70, 53) = 3538 (69, 46, 78) = 6351 (77, 36, 98) = 6351
9 (60, 30, 12) = 768 (69, 46, 78) = 6351 (69, 46, 78) = 6351
10 (60, 49, 73) = 768 (69, 46, 78) = 6351 (69, 46, 78) = 6351
Метрика Джилба
Вариант\Поколение 0 1 99
1 (75, 51, 3) = 100 (62, 25, 41) = 100 (78, 45, 21) = 100
2 (92, 33, 11) = 100 (94, 22, 35) = 100 (63, 36, 10) = 100
3 (94, 22, 35) = 100 (98, 51, 12) = 100 (75, 51, 3) = 100
4 (98, 51, 12) = 100 (80, 42, 20) = 100 (80, 42, 20) = 100
5 (80, 42, 20) = 100 (78, 45, 21) = 100 (78, 45, 21) = 100
6 (78, 45, 21) = 100 (80, 59, 8) = 100 (63, 36, 10) = 100
7 (80, 59, 8) = 100 (5, 40, 27) = 100 (80, 42, 20) = 100
8 (5, 40, 27) = 100 (99, 38, 29) = 100 (78, 45, 21) = 100
9 (99, 38, 29) = 100 (62, 25, 41) = 100 (75, 51, 3) = 100
10 (62, 25, 41) = 100 (63, 36, 10) = 100 (80, 42, 20) = 100
6.1.Модифицированное правило Паретто
Алгоритм с модифицированной метрикой Паретто подбирает данные с приоритетом операций более высокого уровня. В результате (99 поколение) были получены два набора данных - (70, 9, 78) и (75, 67, 82). Оба набора проходят по самому длинному пути кода, что является решением подзадачи.
6.2.Метрика SLOC
Данная метрика является самой простой с точки зрения реализации, в ней учитывается только общее количество строк кода. Алгоритм с данной метрикой подобрал 3 набора - (63, 72, 91), (68, 50, 94) и (80, 70, 88). Все три удовлетворяют условиям для прохода по критическому пути.
6.3.Метрика ABC
Данная метрика учитывает больше вариантов значений, таких как присваивание значений переменным, логических проверок и вызовов функций. Как и метрика, использующая правило Паррето, алгоритм с метрикой ABC подобрал 2 варианта входных данных которые проходят по критическому пути - (69, 46, 78) и (77, 36, 98).
6.4.Метрика Джилба
В отличие от предыдущих метрик в данной учитывается абсолютная сложность программы, высчитываемая делением количества циклов и условий, делённое на количество операций в пути. Сложность программы определяется другими показателями, что приведёт к тому, что данные будут подобраны для совершенно других путей, чем в других метриках.
Метрика Джилба подобрала данные для совершенно другого пути, нежели рассмотренные ранее. Ввиду того, что тестируемый код заключён в один цикл и одно общее условие, то если данное условие не будет выполнено, то алгоритм будет учитывать только цикл и условие. Метрика Джилба подобрала данные именно для варианта, когда они не будут приводить к выполнению хоть каких-либо операций. Значение 100 как раз показывает такое развитие, так как количество условных операций равно общему количеству операций на пути.
6.5.Анализ результатов подборов данных различных метрик
Все анализируемые метрики, за исключением метрики Джилба, подобрали несколько вариантов данных для критического пути, который был выбран изначально. Заметно, что метрики для небольшого кода в 130 строк с несколькими путями кода успешно подбирают данные уже в первом поколении, что говорит о достаточно высокой скорости сходимости алгоритма. В последующих поколениях последовательно исключаются различные варианты, оставляя лишь несколько.
Анализ и оценка метрик позволяет понять, что определённые метрики будут показывать себя лучше в определённых ситуациях при определённых требованиях к коду и могут служить разным целям. SLOC хорошо определяет общую сложность программы, то есть наибольшее количество операций на пути в целом. Метрика на основе правила Паретто позволит определять пути, в которых будет наибольшее число как можно меньше вложенных операций. То есть отдаётся предпочтение операциям, которые теоретически должны срабатывать чаще. Метрика Джилба полезна в случае, когда нужно определить операции, которые срабатывают реже всего ввиду наибольшей вложенности. Причём тем меньше таких операций на пути, тем больший приоритет будет получать пути. Минусом данной метрики, является то, что метрика будет стремиться не приводить к срабаты-
ванию условий, если условие имеет только одну ветвь. Метрика ABC объединяет в себе несколько показателей, которые определяют сложность программы с разных сторон.
7. Заключение
Эволюционные методы работают таким образом, чтобы находить наиболее хорошие решения в задачах, которые невозможно или слишком затратно решать стандартными методами оптимизации. Они не всегда работают быстро или качественно, но в задачах с нестандартными подходами показывают превосходство.
Метод подбора входных данных на основе генетического алгоритма позволит автоматизировать метод подбора входных данных, обеспечивая достаточно высокий уровень сходимости решения. За исключением настроек ограничений, алгоритм полностью автоматизирован, поэтому не требует дополнительных тестировщиков или разработчиков. Полученный на выходе набор данных может напрямую использоваться в процессе тестирования и, при необходимости, быть собран заново без дополнительных затрат.
Введение различных метрик для расчёта функции приспособленности позволил добавить алгоритму несколько вариантов подбора входных данных. Каждая метрика сконцентрирована на определённых параметрах кода и может использоваться в случае, когда данные должны подбираться в соответствии с определёнными требованиями. Кроме того, в случае, когда метрика неэффективно подбирает данные, возможно использовать другие метрики, которые могут перекрывать недостатки друг друга.
Работа поддержана грантом Министерства образования и науки РФ в рамках проектной части государственного задания, проект № 2.2327.2017/4.6 «Интеграция моделей представления знаний на основе интеллектуального анализа больших данных для поддержки принятия решений в области программной инженерии».
Список литературы
1. Zanetti M.C., Tessone C.J., Scholtes I., Schweitzer F. Automated Software Remodularization Based on Move Refactoring. A Complex Systems Approach // 3th international conference on Modularity, 2014. P. 73-83
2. Crispin L., Gregory J Agile Testing: A Practical Guide for Testersand Agile Teams-Pearson Education, 2010. 576 p.
3. Luger F George Artificial Intelligence Structures and Strategies for Complex Problem Solving -University of New Mexico, 2009. 679 p.
4. Berndt D.J., Fisher J., Johnson L., Pinglikar J., Watkins A. Breeding Software Test Cases with Genetic Algorithms // Proceedings of the Thirty-Sixth Hawaii International Conference on System Sciences - HICSS-36, 2003.
5. Praveen R.S., Tai-hoon K. Application of Genetic Algorithm in Software Testing // International Journal of Software Engineering and Its Applications - Vol. 3, No.4, 2009. P. 87-96.
6. Serdyukov K., Avdeenko T. Investigation of the genetic algorithm possibilities for retrieving relevant cases from big data in the decision support systems // CEUR Workshop Proceedings. -Vol.1903, 2017. P. 36-41.
7. Yang H.L. Two stages of case-based reasoning - Integrating genetic algorithm with data mining mechanism / Yang H.L., Wang C.S // Expert Systems with Applications - v. 35, 2008. P. 262-272.
8. Muhlenbein H. How genetic algorithms really work: Mutation and hillclimbing. / Parallel Problem Solving from Nature 2, North-Holland, 1992.
9. Spears W. M. Crossover or mutation? Foundations of Genetic Algorithms 2 - 1993.
10. Coyle L., Cunningham P. Improving recommendation ranking by learning personal feature weights // Proc. 7th European Conference on Case-Based Reasoning, 2004. P. 560-572.
Сердюков Константин Евгеньевич, аспирант, [email protected], Россия, Новосибирск, Новосибирский государственный технический университет,
Авдеенко Татьяна Владимировна, д-р техн. наук, профессор, tavdeen-ko@,mail.ru, Россия, Новосибирск, Новосибирский государственный технический университет
RESEARCH OF CODE EVALUATION METRICS WHEN FORMING DATASETS USING
A GENETIC ALGORITHM
K.E. Serdyukov, T. V. Avdeenko
When developing software, even the most highly qualified developers make mistakes. Testers need to ensure a sufficiently high level of code coverage, that is, it is necessary to check the maximum possible number of code paths. One of the steps, which is quite difficult to automate due to the large number of possible combinations, is the selection of input data to ensure maximum coverage of the code. Applying a genetic algorithm allows to find a sufficiently large number of combinations of input data, each of which will check a specific code path. Due to the settings of the genetic algorithm and the use of various metrics, can be found various parts of the program code that meet certain requirements. This article discusses the possibility of developing a method for generating test data based on a genetic algorithm and analyzes the results of the algorithm when using some metrics to evaluate the code.
Key words: genetic algorithm, testing, automatic test generation.
Serdyukov Konstantin Evgenevich, postgraduate, [email protected], Russia, Novosibirsk, Novosibirsk State Technical University,
Avdeenko Tatyana Vladimirovna, doctor of technical sciences, professor, tavdeen-ko@,mail.ru, Russia, Novosibirsk, Novosibirsk State Technical University