Você está na página 1de 25

Testes de Software – Complexidade

Ciclomática

Engenharia de Software
Prof. Dr. Fábio Aiub Sperotto
fabio.sperotto@ifsc.edu.br
Introdução

Os testes caixa-branca são testes onde podemos verificar as
implementações;


Os primeiros testes que realizamos nesta categoria são os testes unitários;


Mais conceitos de testes na caixa-branca podem auxiliar numa métrica de
compreensão sobre o código, além de evidenciar que mais erros podem
acontecer (e os testes unitários ainda não serem suficientes). Podemos
garantir também que cada comando e condição da nossa aplicação, seja
executada pelo menos uma vez.

– Identificar os comandos para exercitar (testar) – Complexidade


Ciclomática;

– Definir caminhos independentes, quais comandos serão testados;

– Criar casos de testes e realizá-los;.

2
Complexidade Ciclomática - CC

A diferença com a cobertura de testes fica no contexto, isto é, aqui vamos
calcular caminhos independentes.


A CC É uma medida de complexidade de programa baseada no número de
estruturas de controle e repetição. Proposta originalmente por McCabe, em
1976 com revisões em 1996.


Não é relacionado a qualidade de código e sim da complexidade do mesmo.


Indica o número máximo de execuções necessárias para testar ou exercitar
todas as instruções do programa. É aplicada em cada função mas pode ser
aplicada por toda uma classe.


Formas de cálculo:

– Simplificada;

– Grafo de fluxo de programa.


3
Complexidade Ciclomática - Simplificado


Para determinação do cálculo CC Simplificado, podemos contabilizar as
estruturas de controle/decisão. Cada uma recebe 1 ponto:

– IF-THEN: 1 ponto;

– IF-THEN-ELSE: 1 ponto;

– CASE: 1 ponto para cada opção, exceto OTHERWISE;

– FOR: 1 ponto;

– WHILE: 1 ponto;

– OR ou AND na condição de qualquer das estruturas acima,


acrescenta-se 1 ponto para cada OR ou AND.

Exemplo: 2 IFs + 1 FOR → 3 + 1 = 4

4
Complexidade Ciclomática - Simplificado

– Blocos try-catch: 1 ponto, utilize a estrutura do IF e dos operadores


lógicos AND e OR como referência;

CCS = 4 CATCH + 1 => 5


5
Complexidade Ciclomática - Simplificado

– Chamadas de funções dentro de laços de repetição:



Acrescente pontuações somente se verificar que existem
caminhos independentes a partir de qualquer linha de instrução.

Se é uma lista que apenas chama o método add() a cada
iteração, para adicionar um item, então sempre chegará no
mesmo caminho. Diferentemente do try-catch não contabilize
mais do que o próprio laço de repetição.

Existem bibliotecas que podem auxiliar na contabilização
automática, não como componente do projeto mas auxiliando no
projeto.

6
Qual o CCS?

7
Complexidade Ciclomática - Simplificado


Exemplo:


CCS = 1 (IF) + 1;


CCS = 2;

8
Complexidade Ciclomática - Simplificado


Exemplo:


CCS = 1 (FOR) + 1 (IF) + 1 = 3;

9
Complexidade Ciclomática - Simplificado


Exemplo:

Fonte


CCS = x + 1 = ?

10
Complexidade Ciclomática - Fluxograma


A forma completa de cálculo ciclomático define a execução do código
no formato de fluxograma.


v(G) = e - n + 2, onde e e n são os números de arestas e nós, no
fluxograma de instruções. O 2 tem relação a componentes conectados,
subgrafo específico do contexto a ser calculado.

– v → número ciclomático;

– G → teoria dos grafos.



É necessário construir um grafo colocando os comandos como nós e
nas arestas os fluxos do programa.


Estruturas de controle são representadas em nós distintos que
indiquem a decisão e a repetição.

11
Complexidade Ciclomática - Fluxograma

12
Complexidade Ciclomática - Fluxograma

13
Complexidade Ciclomática - Fluxograma

14
Complexidade Ciclomática - Fluxograma

15
Complexidade Ciclomática - Fluxograma

16
Complexidade Ciclomática - Fluxograma


Exemplo:


CCS = 1 (IF) + 1 = 2;


v(G) = e - n + 2 => 4 arestas – 4 nós + 2 = 2;

17
Complexidade Ciclomática - Fluxograma

Exemplo:


CCS = 1 (FOR) + 1 = 2;


v(G) = e - n + 2 => 3 arestas - 3 nós + 2 = 2;

18
Complexidade Ciclomática - Fluxograma

Exemplo:


CCS = estruturas + 1 = ?;


v(G) = e - n + 2 => ? arestas - ? nós + 2 = ?;

19
Complexidade Ciclomática - Fluxograma

Exemplo:


CCS = 1 (FOR) + 1 (IF) + 1 = 3;


v(G) = e - n + 2 => 7 arestas - 6 nós + 2 = 3;

20
Complexidade Ciclomática - Fluxograma

Exemplo:


CCS = 1 (FOR) + 1 (IF) + 1 (AND) + 1 = 4;


v(G) = e - n + 2 => 9 arestas - 7 nós + 2 = 4;

21
Complexidade Ciclomática - Fluxograma

É possível utilizar ferramentas que geram fluxogramas das
implementações. Só tenha cuidado que nem sempre é gerado um
fluxograma correto baseado na contabilidade de CC.


Exemplo: utilize aplicações como https://app.code2flow.com e verifique o
cálculo para o algoritmo não recursivo de Euclides (verifica o maior
divisor entre dois números inteiros positivos), no slide a seguir.


Qual o v(G) que pode ser calculado?

22
Complexidade Ciclomática - Fluxograma
int euclidiano(int i, int j){
int small, large, remainder;

if (i <= j){
small = i;
}else{
small = j;
}

if (i <= j){
large = j;
}else{
large = i;
}

while (small > 0){


remainder = large % small;
large = small;
small = remainder;
}

return large;

}
23
Complexidade Ciclomática - Fluxograma

Os estudos originais delimitam como ótimo a questão da CC manter-se
no máximo em 10. Podem existir implementações que até 15 ainda
demonstram boa CC:

Valor da Métrica Informação

1 - 10 Fácil de compreender. Alta


testabilidade.

10 - 20 Código complexo mas ainda


compreensível. Média testabilidade.

> 20 Código muito complexo e difícil de


entender. Baixa testabilidade.

> 50 Código muito complexo e difícil de


entender. Nenhuma testabilidade.
Fonte
25
Referências

WATSON, Arthur H; McCabe, Thomas J. Structured Testing: A Testing
Methodology Using the Cyclomatic Complexity Metric. Gaithersburg:
National Institute of Standards and Technology (NIST), 1996. 124 p. (Série -
NIST Special Publication 500-235). Disponível em
http://www.mccabe.com/pdf/mccabe-nist235r.pdf

Perguntas e Respostas Educative.io: What is cyclomatic complexity?
Disponível em
https://www.educative.io/answers/what-is-cyclomatic-complexity

Normark, Kurt. Notas de aula: Test of Object-oriented Programs.
Departamento de Ciência da Computação – Universidade Aalborg,
Dinamarca. Disponível em
https://homes.cs.aau.dk/~normark/oop-csharp/html/notes/test.html

Schults, Carlos. How to Reduce Cyclomatic Complexity: A Complete Guide.
Disponível em https://linearb.io/blog/reduce-cyclomatic-complexity/

26

Você também pode gostar