clase 05d cobertura de codigo

Post on 28-Jun-2015

407 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Pruebas de SoftwareCobertura de Código

Complejidad Ciclomática

Universidad de los AndesDemián Gutierrez

Febrero 2013

Code Coverage

¿code coverage?¿cobertura de código?

Code Coverage

dado un conjunto de pruebas¿qué porcentaje del total del

software bajo prueba (código)es cubierto por las pruebas?

Code Coverage

public class Foo {

public void methodUnderTest(int a, int b, int c) { System.err.println("do something with a: " + a); System.err.println("do something with b: " + b); System.err.println("do something with c: " + c); }}

dado el siguiente método

¿cómo lo probamos?(de forma satisfactoria)

Line Coverage

public class Foo {

public void methodUnderTest(int a, int b, int c) { System.err.println("do something with a: " + a); System.err.println("do something with b: " + b); System.err.println("do something with c: " + c); }}

@Testpublic void foo_line_coverage() { Foo foo = new Foo(); foo.methodUnderTest(1, 2, 3);}

¿se ejecutan todas las líneas de código?cobertura de líneas de código del 100%

¿será suficiente?

Code Coverage

veamos otro ejemplo

¿cómo lo probamos?(de forma satisfactoria)

public class Faa {

public void methodUnderTest(int a, int b) { if (a < b) { System.out.println("do something when a < b"); }

System.out.println("always do something here"); }}

Code Coverage

¿se ejecutan todas las líneas de código?cobertura de líneas de código del 100%

¿será suficiente?

public class Faa {

public void methodUnderTest(int a, int b) { if (a < b) { System.out.println("do something when a < b"); }

System.out.println("always do something here"); }}

@Testpublic void faa_line_coverage() { Faa faa = new Faa(); faa.methodUnderTest(1, 2);}

Code Coverage

se ejecutan todas las líneas de código,pero no se prueban todos las posiblessalidas del if, es decir, no hay un 100%

de cobertura de ramas

public class Faa {

public void methodUnderTest(int a, int b) {

if (a < b) { System.out.println("do something when a < b"); }

System.out.println("always do something here"); }}

@Testpublic void faa_line_coverage() { Faa faa = new Faa(); faa.methodUnderTest(1, 2);}

Branch Coverage

public class Faa {

public void methodUnderTest(int a, int b) { if (a < b) { System.out.println("do something when a < b"); }

System.out.println("always do something here"); }}

@Testpublic void faa_branch_coverage1() { Bar bar = new Bar(); bar.methodUnderTest(1, 2);}

@Testpublic void faa_branch_coverage2() { Bar bar = new Bar(); bar.methodUnderTest(3, 2);}

ahora no solo se ejecutan el 100% de laslíneas de código, sino que se ejecutan todas las

alternativas de cada estructura de control(100% cobertura de ramas)

¿será suficiente?

Code Coverage

aún otro ejemplo

¿cómo lo probamos?(de forma satisfactoria)

public class Bar {

public void methodUnderTest(int a, int b, int c) { if (a < c) { System.out.println("do something when a < c"); } else { System.out.println("do something when a >= c"); }

if (b < c) { System.out.println("do something when b < c"); } else { System.out.println("do something when b >= c"); } }}

Code Coverage

aún otro ejemplo

no hay manera de obtener100% de cobertura

de líneas de código con un sólo test

public class Bar {

public void methodUnderTest(int a, int b, int c) { if (a < c) { System.out.println("do something when a < c"); } else { System.out.println("do something when a >= c"); }

if (b < c) { System.out.println("do something when b < c"); } else { System.out.println("do something when b >= c"); } }}

Code Coverage

if (a < c) { System.out.println("do something when a < c");} else { System.out.println("do something when a >= c");}

if (b < c) { System.out.println("do something when b < c");} else { System.out.println("do something when b >= c");}

@Testpublic void bar_branch_coverage1() { Bar bar = new Bar(); bar.methodUnderTest(1, 1, 2);}

@Testpublic void bar_branch_coverage2() { Bar bar = new Bar(); bar.methodUnderTest(3, 3, 2);}

¿se ejecutan todas las líneas de código?

¿se prueban todas las ramas?

cobertura de líneas de código del 100%

cobertura de ramas del 100%

¿será suficiente?

Code Coverage

if (a < c) { System.out.println("do something when a < c");} else { System.out.println("do something when a >= c");}

if (b < c) { System.out.println("do something when b < c");} else { System.out.println("do something when b >= c");}

¿se prueban todas las combinaciones posiblesentre las distintas ramas?

(cobertura de caminos)

para tener un 100% de cobertura de caminosno es suficiente con 2 pruebas

@Testpublic void bar_branch_coverage1() { Bar bar = new Bar(); bar.methodUnderTest(1, 1, 2);}

@Testpublic void bar_branch_coverage2() { Bar bar = new Bar(); bar.methodUnderTest(3, 3, 2);}

Code Coverage

if (a < c) { System.out.println("do something when a < c");} else { System.out.println("do something when a >= c");}

if (b < c) { System.out.println("do something when b < c");} else { System.out.println("do something when b >= c");}

@Testpublic void bar_path_coverage1() { Bar bar = new Bar(); bar.methodUnderTest(1, 1, 2);}

@Testpublic void bar_path_coverage2() { Bar bar = new Bar(); bar.methodUnderTest(3, 3, 2);}

@Testpublic void bar_path_coverage3() { Bar bar = new Bar(); bar.methodUnderTest(1, 3, 2);}

@Testpublic void bar_path_coverage4() { Bar bar = new Bar(); bar.methodUnderTest(3, 1, 2);}

ahora hay 100% de cobertura de caminos

Code Coverage

if (a < c) { System.out.println("do something when a < c");} else { System.out.println("do something when a >= c");}

if (b < c) { System.out.println("do something when b < c");} else { System.out.println("do something when b >= c");}

@Testpublic void bar_path_coverage1() { Bar bar = new Bar(); bar.methodUnderTest(1, 1, 2);}

@Testpublic void bar_path_coverage2() { Bar bar = new Bar(); bar.methodUnderTest(3, 3, 2);}

@Testpublic void bar_path_coverage3() { Bar bar = new Bar(); bar.methodUnderTest(1, 3, 2);}

@Testpublic void bar_path_coverage4() { Bar bar = new Bar(); bar.methodUnderTest(3, 1, 2);}

ahora hay 100% de cobertura de caminos

¿complejidad ciclomática?

¿complejidad ciclomática?

término acuñado por

Thomas J. McCabe (1976)

cuenta el número de caminos linealmente independientes a lo largo de

un programa/función/método

es una forma de medir (metrica) la complejidad del código fuente

Complejidad Ciclomática

Complejidad Ciclomática

public class Foo { public void methodUnderTest(int a, int b, int c) { System.err.println("do something with a: " + a); System.err.println("do something with b: " + b); System.err.println("do something with c: " + c); }}

public class Faa { public void methodUnderTest(int a, int b) { if (a < b) { System.out.println("do something when a < b"); }

System.out.println("always do something here"); }}

CC=1

CC=2

Complejidad Ciclomática

if (a < c) { System.out.println("do something when a < c");} else { System.out.println("do something when a >= c");}

if (b < c) { System.out.println("do something when b < c");} else { System.out.println("do something when b >= c");}

CC=3

Complejidad Ciclomática

CC = E – N + 2 * P

E: # de arístas (8)N: # de nodos (7)P: # de salidas (1)

CC = 8 – 7 + 2 * 1CC = 3

en general#pruebas 100% Cobertura de Ramas

<=complejidad ciclomática

<=#pruebas 100% Cobertura de Caminos

Code Coverage

Emma / EclEmma (http://www.eclemma.org/)

Ejemplos Corriendo

Code Coverage

Clover (Attlasian) Privativo

(http://www.atlassian.com/software/clover/)

Emma / EclEmma

http://www.eclemma.org/ y http://emma.sourceforge.net/

Coverlipse

http://coverlipse.sourceforge.net/

Algunas otras en:

http://java-source.net/open-source/code-coverage

Gracias

¡Gracias!

top related