Você está na página 1de 73

Cobertura de Código

Prof. Jean-Rémi Bourguet

Teste de Software
Execução Automática de Casos de Teste

I Os testes no desenvolvimento de software são executados para...


I ...garantir o comportamento do software conforme o esperado.

Cobertura de Código 2/16


Execução Automática de Casos de Teste

I As técnicas utilizam os requisitos para criação dos casos de teste.


I A saída obtida após a entrada de dados é comparada com a esperada.

Cobertura de Código 2/16


Execução Automática de Casos de Teste

I Existem técnicas de testes que ajudam a criar casos de teste.


I A técnica de teste baseada em defeitos consiste na introdução de...
I ...defeitos típicos no código para criar novas versões defeituosas.
I Assim, podemos avaliar os casos de teste do programa original!

Cobertura de Código 2/16


Execução Automática de Casos de Teste

I Testes de caixa branca usam a implementação para vários objetivos.


I para testar as unidades lógicas do código;
I para derivar ou avaliar um conjunto de casos de testes.
I Assim pode utilizar critérios baseados em "cobertura de código".

Cobertura de Código 2/16


Execução Automática de Casos de Teste

I Para derivar os requisitos de teste, o teste estrutural se baseia:


I nos fluxos de controle (sequência, decisões e laços) e;
I nos fluxos de dados (pares de definições e usos de variáveis)

Cobertura de Código 2/16


Execução Automática de Casos de Teste

I Os critérios de testes estruturais podem ser classificados como:


I baseados em complexidade;
I baseados em fluxo de controle, e;
I baseados em fluxo de dados.

Cobertura de Código 2/16


Execução Automática de Casos de Teste

I Serve para medir a "qualidade" dos casos de teste desenvolvidos.


I O Facebook utiliza a cobertura de teste estrutural para avaliá-los.

Cobertura de Código 2/16


Execução Automática de Casos de Teste

I São suficientes se atingem uma determinada cobertura do código.


I O teste estrutural é utilizado nesse contexto quando se deseja atingir...
I ...um determinado nível de cobertura de código.

Cobertura de Código 2/16


Execução Automática de Casos de Teste

I Novos casos de teste são criados para atingir a cobertura desejada.


I Ferramentas indicam se eles exploram suficientemente o código.

Cobertura de Código 2/16


Exemplo

I Os exemplos são baseados no Máximo Divisor Comum (MDC).


I O mais antigo algoritmo do grego Euclides (Elementos, ∼ 300 a.C).
I Método simples e eficiente de encontrar o MDC...
I ...entre dois números inteiros diferentes de zero.

Cobertura de Código 3/16


Exemplo

I Uma dependência por laço.


I Saída de uma ou mais iterações anteriores.
I Impossibilita a paralelização de laços!

Cobertura de Código 3/16


Exemplo

I O método calcularMDC() (JAVA) é o foco da análise de cobertura.


I Ele espera dois valores de entrada, ambos numéricos do tipo inteiro.
I O retorno também numérico inteiro: é o MDC!
I Caso um dos valores seja 0, o retorno será o valor -1 (inconsistência).

Cobertura de Código 3/16


Exemplo

package mdc / * Nó * /
p u b l i c c l a s s MDC {
p u b l i c s t a t i c i n t calcularMDC ( i n t v a l o r 1 , i n t v a l o r 2 ) {
i n t r e t = −1; i n t maiorValor ; i n t menorValor ; i n t r e s t o /* 1 */
i f ( valor1 != 0 valor2 != 0) { /* 2 */
i f ( valor1 != valor2 ) { /* 3 */
i f ( valor1 > valor2 ) { /* 4 */
maiorValor = v a l o r 1 ; /* 5 */
menorValor = v a l o r 2 ; } /* 5 */
else {
menorValor = v a l o r 1 ; /* 6 */
maiorValor = v a l o r 2 ; } /* 6 */
r e s t o = maiorValor mod menorValor ; /* 7 */
while ( r e s t o ! = 0 ) { /* 8 */
maiorValor = menorValor ; /* 9 */
menorValor = r e s t o ; /* 9 */
r e s t o = maiorValor mod menorValor ; } /* 9 */
r e t = menorValor ; /* 10 * /
} else {
r e t = valor1 ; } / * 11 * /
}
return ret ; / * 12 * /
}
}
Cobertura de Código 3/16
Exemplo

I Programa mapeado é um grafo de fluxo de controle G(N, B, s, e):


I N é o conjunto de blocos de comandos executados sequencialmente,
I e é o nó de entrada, s é o nó de saída e,
I R é é o conjunto de ramos representando transferência entre nós.
I Um caminho é a sequência de nós (ni , . . . , nk , nk+1 , . . . , nj )
onde i ≤ k < j, tal que (nk , nk+1 ) ∈ R.
I O caminho é completo quando começa em e e termina em s.
I Ele é determinado pela execução de P por um caso de teste t.

Cobertura de Código 3/16


Exemplo

Cobertura de Código 3/16


Critérios Baseados em Fluxo de Controle

I Critérios Todos Caminhos Linearmente Independente


Critérios Baseado em Complexidade1 : exige que todos os caminhos
linearmente independentes2 sejam executados (limite).
II Critério Todos Nós: exige um conjunto de casos de teste que
exercitem ao menos uma vez cada nó do grafo de fluxo de controle.
III Critério Todos Ramos: exige um conjunto de casos de teste que
exercitem ao menos uma vez cada ramo de grafo de fluxo.

1
Esse critério é baseado na métrica complexidades e ciclomática (V(G)).
2
introduz um novo comando de processamento ou uma nova condição.
Cobertura de Código 4/16
Critérios Baseados em Fluxo de Controle

I Pode existir + de 1 conjunto de caminho linearmente independente.


N° Caminhos linearmente independentes
1 (1,2,12)
2 (1,2,3,11,12)
3 (1,2,3,4,5,7,8,10,12)
4 (1,2,3,4,6,7,8,10,12)
5 (1,2,3,4,5,7,8,9,8,10,12) ou (1,2,3,4,6,7,8,9,8,10,12)

III Um possível conjunto de requisitos dos critérios Todos Ramos.


N° Todos Ramos N° Todos Ramos
1 (2,3) 5 (8,9)
2 (3,4) 6 (8,10)
3 (4,5) 7 (2,12)
4 (4,6) 8 (3,11)
Cobertura de Código 4/16
Cobertura

I Teste de cobertura requer que os casos de testes exercitem caminhos.


I Assim o testador aumente a sua confiança em relação do programa.

3 20. Testes de Software


Cobertura de Código 5/16
Cobertura

Definition
O conjunto de casos de teste T é adequado de acordo com o
critério de teste C, se o conjunto de requisitos de teste (TRC )
estabelecido por C é exercitado pelos casos de teste de T.

Cobertura de Código 5/16


Cobertura

I Para avaliar o grau de adequação do conjunto T a um critério C...


I ...é utilizada a medida de cobertura (MCC (T)) definida a seguir.
I TRC (t): conjunto de requisitos de teste estabelecido pelo critério C...
I ...exercitados por um caso de teste t ∈ T.
S
| TRC (t) | . t ∈ T
medida MCC (T) =
| TRC |

Cobertura de Código 5/16


EclEmma/JaCoCo

I EclEmma/JaCoCo: ferramenta de cobertura de fluxo de controle.


I Disponível para a linguagem Java no IDE Eclipse.
I As análises de cobertura são feitas no ambiente de execução.
I O desenvolvimento da ferramenta é baseado na biblioteca JaCoco3 .

3
http://www.eclemma.org/jacoco/
Cobertura de Código 6/16
EclEmma/JaCoCo

I Para se tratar de um plug-in, há uma maneira usual de instalação.


I O plugin pode ser instalado com o Eclipse Marketplace Wizard.
I No menu do Eclipse, clique em Help > Eclipse Marketplace.
I Na janela de diálogo digite EclEmma no Find e clique em Go.

Cobertura de Código 6/16


EclEmma/JaCoCo

I Coleta dados de cobertura de fluxo de controle na execução do prog.


I Há várias formas de obter a cobertura de código, por exemplo...
I execução do programa como uma aplicação Java local e,
I a execução de casos de teste automaticamente por meio de JUnit.

Cobertura de Código 6/16


EclEmma/JaCoCo

Cobertura de Código 6/16


EclEmma/JaCoCo

I Chamada ao método CalcularMDC() utilizando a biblioteca JUnit.


I O teste é executado e a cobertura é coletada para todo o código.

package mdc ;

import s t a t i c org . j u n i t . A s s e r t . * ;
import org . j u n i t . T e s t ;

p u b l i c c l a s s MDCTest {

@Test
p u b l i c void testCalcularMDC ( ) {
a s s e r t E q u a l s ( 8 , MDC. calcularMDC ( 8 , 1 6 ) ) ;
}
}

Cobertura de Código 6/16


EclEmma/JaCoCo

É possível determinar as classes que serão avaliadas na análise:


I Botão de cobertura e opção Coverage Configurations...
ou
I Executar o teste no menu Run as > JUnit e,
I após a finalização dos testes: Run > Coverage Last Launched

Cobertura de Código 6/16


Relatórios gerados e Análise de Dados

I Ao término, Eclipse abre automaticamente a perspectiva Coverage.


I Visão geral sobre os testes executados do metodo calcularMDC().

Cobertura de Código 7/16


Relatórios gerados e Análise de Dados

I Começamos considerando o critério complexidade (Complexity).


I Execuramos o teste do cálculo do MDC entre 8 e 16.
I Foi obtida a cobertura de 16,7%.
I O método possui 5 caminhos, e o teste percorreu apenas 1 deles!

Cobertura de Código 7/16


Relatórios gerados e Análise de Dados

I Vamos trocar para a visão Instructions no View.


I Verifica-se que o método calcularMDC() possui 43 instruções.
I O teste teve uma cobertura de 28 delas, ou seja 65.1%!

Cobertura de Código 7/16


Relatórios gerados e Análise de Dados

I O número de instruções é maior que o número de linhas!?


I JaCoCo instrumenta o código compilado em Bytecodes.
I Esse código possui mais instruções.

Cobertura de Código 7/16


Relatórios gerados e Análise de Dados

I Trocamos para visão Branches (ramos).


I Apresenta um cobertura de 50%.
I A metade dos ramos foram cobertos pelo caso de teste.

Cobertura de Código 7/16


Relatórios gerados e Análise de Dados

I A janela utiliza a opção Properties a partir de qualquer Elemento.


I Neste exemplo é MDC.java da perspectiva Coverage.
I O resumo apresenta a cobertura de linhas, método e tipos (classes)...

Cobertura de Código 7/16


Relatórios gerados e Análise de Dados

I A cobertura para execução do método calcularMDC() com 8 e 16...


I ...para os parâmetros valor1 e valor2 respectivamente.

Cobertura de Código 7/16


Relatórios gerados e Análise de Dados

I O sistema registra qual foi a cobertura pra cada linha de código:


I Linhas em vermelho: não exercitadas.
I Linhas em verde: totalmente exercitadas.
I Linhas em amarelo: parcialmente exercitadas.
I As linhas amarelas estão associados a comandos de decisão.
I Significa que apenas uma das condições foi exercitada na linha.

Cobertura de Código 7/16


Relatórios gerados e Análise de Dados

I Adicionalmente, ao lado esquerdo da linha, é apresentado um ícone.


I Representa um diamente com informações adicionais de cobertura.
I Ao passar o mouse sobre o ícone da linha 11, será apresentado...
I ...o número de desvios não cobertos.

Cobertura de Código 7/16


Relatórios gerados e Análise de Dados

Para obter 100% da cobertura dos desvios é necessário esse conjunto:

Cobertura de Código 7/16


Relatórios gerados e Análise de Dados

Cobertura de Código 7/16


Critérios Baseados em Fluxo de Dados

I Existem requisitos de teste exigindo a execução de caminhos...


I ...entre definição e uso de variável.
I Estes requisitos são chamados de Associações Definição Uso (ADU).

Cobertura de Código 8/16


Critérios Baseados em Fluxo de Dados

I definição de variável: valor armazenado em posição de memória.


I uso de variável: quando a referência a essa variável não é definida.
1. c-uso afeta diretamente uma computação sendo realizada.
c-uso permite que o resultado de uma definição possa ser observada.
2. p-uso afeta diretamente o fluxo de de controle do programa.

Cobertura de Código 8/16


Critérios Baseados em Fluxo de Dados

Cobertura de Código 8/16


Critérios Baseados em Fluxo de Dados

I Um caminho (i, n1 , . . . , nm , j), m ≤ 0, que não contenha definição de...


I ...uma variável x nos nós n1 , . . . , nm é chamado de caminho livre...
I ...de definição com respeito a x do nó i ao nó j.

Cobertura de Código 8/16


Critérios Baseados em Fluxo de Dados

I Uma associação definição-uso (i, j, x) indica que...


I ...existe ao menos um caminho livre de definição do nó i, no qual...
I ...occore a definição da variável x, até o nó j, onde há uso de x.
I Uma associação definição-uso (i, (k, j), x) vai impor o ramo (k, j).

Cobertura de Código 8/16


Critérios Baseados em Fluxo de Dados

I Ela é exercitada quando pelo menos um caminho livre de definição...


I ...com respeito a x do nó i até o nó j (usando o ramo (j, k)) é executado.

Cobertura de Código 8/16


Critérios Baseados em Fluxo de Dados

I A intuição subjacente a esses critérios é que a confiança do programa


I ...aumenta se todo valor atribuído a uma variável for utilizado...
I ...pelo menos uma vez pelo conjunto de casos de teste.

Cobertura de Código 8/16


Critérios Baseados em Fluxo de Dados

IV Critérios Todos Usos: exige que todas as associações definição-uso


sejam exercitadoas pelos casos de teste ao menos uma vez.

Cobertura de Código 8/16


Critérios Baseados em Fluxo de Dados

Um possível conjunto de requisitos dos critérios Todos Usos:

Todos Usos
(1,(2,2),valor1) (1,(2,12),valor1) (1,(3,4),valor1) (1,5,valor2)
(1,11,valor1) (1,(4,5),valor1) (1,(4,6),valor1) (1,6,valor1)
(9,(8,10),resto) (1,(2,3),valor2) (1,(2,12),valor2) (7,9,resto)
(1,(3,11),valor2) (1,(4,5),valor2) (1,(4,6),valor2) (1,6,valor2)
(6,9,menorValor) (9,(8,9),resto) (5,7,maiorValor) (1,12,ret)
(5,9,menorValor) (6,7,maiorValor) (5,10,menorValor) (9,9,resto)
(5,7,menorValor) (1,(3,11),valor1) (6,10,menorValor) (1,5,valor1)
(6,7,menorValor) (7,(8,10),resto) (9,9,menorValor) (10,12,ret)
(1,(3,4),valor2) (7,(8,9),resto) (9,10,menorValor) (11,12,ret)

Cobertura de Código 8/16


Baduino

I Baduino é uma ferramenta de cobertura de fluxo de dados.


I Ela é disponível para a linguagem Java no ambiente Eclipse.
I As análises de cobertura são feitas de maneira semelhante à JaCoCo.

Cobertura de Código 9/16


Baduino

I BA-DUA: Bitwise Algorithm - Definition-Use Association coverage.


I Ferramenta de teste de fluxo de dados intra-procedural.
I Implementação do algoritmo bit a bit para teste de fluxo de dados.

Cobertura de Código 9/16


Baduino

I Análises realizadas a partir do programa compilado em Bytecodes.


I Baduino possui uma versão plug-in para o IDE Eclipse.
I Plug-in4 no escopo das pesquisas do grupo SAEG/EACH/USP.

4
http://github.com/saeg/baduino
Cobertura de Código 9/16
Baduino

I Download/instalação plug-in: Help > Install New Software

I No Work with, digite https://saeg.github.io/update-site

Cobertura de Código 9/16


Baduino

I Selecione a última versão da Baduino e clique em Next

I Siga os passos do instalador.

Cobertura de Código 9/16


Baduino

I A instalação do plug-in cria uma nova entrada com o nome Baduino.


I Há duas opções: Project Visualization e Run Tests.
I A opção Run Tests é responsável por executar as classes de testes.
I Vai instrumentar e coletar a cobertura dos ADUs.

Cobertura de Código 9/16


Baduino

I As classes elegíveis para Baduino são todas com prefixo Test.


I Note-se que a Baduino não considera a anotação @Test.
I Vamos iniciar com a primeira classe de teste (MCDTest.java)...

Cobertura de Código 9/16


Baduino

I Para conseguir a cobertura precisa executar os testes com JUnit.


I A BA-DUA é responsável pela instrumentação das classes.
I Se encarrega de guardar os dados de cobertura após a finalização.
I Salva a cobertura em coverage.xml em .baduino/, raíz do projeto.

Cobertura de Código 9/16


Baduino

I Após obter a cobertura, o plug-in se encarrega de exibir as ADUs.


I Para isso clique direito: Projeto > Baduino > Run Tests ou...
I ...clique direito na raiz do projeto: Baduino > Run Tests.

Cobertura de Código 9/16


Baduino

I Para visualizar as coberturas, é só clicar com o botão direito no...


I Project/Package/Class Visualization ou clique direito...
I ...na raiz do projeto: Baduino > Project Visualization.

Cobertura de Código 9/16


I A visualização feita hierarquicamente.

Cobertura de Código
Baduino

I Clicando em Project Visualization.


I Cobertura das ADUs de todo o projeto.
9/16
Baduino

I O exemplo anterior apresenta a execução de cobertura para o teste:


assertEquals(8,MDC.calcularMDC(8,16));
I A ferramenta calculou uma cobertura de 36,11%.
I Associações com true indicam que uma definição-uso foi executada.

Cobertura de Código 9/16


I É possível clicar nas ADUs.
I ADUs cobertas e não cobertas.
I Serão pintadas de verde e vermelho.

Cobertura de Código
Baduino

I É possível remover as ADUs pintadas


(Remove Highlight no canto superior).
9/16
I Vamos usar a segunda classe de teste:
I Copiar/colar MDCTest2.java.

Cobertura de Código
Baduino

I O percentual de cobertura aumentou.


I Ficou em torno 95%.
I Todas as associções de valor1 cobertas.
9/16
Baduino

I Ao clicar na primeira associação (4,(8,8),valor1)...


I A definição da variável valor1 é associada à primeira linha (4).
I Seu uso ocorre na primeira condição da condição composta (linha 8).
I BA-DUA avalia condições de expressões compostas separademente.
I Há um fluxo de execução da primeira condição para a segunda.
I As duas estão localizadas na linha 8, dái a existência do ramo (8,8).

Cobertura de Código 9/16


Baduino

I Ao clicar em qualquer definição-uso na lista, a ferramenta destaca...


I ...as linhas envolvidas na associação diretamente no código.
I As linhas da definição e do uso serão pintadas no código fonte.

Cobertura de Código 9/16


Baduino

I Isso demonstra o valor da técnica de teste de cobertura.


I A partir de um conjunto de casos de teste...
I ...podem-se identificar associações não cobertas.
I Porém é necessário para garantir a qualidade do software!

Cobertura de Código 9/16


Vantagens e Desvantagens

I A principal vantagem da BA-DUA é apoiar a aplicação de critérios...


I ...baseado em análise de fluxo de dados com custos de processamento
I ...e de memória que permitem seu uso em ambientes industriais.
I BA-DUA é uma ferramenta para utilização em linha de comando.
I Pode ser utilizada por ferramentas para construção de programas.

Cobertura de Código 10/16


Vantagens e Desvantagens

I De qualquer maneira, os resultados são gerados em formato XML.


I Precisam ser apresentados de forma amigável!
I Para solucionar isso, foi desenvolvido um plug-in para o IDE Eclipse.

Cobertura de Código 10/16


Vantagens e Desvantagens

I Os resultados são sumarizados por classe e métodos.


I Fácil acesso das linhas onde ocorrem definições e usos de variáveis.
I Exigir que as classes de teste tenham o sufixo test é desvantagem.

Cobertura de Código 10/16


Conclusão

I EclEmma/JaCoCo apoia os critérios estruturais baseados em fluxo...


I ...de controle (Todos Nós, Todos Ramos) e baseado em complexidade.
I BA-DUA/Baduino apoia teste baseado em fluxo de dados (Todos Usos).

Cobertura de Código 11/16


Referências

Cobertura de Código 12/16


Creditos das ilustrações

Page 2:
https://atendesigngroup.com/blog/functional-testing-katalon-recorder
Page 4: https://www.dnaindia.com/education/
report-delhi-cet-2019-result-expected-today-before-4-pm-2763849
Page 5: https://www.pinterest.de/pin/834151162210087188/

Page 6: https://www.maaikebrinkhof.nl/2016/09/tests-are-a-form-of-waste/

Page 7: https://smartbear.com/blog/test-and-monitor/on-code-complexity/

Page 4: https://m4i3.wordpress.com/cartoons/

Page 8: https://techcrunch.com/2010/04/14/
apparently-mark-zuckerberg-still-writes-code/
Page 9: https://www.codeproject.com/Articles/649815/code-coverage

Page 13: https://blog.overops.com/


the-jvm-immune-system-debugging-distributed-servers-at-scale/
Page 15: https://www.youtube.com/watch?v=0lVA7TPpxUE

Page 17: https://slideplayer.com/slide/6158771/

Cobertura de Código 13/16


Creditos das ilustrações

Page 18: https://www.tourmag.com/

Page 24: https://www.youtube.com/watch?v=8ZEbAxh1Q5o ....

Page 25: https://realpython.com/python-testing/

Page 26: https://www.softwaretestingclass.com/


measuring-code-quality-with-test-coverage-metrics/
Page 27: https://mkyong.com/maven/maven-jacoco-code-coverage-example/

Page 29: https://ecodehacker.com/p/


java-junit-for-unit-testing-with-testng-mockito-eclemma
Page 33: https:
//www.codeaffine.com/2014/04/07/efficient-code-coverage-with-eclipse/
Page 36: https://blog.overops.com/
using-reflection-to-look-inside-the-jvm-at-run-time/
Page 40: https://depositphotos.com/123449218/
stock-illustration-bar-code-sign-isometric-style.html
Page 41: https://www.vectorstock.com/royalty-free-vector/
traffic-signal-sign-vector-2105123

Cobertura de Código 14/16


Creditos das ilustrações

Page 20: https://www.cnetfrance.fr/news/


abonnes-freebox-prenez-garde-youboox-ne-sera-bientot-plus-gratuit-39895
htm
Page 21: https://www.pinterest.com/pin/663366220096850462/

Page 22: https://www.istockphoto.com/br/ilustra%C3%A7%C3%B5es/


italy-on-path-to-success
Page 44: https://www.facebook.com/pages/category/Pizza-Place/
Baduino-Pizzaria-Delivery-121995931865222/
Page 45: https:
//www.amazon.com.br/Bitwise-Life-Code-David-Auerbach/dp/1101972149
Page 46: http://www5.each.usp.br/, https://saegblog.wordpress.com/

Page 47,48: http://github.com/saeg/baduino

Page 49: https://www.dreamstime.com/illustration/run-test.html

Page 50: https:


//www.dreamstime.com/stock-photography-big-coverage-image15031452

Cobertura de Código 15/16


Creditos das ilustrações

Page 54:
https://www.seguetech.com/impact-code-quality-test-coverage-planning/
Page 59: https://medium.com/young-coder/
a-programming-flow-chart-for-kids-983cbaff8038
Page 60: https://prog.world/tdd-for-microcontrollers-in-5-minutes/

Page 61: https://devrant.com/search?term=eclipse

Page 62: https://me.me/i/


a-lunar-eclipse-according-to-flat-earth-ers-funny-a-13604148
Page 63: https://memegenerator.net/instance/61669376/
over-9000-the-code-coverage-its-over-99

Cobertura de Código 16/16

Você também pode gostar