clase 05d cobertura de codigo
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
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!