23
Pruebas de Software Cobertura de Código Complejidad Ciclomática Universidad de los Andes Demián Gutierrez Febrero 2013

Clase 05d cobertura de codigo

Embed Size (px)

Citation preview

Page 1: Clase 05d cobertura de codigo

Pruebas de SoftwareCobertura de Código

Complejidad Ciclomática

Universidad de los AndesDemián Gutierrez

Febrero 2013

Page 2: Clase 05d cobertura de codigo

Code Coverage

¿code coverage?¿cobertura de código?

Page 3: Clase 05d cobertura de codigo

Code Coverage

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

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

Page 4: Clase 05d cobertura de codigo

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)

Page 5: Clase 05d cobertura de codigo

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?

Page 6: Clase 05d cobertura de codigo

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"); }}

Page 7: Clase 05d cobertura de codigo

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);}

Page 8: Clase 05d cobertura de codigo

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);}

Page 9: Clase 05d cobertura de codigo

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?

Page 10: Clase 05d cobertura de codigo

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"); } }}

Page 11: Clase 05d cobertura de codigo

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"); } }}

Page 12: Clase 05d cobertura de codigo

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?

Page 13: Clase 05d cobertura de codigo

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);}

Page 14: Clase 05d cobertura de codigo

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

Page 15: Clase 05d cobertura de codigo

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

Page 16: Clase 05d cobertura de codigo

¿complejidad ciclomática?

Page 17: Clase 05d cobertura de codigo

¿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

Page 18: Clase 05d cobertura de codigo

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

Page 19: Clase 05d cobertura de codigo

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

Page 20: Clase 05d cobertura de codigo

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

Page 21: Clase 05d cobertura de codigo

Code Coverage

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

Ejemplos Corriendo

Page 22: Clase 05d cobertura de codigo

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

Page 23: Clase 05d cobertura de codigo

Gracias

¡Gracias!