Resolução de questões CTFL: Q13S1

Acredito que a grande dificuldade desta questão é o desconhecimento da complexidade ciclomática de McCabe, eu mesmo não fazia a menor idéia do que era, antes de ver essa questão. E o pior de tudo é que o Syllabus não fala dela, e o máximo que podemos encontrar no material sedido pela BSTQB é a sua definição no ISTQB – Glossário de Termos de Teste.

Mas o intuito do post não é explicar a complexidade ciclomática de McCabe, e sim apresentar a resolução da questão 13 do simulado 1. Quem quiser entender melhor a complexidade ciclomática, recomendo os seguintes links abaixo:

http://logbr.reflectivesurface.com/2008/11/12/conceitos-de-programacao-complexidade-ciclomatica/

http://www.antoniopassos.pro.br/blog/?p=347

http://en.wikipedia.org/wiki/Cyclomatic_complexity

Agora vamos para a questão…

Dado o seguinte programa:

1 IF  X < Y

2 THEN  Statement 1;

3 ELSE IF  Y >=  Z

4 THEN Statement  2;

5 END

A complexidade ciclomática de McCabe é :

a) 2

b) 3

c) 4

d) 5

Análise do código

Temos dois IFs, sendo que o segundo é dependente do primeiro, ou seja, a sua execução depende do resultado do primeiro IF, pois o segundo IF está associado ao ELSE do primeiro IF.

Acredito que essa história de primeiro e segundo IF, pode ter te deixado confuso querido(a) leitor(a). Então, vamos facilitar as coisas, abaixo segue o fluxo do código da questão:

Fluxo

Resolução

Temos duas maneiras de resolver essa questão: fazendo o fluxo com os caminhos lógicos possíveis (parecido com a figura acima), ou usando a fórmula da complexidade ciclomática.

Vamos primeiro para a maneira mais difícil, usando a fórmula:

M = E − N + 2P
M= complexidade ciclomática
E= número de arestas (linhas/caminhos)
N= número de nodos
P= número de componentes conectados

M= 6 – 5 + 2X1

M= 1 + 2

M =3

Portanto já sabemos que a complexidade ciclomática é igual a 3.

Agora vamos resolver essa mesma questão, de uma maneira mais simples e fácil:

Fluxo

Sabendo que a complexidade ciclomática medi o número de caminhos de uma determinada função. Fica claro na figura acima, que o código apresentado tem 3 caminhos lógicos possíveis:

Verde: X é menor que Y > executar o Statement 1 > END

Azul: X é maior que Y > Y é menos que Z > END

Vermelho: X é maior que Y > Y é maior igual que Z > THEN Statement  2 > END

E o motivo por eu achar a segunda maneira mais fácil é simples: eu dificilmente foi lembrar da fórmula da complexidade ciclomática na hora da prova. E como tenho certeza que a pessoa que irá aplicar o exame não irá colocar a fórmula na lousa (como nos tempos de escola), prefiro fazer o fluxo do código, afinal não vou esquecer de como faz círculos e retas, durante a prova.

Logicamente essa é minha opinião, se você acha melhor resolver usando a fórmula, tudo bem.

Resposta

Alternativa: b)  3

Por hoje é só pessoal. No próximo post irei resolver a questão 5 do simulado 2, a que o Clauriston comentou no post anterior. Até lá!

Atualização 13 de Novembro de 2009

Estava hoje dando uma olhada no artigo publicado pelo próprio McCabe, e vi que ele mesmo diz que é possível calcular a complexidade ciclomática de uma forma bem mais simples (e a Cristina até citou nos comentários).

Fórmula mágica:

Quantidade de decisões + 1 = complexidade ciclomática 😀

OBS.: Considerando a análise de um programa que tenha apenas um ponto de entrada e um de saída.

Trecho retirado do artigo: “This proves that the cyclomatic complexity  of a structured program equals the number of predicates plus one […]

Fica aí a dica!

Fique por dentro das novidades, assine o feed do QualidadeBR.

Assine o feed

Anúncios

9 comentários sobre “Resolução de questões CTFL: Q13S1

  1. Olá, fiquei com uma dúvida nesta resolução. Dada a fórmula M = E − N + 2P, eu entendi o valor E = 6, N = 5, mas nao entendi o pq do P ter sido substituído por X1 e pelas contas é valor X1 = 1. Pode me explicar este cálculo? Outra consideração em relação esta questão, posso fazer o seguinte cálculo de nº de IF + 1 para a complexidade ciclomática?

    Grata,
    Cris

    Responder
  2. Olá Cristina!

    Na verdade o valor do P é 1, pois temos apenas um componente conectado. E geralmente, o valor dele será sempre 1 quando estamos analisando uma função de um software, pois ela sempre inicia de um ponto único e os nodos estão conectados entre eles.

    Quanto a possibilidade de fazer o cálculo da complexidade ciclomática, usando o nº de IF + 1, até que me parece ser possível (pelos testes que fiz), mas somente nos casos das funções que só tem IFs, caso ela tenha switch, por exemplo, o cálculo já não pode ser feito dessa maneira. 🙂

    Obrigado pelo comentário Cristina!

    Abraços!

    Responder
  3. Ola Fabrício,

    Eu não entendi direito a diferença deste teste de complexidade ciclomática para o de cobertura de desvio. Você poderia me explicar melhor a diferença?
    Obrigado!

    Responder
    • Olá Caio!

      A complexidade ciclomática é uma métrica para identificar a complexidade de um programa. Já a cobertura de desvio é uma métrica usada em Teste de Software para poder identificar a porcentagem de cobertura alcançada com os testes, de acordo com a quantidade de desvios que o programa possui.

      Ou seja, uma está preocupada com a complexidade do programa, e a outra com a garantia de que todos os desvios foram testados.

      Espero te sanado a dúvida, caso contrário, só falar. 🙂

      Abraços!

  4. Oi Fabrício,

    Entendi os conceitos, mas na prática, os valores sempre serão iguais?
    Realizo o teste da cobertura de desvio primeiro. Para realizar a complexidade ciclomática utilizo os mesmos testes da cobertura de desvio.
    Faço essa pergunta, pois a cobertura de desvio cobre os caminhos (felizes e infelizes). Ou seja, ele passa por todas opções. E a complexidade ciclomática também tem que passar por todos caminhos.
    É isso mesmo, ou estou viajando?

    Responder
  5. Olá Juliana!

    Você está certa. Os valores sempre serão iguais, pois há uma relação direta entre a complexidade ciclomática e a cobertura de desvio.

    A única coisa que muda é o objetivo:

    – A complexidade ciclomática mede a quantidade de caminhos existentes no código;
    – Já a cobertura de desvio testa todos os caminhos existentes no código, logo 100% de cobertura de desvio é igual ao valor da complexidade ciclomática.

    Ou seja, você tendo a informação do valor da complexidade ciclomática de uma determinada função, você já saberá quantos testes serão necessários para garantir 100% da cobertura de desvio. 🙂

    Espero ter ajudado, qualquer coisa só falar. 😉

    Abraços!

    Responder
  6. Olá Fabricio,

    Eu não entedi muito bem o cálculo da complexidade ciclomática em alguns pontos:

    1º – porque E recebeu o valor de 6, não entedi que valor é esse.
    2º – porque na fórmula está com 2P, encontrei em outro site um fórmula um pouco diferente: v(G) = e – n + p.

    Se você puder me explicar melhor, eu agradeço.

    Responder
    • Oi Edijane!

      Respondendo as perguntas:

      1º – porque E recebeu o valor de 6, não entedi que valor é esse.
      Porque o E é o número de arestas, ou seja, o número de caminhos possíveis, e observando o primeiro fluxo notamos que são possíveis 6 caminhos, por isso E é igual a 6.

      2º – porque na fórmula está com 2P, encontrei em outro site um fórmula um pouco diferente: v(G) = e – n + p.
      Pelo que entendi é 2P, porque estamos analisando programas, nos quais a saída não retorna ao início. Essa é uma fórmula alternativa usada quando o nodo de saída retorna ao início, ou seja um loop, se quiser saber maiores detalhes sobre a fórmula, recomendo o paper do próprio McCabe: http://classes.cecs.ucf.edu/eel6883/berrios/notes/Paper%204%20(Complexity%20Measure).pdf

      Espero ter esclarecido as dúvidas, qualquer coisa só falar. 😉

      Abraços!

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s