Complexidade ciclomática em testes de software com exemplos

⚡ Resumo Inteligente

A Complexidade Ciclomática é uma métrica de software desenvolvida por Thomas McCabe em 1976 que contabiliza os caminhos independentes em um programa. Ela é calculada a partir de um grafo de fluxo de controle e fornece o número de casos de teste necessários para a cobertura completa dos ramos.

  • 📐 Duas Fórmulas: V(G) = E – N + 2 a partir do gráfico, ou V(G) = P + 1 a partir da contagem de pontos de decisão.
  • 🧮 Significado direto: O valor corresponde ao número máximo de caminhos independentes e, portanto, aos casos de teste necessários.
  • 🗺️ Base gráfica: Os nós representam as etapas de processamento e as arestas representam o fluxo de controle entre elas.
  • 🟢 1 para 10: Código estruturado e bem escrito, com alta testabilidade e baixo custo de manutenção.
  • 🟠 21 para 40: Código muito complexo com baixa testabilidade, onde a refatoração geralmente custa menos do que os testes.
  • 🛠️ Ferramentas: SonarQube, Visual Studio Code Metrics, Radon e Lizard calculam isso automaticamente.

Complexidade Ciclomática em Teste de Software

Qual é a complexidade ciclomática de McCabe?

Complexidade Ciclomática em Teste de Software é uma métrica de teste usada para medir a complexidade de um programa de software. É uma medida quantitativa de caminhos independentes no código-fonte de um programa de software. A complexidade ciclomática pode ser calculada usando gráficos de fluxo de controle ou em relação a funções, módulos, métodos ou classes dentro de um programa de software.

Caminho independente é definido como um caminho que possui pelo menos uma aresta que não foi percorrida antes em nenhum outro caminho.

Esta métrica foi desenvolvida por Thomas J. McCabe em 1976 e é baseada em uma representação do fluxo de controle do programa. O fluxo de controle descreve um programa como um gráfico que consiste em nós e arestas.

No gráfico, os nós representam tarefas de processamento enquanto as arestas representam o fluxo de controle entre os nós.

Complexidade ciclomática de McCabe

Notação de gráfico de fluxo para um programa

A notação Flow Graph para um programa define vários nós conectados pelas arestas. Abaixo estão diagramas de fluxo para instruções como if-else, While, Until e sequência normal de fluxo.

Notação de gráfico de fluxo para um programa

Como calcular a complexidade ciclomática

Representação matemática:

Matematicamente, é um conjunto de caminhos independentes através do diagrama gráfico. Code A complexidade do programa pode ser definida usando a fórmula –

V(G) = E - N + 2

Onde,

E – Número de arestas

N – Número de nós

V (G) = P + 1

Onde P = Número de nós predicados (nó que contém condição)

Exemplo -

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;
j=j+1;

end do;

O gráfico de fluxo para este programa será

Calcule a complexidade ciclomática

Computando matematicamente,

  • V(G) = 9 – 7 + 2 = 4
  • V(G) = 3 + 1 = 4 (os nós de condição são 1,2 e 3 nós)

Conjunto básico, os quatro caminhos de execução independentes:

  • 1, 7
  • 1, 2, 6, 1, 7
  • 1, 2, 3, 4, 5, 2, 6, 1, 7
  • 1, 2, 3, 5, 2, 6, 1, 7

Propriedades da Complexidade Ciclomática

A seguir estão as propriedades da complexidade ciclomática:

  1. V (G) é o número máximo de caminhos independentes no gráfico
  2. V(G) >=1
  3. G terá um caminho se V (G) = 1
  4. Uma diretriz comumente utilizada é manter V(G) em 10 ou menos para um único módulo.

Como essa métrica é útil para testes de software

O teste de caminho básico é uma técnica de caixa branca que garante a execução de pelo menos uma instrução durante o teste. Ele verifica cada caminho linearmente independente através do programa, o que significa que O número de casos de teste necessários é igual à complexidade ciclomática do programa..

Esta métrica é útil devido às propriedades da complexidade ciclomática (M) –

  1. M pode ser o número de casos de teste para obter cobertura de filial (limite superior)
  2. M pode ser o número de caminhos através dos gráficos. (Limite inferior)

Considere este exemplo -

If (Condition 1)
Statement 1

Else
Statement 2

If (Condition 2)
Statement 3

Else
Statement 4

A complexidade ciclomática para este programa será 8-7+2=3.

Como a complexidade foi calculada como 3, três casos de teste são necessários para a cobertura completa do caminho do exemplo acima.

Passos a seguir

As etapas a seguir devem ser seguidas para calcular a complexidade do Ciclomático e projetar casos de teste.

Etapa 1 – Construção de gráfico com nós e arestas do código

Etapa 2 – Identificação de caminhos independentes

Etapa 3 – Cálculo da Complexidade Ciclomática

Etapa 4 – Desenho de Casos de Teste

Uma vez formado o conjunto básico, CASOS DE TESTE deve ser escrito para executar todos os caminhos.

Mais sobre V (G)

A complexidade ciclomática pode ser calculada manualmente se o programa for pequeno. Ferramentas automatizadas precisam ser usadas se o programa for muito complexo, pois envolve mais gráficos de fluxo. Com base no número de complexidade, a equipe pode concluir sobre as ações que precisam ser tomadas para mensuração.

A tabela a seguir fornece uma visão geral do número de complexidade e o significado correspondente de v(G):

Número de complexidade Significado
1 a 10

Código estruturado e bem escrito

Alta testabilidade

O custo e o esforço são menores.

11 a 20

Código complexo

Testabilidade média

Custo e esforço são médios.

21 a 40

Código muito complexo

Baixa testabilidade

O custo e o esforço são elevados.

> 40

Nem um pouco testável

Custo e esforço muito elevados

Ferramentas para calcular a complexidade ciclomática

Muitas ferramentas estão disponíveis para determinar a complexidade do aplicativo. Algumas ferramentas de cálculo de complexidade são utilizadas para tecnologias específicas. A complexidade pode ser encontrada pelo número de pontos de decisão em um programa. Os pontos de decisão são instruções if, for, for-each, while, do, catch, case em um código-fonte.

Exemplos de ferramentas são

  • OCLint – Analisador de código estático para C e linguagens relacionadas
  • SonarQube – Apresenta relatórios sobre a complexidade ciclomática e cognitiva em mais de 25 idiomas.
  • Visual Studio Code Métricas – Análise de complexidade ciclomática integrada para assemblies .NET
  • Radon e Lizard – Analisadores de complexidade de linha de comando para Python e para projetos multilíngues, respectivamente
  • Métricas – Encontre métricas em Java aplicativos relacionados

Usos da Complexidade Ciclomática

A Complexidade Ciclomática pode ser muito útil em

  • Ajuda desenvolvedores e testadores a determinar execuções de caminhos independentes
  • Os desenvolvedores podem garantir que todos os caminhos foram testados pelo menos uma vez.
  • Ajuda-nos a focar mais nos caminhos descobertos
  • Melhore a cobertura do código em Engenharia de Software
  • Avalie o risco associado ao aplicativo ou programa
  • Usar essas métricas no início do ciclo reduz mais riscos do programa

Como reduzir a complexidade ciclomática

Um número de complexidade elevado é um sinal, não um veredito. Quatro refatorações são responsáveis ​​pela maior parte da redução alcançável na prática.

  • Extracmétodo t. Mover uma ramificação para sua própria função divide a complexidade entre dois módulos. O total em todo o sistema permanece inalterado, mas cada unidade torna-se testável independentemente.
  • Substitua uma cadeia condicional por uma pesquisa. Uma longa sequência de instruções if-else-if testando a mesma variável se transforma em um mapa ou um switch, que condensa muitos pontos de decisão em um só.
  • Utilize cláusulas de guarda. Retornar um valor inválido antecipadamente elimina o aninhamento criado por um único bloco if-else grande, sem alterar o comportamento.
  • Substitua condicionais por polimorfismo. Quando uma condição depende de um tipo, mover cada ramo para sua própria classe remove a decisão por completo.

Antes, com V(G) = 4:

if (user != null) {
    if (user.isActive()) {
        if (user.hasRole("admin")) {
            return grantAccess();
        }
    }
}
return denyAccess();

Depois, com o mesmo comportamento e o ninho removido:

if (user == null) return denyAccess();
if (!user.isActive()) return denyAccess();
if (!user.hasRole("admin")) return denyAccess();
return grantAccess();

Uma ressalva em relação à métrica. A complexidade ciclomática contabiliza decisões, não dificuldade. Uma instrução switch com vinte casos simples obtém uma pontuação de 21, mas é fácil de ler, enquanto um bloco profundamente aninhado com pontuação 8 pode ser muito mais difícil de entender. Use o número para encontrar candidatos para revisão, não como um alvo a ser explorado.

Perguntas Frequentes

A diretriz comum é de dez ou menos módulos por módulo. Entre 11 e 20, o código é complexo, mas gerenciável. Acima de 20, a testabilidade cai drasticamente e, acima de 40, o módulo geralmente é considerado impossível de testar da forma como está escrito.

Ambos os métodos fornecem o mesmo resultado. P + 1 é mais rápido para cálculos manuais porque você só conta os pontos de decisão. E – N + 2 é o método usado por ferramentas, já que elas já constroem o grafo de fluxo de controle.

Não necessariamente. A complexidade ciclomática contabiliza as decisões em vez da dificuldade, portanto, um switch simples com vinte casos simples tem uma pontuação alta, mantendo-se fácil de ler. Considere o número como um lembrete para revisão.

Eles combinam essa informação com a frequência de alterações e o histórico de defeitos para classificar quais módulos apresentam maior risco, direcionando os esforços de revisão e teste para o código com maior probabilidade de falhar.

Sim. Os assistentes de IA propõem cláusulas de salvaguarda, por exemplo.tracMétodos ted e tabelas de consulta que reduzem a contagem. Verifique o comportamento com o conjunto de testes existente, pois uma refatoração que altera a lógica anula o propósito.

Resuma esta postagem com: