Файл: Тестирования производительности программ: подходы в зависимости от категорий приложений.pdf
Добавлен: 29.03.2023
Просмотров: 336
Скачиваний: 1
– позволяет убедиться в том, что пользователь может "интуитивно" использовать продукт или услугу не путаясь в сложных переплетениях интерфейсов.
Уровни тестирования
Стандарт ISO / IEC 25010:2011 (ГОСТ Р ИСО / МЭК 25010 - 2015) определяет качество программного обеспечения как степень соответствия системе заявленных и подразумеваемых потребностей различных заинтересованных сторон. В соответствии со стандартом модель качества программного продукта включает восемь характеристик:
- функциональная пригодность;
- уровень производительности;
- совместимость;
- удобство пользования;
- надёжность;
- защищённость;
- сопровождаемость;
- переносимость (мобильность) [11].
Выделяют следующие уровни тестирования:
Модульное тестирование — тестируется минимально возможный для тестирования компонент, например, отдельный класс или функция. Обычно модульное тестирование осуществляется разработчиками программного обеспечения.
Интеграционное тестирование — тестируются интерфейсы между компонентами, подсистемами или системами. При наличии резерва времени на данной стадии тестирование ведётся итерационно, с постепенным подключением последующих подсистем.
Системное тестирование — тестируется интегрированная система на её соответствие требованиям.
Альфа - тестирование — имитация реальной работы с системой штатными разработчиками, либо реальная работа с системой потенциальными пользователями / заказчиком. Чаще всего альфа - тестирование проводится на ранней стадии разработки продукта, но в некоторых случаях может применяться для законченного продукта в качестве внутреннего приёмочного тестирования. Иногда альфа - тестирование выполняется под отладчиком или с использованием окружения, которое помогает быстро выявлять найденные ошибки. Обнаруженные ошибки могут быть переданы тестировщикам для дополнительного исследования в окружении, подобном тому, в котором будет использоваться программа.
Бета - тестирование — в некоторых случаях выполняется распространение предварительной версии (в случае проприетарного программного обеспечения иногда с ограничениями по функциональности или времени работы) для некоторой большей группы лиц с тем, чтобы убедиться, что продукт содержит достаточно мало ошибок. Иногда бета - тестирование выполняется для того, чтобы получить обратную связь о продукте от его будущих пользователей [11].
Часто для свободного и открытого программного обеспечения стадия альфа - тестирования характеризует функциональное наполнение кода, а стадия бета - тестирования — стадию исправления ошибок. При этом, как правило, на каждом этапе разработки промежуточные результаты работы доступны конечным пользователям [10].
Следует различать статическое и динамическое тестирование.
При статическом тестировании программный код не выполняется — анализ программы происходит на основе исходного кода, который вычитывается вручную, либо анализируется специальными инструментами. В некоторых случаях анализируется не исходный, а промежуточный код (такой как байт - код или код на MSIL) [10]. Статический анализ всегда быстрее всех остальных методов анализа.
Динамический анализ предполагает запуск реальной программы [9] и анализ функционирования программы и ее артефактов.
1.4 Генетические алгоритмы тестирования программ
Проблема качества остается главной для индустрии программного обеспечения (ПО). В программной инженерии рассматриваются все аспекты повышения качества программного обеспечения, начиная с подготовительных работ и заканчивая их изъятием из обращения. Тестирование является неотъемлемой составляющей программной инженерии, одним из методов улучшения качества разрабатываемого ПО посредством выявления его дефектов, не обнаруженных ранее другими видами проверок [1-3]. Известно, что тестирование программной системы является сложным, длительным и дорогостоящим видом деятельности, требующим около трети времени и почти половины общей стоимости разработки ПО [3-4]. Поднять качество ПО можно путем сокращения сроков и стоимости разработки, в частности, за счет повышения эффективности его тестирования. Для решения этой сложной проблемы предложены и частично автоматизированы различные способы генерации тестовых данных, такие как методы случайной, символической, динамической и т. п. генерации на основе структурного и функционального тестирования [2-4]. Однако этого явно недостаточно, генерация тестовых данных в значительной степени выполняется вручную. Поэтому в настоящее время идет активный поиск новых моделей (или развития и модификаций существующих). В последние годы при решении этой проблемы широко применяются методы искусственного интеллекта, прежде всего био-инспирированные алгоритмы (генетические, муравьиные, роевые и т. п. [5]). В частности, получены обнадеживающие результаты по использованию этих алгоритмов в тестировании ПО.
Для повышения эффективности, «интеллектуальности» и расширения функций автоматизации тестирования широко применяются методы искусственного интеллекта (ИИ). Эволюционные вычисления (Эв) [5] представляют один из наиболее перспективных подходов ИИ. Эв используют принципы и терминологию, заимствованные у биологической науки - генетики. В Эв каждая особь представляет потенциальное решение некоторой проблемы и кодируется специальным образом (в простейшем случае двоичным числом). Множество особей - потенциальных решений составляет популяцию. В Эв наиболее популярным (но не единственным) является генетический алгоритм (ГА), который хорошо показал себя при решении многих задач комбинаторной оптимизации [5], в частности, проблем тестирования как аппаратной части, так и программного обеспечения.
При решении конкретной задачи с помощью ГА необходимо определить особь, популяцию, эволюционные операторы и фитнесс-функцию. Потенциальное решение представляется хромосомой - некоторым кодом, состоящим из элементов-генов. Таким образом, ГА оперируют закодированными хромосомами (генотипами), а не решениями (фенотипами) проблемы. Поиск (суб)опти- мального решения проблемы в Эв выполняется в процессе искусственной эволюции популяции - последовательного преобразования одного конечного множества решений в другое с помощью генетических операторов репродукции, кроссинговера и мутации. В общем случае ГА может быть представлен следующей последовательностью операторов [5]:
- Создание начальной популяции.
- Оценка популяции.
- Выбор наилучших особей.
- Приемлемое решение найдено?
- Если да, то конец, поиск лучшего решения в полученной популяции.
- Создание новой популяции на основе текущей с применением генетических операторов. Перейти на шаг 2.
Напомним, что для того, чтобы применить генетический алгоритм для решения некоторой проблемы, необходимо прежде всего определить:
- Кодирование (представление потенциального решения).
- Для определенного кодирования выбрать или разработать генетические операторы кроссовера, мутации и репродукции.
- Фитнесс-функцию из условия задачи.
- Параметры ГА: число особей в популяции, значения вероятностей кроссовера Pc nPm ит. п.
Далее будет показано, что различные эволюционные методы тестирования ПО решают эти этапы по-разному.
После появления в 1995 году стандарта ISO/IEC 12207 [4], где все действия по созданию ПО систематизированы в виде отдельных процессов жизненного цикла, тестирование отнесено к основным процессам. Поэтому в настоящее время тестирование интегрировано с процессами разработки и рассматривается как непрерывная многоуровневая деятельность на протяжении всего жизненного цикла ПО независимо от его критичности.
Тестирование программного обеспечения является одним из основных методов, которые обеспечивают высокое качество программного обеспечения. Тестирование программного обеспечения выявляет наличие неисправностей, вызывающих отказ программного обеспечения. Отметим, что тестирование программного обеспечения занимает много времени и требует значительных ресурсов (около 50 %). Тестирование программного обеспечения также можно определить как процесс верификации и проверки (валидации) программного обеспечения для обеспечения того, чтобы оно отвечало ожидаемым как техническим, так и бизнес-требованиям. При этом верификация выполняется для проверки соответствия программного обеспечения спецификации и близка к структурному тестированию, тогда как валидация ближе к функциональному тестированию и выполняется путем выполнения тестируемого программного обеспечения.
В широком смысле методы тестирования включают функциональное (по методу черного ящика) и структурное тестирование (метод «белого ящика). Функциональное тестирование основано на функциональных требованиях, тогда как структурное тестирование базируется на выполнении самого кода. Тестирование по методу серого ящика представляет собой гибрид тестирования методом белого и черного ящика. Тестирование может выполняться вручную или автоматически, используя инструменты тестирования. Установлено, что автоматизированное программное обеспечение тестирования лучше, чем ручное тестирование. Однако очень мало инструментальных средств генерации тестовых данных, которые коммерчески доступны в настоящее время. Различные методы предложены для автоматической генерации тестовых данных или тестовых примеров [1-3]. В последнее время большая часть работ в этом направлении выполняется с использованием технологий мягких вычислений, таких как нечеткие системы, нейронные сети, генетические алгоритмы, генетическое программирование и эволюционные вычисления, которые дают новые возможности при решении проблем в области тестирования программного обеспечения. Эволюционное тестирование - это новая методология для автоматической генерации высококачественных тестовых данных [6].
Структурное тестирование может быть выполнено в виде тестирования потоков данных или тестирования путей. Последнее включает в себя создание набора путей, которые покрывают каждую ветвь в программе, и нахождение набора тестовых данных, которые реализуют каждый путь в этом наборе путей. При тестировании потока данных основное внимание уделяется точкам программ, в которых переменные получают значения (вычисляются), и точкам, в которых эти значения используются. Далее представлены некоторые подходы по применению ГА в тестировании программ по методу белого ящика. Прежде всего их можно разделить на две группы: 1) тестирование потока данных; 2) тестирование путей [6].
Предложен структурно ориентированный автоматический метод генерации тестовых данных на основе ГА, который использует зависимость потока данных в программе при выполнении универсального критерия [7]. Поток управления программой представляется здесь направленным графом с множеством узлов и множеством ребер. Каждый узел представляет группу последовательных операторов, которые вместе составляют основной блок. Тогда ребра графа могут передавать поток управления между узлами. Путь - это конечная последовательность узлов, соединенных ребрами. Полный путь - это путь, первым узлом которого является начальный узел и чей последний узел является выходным узлом. Анализ потока данных фокусирует внимание на взаимодействиях между определениями переменных (defs) и ссылками (uses использованием этих переменных) в программе. Переменные в тестируемой программе делятся на переменные, используемые в вычислениях (c-uses) и предикатах (p-uses). Переменные c-uses используются в вычислениях или в предикатах программы; в то время как переменные p-uses связаны с ребрами графа потоков управления. Цель анализа потока данных состоит в том, чтобы найти определение (defs) каждой переменной в программе и ее использование (uses), на которые могут повлиять эти defs, то есть найти def-use-ассоциации. Такие отношения потока данных могут быть представлены следующими двумя множествами: dcu (i) - множество всех определений переменных defs, для которых есть пути def-clear к их c-uses в узле i; dpu (i, j) - множество всех определений переменных defs, для которых есть def-clear пути к их p-uses ребра (i, j). Используя местоположение переменной defs и ее использования uses в тестируемой программе в сочетании с алгоритмом достижимости основного состояния, можно определить множества dcu (i) и dpu (i, j). С помощью алгоритма достижимости основного состояния определяются два множества: достижимости - reach (i) и влияния - avail (i), где достижимость reach (i) представляет собой множество всех переменных defs, которые достигаются из узла i, а влияния avail (i) являются множеством всех доступных переменных defs, влияющих на узел i. Таким образом, имеем объединение множества глобальных переменных defs, которые влияют на узел i, и множества всех переменных, достижимых из этого узла:
dcu(i): reach(i) n c - used(i) , dpu(i, j): avail(i) n p - used(i, j), где c-use (i) - множество переменных, для которого узел i содержит глобальные c-use, a p-use (i, j) - множество переменных, для которых ребро (i, j) содержит p-use. При оценке качества тестирования используется критерий всех использований (all-uses), который требует определения пути от каждого определения def переменной к каждому ее использованию (c-use и p-use) с той переменной, которую нужно пройти. Следует отметить, что этот критерий также покрывает другие критерии, которые применяются при тестировании потоков данных.