Учебники

Цикломатическое тестирование

Чтобы понять цикломатическую сложность, давайте сначала поймем —

Что такое метрика программного обеспечения?

Измерение — это не что иное, как количественное указание размера / размера / емкости атрибута продукта / процесса. Метрика программного обеспечения определяется как количественная мера атрибута, которым обладает система программного обеспечения в отношении стоимости, качества, размера и графика.

Пример-

Measure - No. of Errors
Metrics - No. of Errors found per person

В этом уроке вы узнаете

Что такое цикломатическая сложность?

ЦИКЛОМАТИЧЕСКАЯ СЛОЖНОСТЬ — это метрика программного обеспечения, используемая для измерения сложности программы. Это количественная мера независимых путей в исходном коде программы. Независимый путь определяется как путь, имеющий хотя бы одно ребро, которое ранее не проходило ни в одном другом пути. Цикломатическая сложность может быть рассчитана относительно функций, модулей, методов или классов в программе.

Эта метрика была разработана Томасом Дж. МакКейбом в 1976 году и основана на представлении программы потока управления. Поток управления изображает программу в виде графика, который состоит из узлов и ребер.

На графике узлы представляют задачи обработки, а ребра представляют поток управления между узлами.

Цикломатическая сложность изображения.

Блок-схема обозначений для программы:

Нотация Flow Graph для программы определяет несколько узлов, соединенных через ребра. Ниже приводятся блок-схемы для операторов типа if-else, while, while и нормальной последовательности потоков.

Блок-схема цикломатической сложности

Как рассчитать цикломатическую сложность

Математическое представление:

Математически это множество независимых путей через диаграмму графа. Код сложности программы можно определить по формуле —

V(G) = E - N + 2

Куда,

E — количество ребер

N — количество узлов

V (G) = P + 1

Где P = количество узлов предиката (узел, содержащий условие)

Пример —

i = 0;
n=4; //N-Number of nodes present in the graph

while (i<n-1) do
j = i + 1;

while (j<n) do

if A[i]<A[j] then
swap(A[i], A[j]);

end do;
i=i+1;

end do;

График потока для этой программы будет

Блок-схема цикломатической сложности для этой Программы

Вычисляя математически,

  • V (G) = 9 — 7 + 2 = 4
  • V (G) = 3 + 1 = 4 (узлами условий являются 1,2 и 3 узла)
  • Базисный набор — набор возможных путей выполнения программы
  • 1, 7
  • 1, 2, 6, 1, 7
  • 1, 2, 3, 4, 5, 2, 6, 1, 7
  • 1, 2, 3, 5, 2, 6, 1, 7

Свойства цикломатической сложности:

Ниже приведены свойства цикломатической сложности:

  1. V (G) — максимальное количество независимых путей в графе
  2. V (G)> = 1
  3. G будет иметь один путь, если V (G) = 1
  4. Минимизировать сложность до 10

Насколько этот показатель полезен для тестирования программного обеспечения?

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

Этот показатель полезен из-за свойств цикломатической сложности (M) —

  1. M может быть числом тестовых случаев для достижения покрытия ветви (верхняя граница)
  2. M может быть числом путей через графы. (Нижняя граница)

Рассмотрим этот пример —

If (Condition 1)
Statement 1

Else
Statement 2

If (Condition 2)
Statement 3

Else
Statement 4

Цикломатическая сложность для этой программы составит 8-7 + 2 = 3.

Поскольку сложность рассчитана как 3, для полного охвата пути для приведенного выше примера необходимы три контрольных примера.

Шаги, которым нужно следовать:

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

Шаг 1 — Построение графа с узлами и ребрами из кода

Шаг 2 — Идентификация независимых путей

Шаг 3 — Расчет цикломатической сложности

Шаг 4 — Дизайн тестовых случаев

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

Подробнее о V (G):

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

Следующая таблица дает обзор по числу сложности и соответствующему значению v (G):

Номер сложности Смысл
1-10 Структурированный и хорошо написанный код

Высокая

стоимость тестируемости и усилия меньше

10-20 Сложный код

Средний Тестируемость

Стоимость и усилия — это средний

20-40 Очень сложный код

Низкая тестируемость

Стоимость и усилия высоки

> 40 Совсем не поддается проверке

Очень высокая стоимость и усилия

Инструменты для расчета цикломатической сложности:

Многие инструменты доступны для определения сложности приложения. Некоторые инструменты расчета сложности используются для конкретных технологий. Сложность может быть найдена по количеству точек принятия решения в программе. Решающими моментами являются if for for for, while, do, catch, case-выражения в исходном коде.

Примеры инструментов

  • OCLint — Статический анализатор кода для C и родственных языков
  • Reflector Add In — метрики кода для сборок .NET
  • GMetrics — поиск метрик в приложениях, связанных с Java

Использование цикломатической сложности:

Цикломатическая Сложность может оказаться очень полезной в

  • Помогает разработчикам и тестировщикам определять независимые пути выполнения
  • Разработчики могут заверить, что все пути были протестированы хотя бы раз
  • Помогает нам больше сосредоточиться на открытых путях
  • Улучшение покрытия кода в программной инженерии
  • Оценить риск, связанный с приложением или программой
  • Использование этих метрик в начале цикла снижает риск программы

Вывод:

Cyclomatic Complexity — это программный показатель, полезный для структурированного тестирования или тестирования White Box . Он в основном используется для оценки сложности программы. Если точек решения больше, то сложность программы больше. Если программа имеет большое число сложности, то вероятность ошибки высока с увеличением времени на обслуживание и устранение неисправностей.