Download - Clase 05d cobertura de codigo
![Page 1: Clase 05d cobertura de codigo](https://reader033.vdocuments.co/reader033/viewer/2022060119/558ffd6d1a28abb40d8b469c/html5/thumbnails/1.jpg)
Pruebas de SoftwareCobertura de Código
Complejidad Ciclomática
Universidad de los AndesDemián Gutierrez
Febrero 2013
![Page 2: Clase 05d cobertura de codigo](https://reader033.vdocuments.co/reader033/viewer/2022060119/558ffd6d1a28abb40d8b469c/html5/thumbnails/2.jpg)
Code Coverage
¿code coverage?¿cobertura de código?
![Page 3: Clase 05d cobertura de codigo](https://reader033.vdocuments.co/reader033/viewer/2022060119/558ffd6d1a28abb40d8b469c/html5/thumbnails/3.jpg)
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](https://reader033.vdocuments.co/reader033/viewer/2022060119/558ffd6d1a28abb40d8b469c/html5/thumbnails/4.jpg)
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](https://reader033.vdocuments.co/reader033/viewer/2022060119/558ffd6d1a28abb40d8b469c/html5/thumbnails/5.jpg)
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](https://reader033.vdocuments.co/reader033/viewer/2022060119/558ffd6d1a28abb40d8b469c/html5/thumbnails/6.jpg)
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](https://reader033.vdocuments.co/reader033/viewer/2022060119/558ffd6d1a28abb40d8b469c/html5/thumbnails/7.jpg)
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](https://reader033.vdocuments.co/reader033/viewer/2022060119/558ffd6d1a28abb40d8b469c/html5/thumbnails/8.jpg)
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](https://reader033.vdocuments.co/reader033/viewer/2022060119/558ffd6d1a28abb40d8b469c/html5/thumbnails/9.jpg)
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](https://reader033.vdocuments.co/reader033/viewer/2022060119/558ffd6d1a28abb40d8b469c/html5/thumbnails/10.jpg)
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](https://reader033.vdocuments.co/reader033/viewer/2022060119/558ffd6d1a28abb40d8b469c/html5/thumbnails/11.jpg)
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](https://reader033.vdocuments.co/reader033/viewer/2022060119/558ffd6d1a28abb40d8b469c/html5/thumbnails/12.jpg)
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](https://reader033.vdocuments.co/reader033/viewer/2022060119/558ffd6d1a28abb40d8b469c/html5/thumbnails/13.jpg)
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](https://reader033.vdocuments.co/reader033/viewer/2022060119/558ffd6d1a28abb40d8b469c/html5/thumbnails/14.jpg)
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](https://reader033.vdocuments.co/reader033/viewer/2022060119/558ffd6d1a28abb40d8b469c/html5/thumbnails/15.jpg)
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](https://reader033.vdocuments.co/reader033/viewer/2022060119/558ffd6d1a28abb40d8b469c/html5/thumbnails/16.jpg)
¿complejidad ciclomática?
![Page 17: Clase 05d cobertura de codigo](https://reader033.vdocuments.co/reader033/viewer/2022060119/558ffd6d1a28abb40d8b469c/html5/thumbnails/17.jpg)
¿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](https://reader033.vdocuments.co/reader033/viewer/2022060119/558ffd6d1a28abb40d8b469c/html5/thumbnails/18.jpg)
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](https://reader033.vdocuments.co/reader033/viewer/2022060119/558ffd6d1a28abb40d8b469c/html5/thumbnails/19.jpg)
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](https://reader033.vdocuments.co/reader033/viewer/2022060119/558ffd6d1a28abb40d8b469c/html5/thumbnails/20.jpg)
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 22: Clase 05d cobertura de codigo](https://reader033.vdocuments.co/reader033/viewer/2022060119/558ffd6d1a28abb40d8b469c/html5/thumbnails/22.jpg)
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](https://reader033.vdocuments.co/reader033/viewer/2022060119/558ffd6d1a28abb40d8b469c/html5/thumbnails/23.jpg)
Gracias
¡Gracias!