SlideShare una empresa de Scribd logo
1 de 23
Descargar para leer sin conexión
Pruebas de Software
   Cobertura de Código
  Complejidad Ciclomática




    Universidad de los Andes
          Demiá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



         dado el siguiente método
  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);
      }
  }

            ¿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);
      }
  }
  @Test
  public 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
  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");
      }
  }

              ¿cómo lo probamos?
             (de forma satisfactoria)
Code 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");
        }
    }


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

    ¿se ejecutan todas las líneas de código?
     cobertura de líneas de código del 100%
                ¿será suficiente?
Code 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");
        }
    }

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

     se ejecutan todas las líneas de código,
     pero no se prueban todos las posibles
     salidas del if, es decir, no hay un 100%
             de cobertura de ramas
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");
           }
       }

 @Test                                  @Test
 public void faa_branch_coverage1() {   public void faa_branch_coverage2() {
   Bar bar = new Bar();                   Bar bar = new Bar();
   bar.methodUnderTest(1, 2);             bar.methodUnderTest(3, 2);
 }                                      }

           ahora no solo se ejecutan el 100% de las
       lí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
      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");
              }
          }
      }
               ¿cómo lo probamos?
              (de forma satisfactoria)
Code Coverage

                    aún otro ejemplo
      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");
              }
          }
      }
          no hay manera de obtener
             100% de cobertura
    de líneas de código con un sólo test
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");
              }

   @Test                                  @Test
   public void bar_branch_coverage1() {   public void bar_branch_coverage2() {
     Bar bar = new Bar();                   Bar bar = new Bar();
     bar.methodUnderTest(1, 1, 2);          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");
              }

   @Test                                  @Test
   public void bar_branch_coverage1() {   public void bar_branch_coverage2() {
     Bar bar = new Bar();                   Bar bar = new Bar();
     bar.methodUnderTest(1, 1, 2);          bar.methodUnderTest(3, 3, 2);
   }                                      }


      ¿se prueban todas las combinaciones posibles
                entre las distintas ramas?
                  (cobertura de caminos)
       para tener un 100% de cobertura de caminos
              no es suficiente con 2 pruebas
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");
               }


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

   @Test                                  @Test
   public void bar_path_coverage2() {     public void bar_path_coverage4() {
     Bar bar = new Bar();                   Bar bar = new Bar();
     bar.methodUnderTest(3, 3, 2);          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");
               }


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

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

           ahora hay 100% de cobertura de caminos
¿complejidad ciclomática?
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

 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);   CC=1
     System.err.println("do something    with c: " + c);
   }
 }




 public class Faa {                                        CC=2
   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");
     }
 }
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 * 1
     CC = 3

                        en general
            #pruebas 100% Cobertura de Ramas
                            <=
                 complejidad ciclomática
                            <=
           #pruebas 100% Cobertura de Caminos
Code Coverage




                  Ejemplos Corriendo
            Emma / EclEmma (http://www.eclemma.org/)
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!

Más contenido relacionado

Destacado

Destacado (20)

Clase 09a frameworks_ejemplo
Clase 09a frameworks_ejemploClase 09a frameworks_ejemplo
Clase 09a frameworks_ejemplo
 
Clase 08c ejemplo_maquina_virtual
Clase 08c ejemplo_maquina_virtualClase 08c ejemplo_maquina_virtual
Clase 08c ejemplo_maquina_virtual
 
Clase 09a frameworks
Clase 09a frameworksClase 09a frameworks
Clase 09a frameworks
 
Clase 01 presentacion
Clase 01 presentacionClase 01 presentacion
Clase 01 presentacion
 
Clase 12a uml_clases
Clase 12a uml_clasesClase 12a uml_clases
Clase 12a uml_clases
 
Clase 08b ejemplo_capas_cleda
Clase 08b ejemplo_capas_cledaClase 08b ejemplo_capas_cleda
Clase 08b ejemplo_capas_cleda
 
Clase 05c niveles de pruebas
Clase 05c niveles de pruebasClase 05c niveles de pruebas
Clase 05c niveles de pruebas
 
Clase 07b patrones_diseno_ejemplo
Clase 07b patrones_diseno_ejemploClase 07b patrones_diseno_ejemplo
Clase 07b patrones_diseno_ejemplo
 
Clase 11 uml_casos_de_uso
Clase 11 uml_casos_de_usoClase 11 uml_casos_de_uso
Clase 11 uml_casos_de_uso
 
Clase 07a patrones_diseno
Clase 07a patrones_disenoClase 07a patrones_diseno
Clase 07a patrones_diseno
 
Clase 04a requerimientos introduccion
Clase 04a requerimientos introduccionClase 04a requerimientos introduccion
Clase 04a requerimientos introduccion
 
Clase 06 diseno_arquitectura
Clase 06 diseno_arquitecturaClase 06 diseno_arquitectura
Clase 06 diseno_arquitectura
 
Clase 08a estilos_arquitectonicos
Clase 08a estilos_arquitectonicosClase 08a estilos_arquitectonicos
Clase 08a estilos_arquitectonicos
 
Clase 14b uml_actividades
Clase 14b uml_actividadesClase 14b uml_actividades
Clase 14b uml_actividades
 
Clase 04b requerimientos documentacion
Clase 04b requerimientos documentacionClase 04b requerimientos documentacion
Clase 04b requerimientos documentacion
 
Clase 13 uml_paquetes
Clase 13 uml_paquetesClase 13 uml_paquetes
Clase 13 uml_paquetes
 
Clase 09c seleccion
Clase 09c seleccionClase 09c seleccion
Clase 09c seleccion
 
Clase 14a uml_estados
Clase 14a uml_estadosClase 14a uml_estados
Clase 14a uml_estados
 
Clase 04 diseno_ui
Clase 04 diseno_uiClase 04 diseno_ui
Clase 04 diseno_ui
 
Estructuras de Datos Espaciales (Topico Especial)
Estructuras de Datos Espaciales (Topico Especial)Estructuras de Datos Espaciales (Topico Especial)
Estructuras de Datos Espaciales (Topico Especial)
 

Similar a Clase 05d cobertura de codigo

6 Upv Solo Pruebas 2009
6 Upv Solo Pruebas 20096 Upv Solo Pruebas 2009
6 Upv Solo Pruebas 2009Pepe
 
Por que java
Por que javaPor que java
Por que javareivax
 
PARADIGMAS FP Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
PARADIGMAS FP  Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONAPARADIGMAS FP  Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
PARADIGMAS FP Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONAVíctor Bolinches
 
Ejercicios propuestos
Ejercicios propuestosEjercicios propuestos
Ejercicios propuestosNery Davila
 
Ejercicios propuestosc++
Ejercicios propuestosc++Ejercicios propuestosc++
Ejercicios propuestosc++Mauricio Moya
 
Unit Testing - Trovit
Unit Testing - TrovitUnit Testing - Trovit
Unit Testing - TrovitJordi Gerona
 
Unit Testing - GTUG
Unit Testing - GTUGUnit Testing - GTUG
Unit Testing - GTUGJordi Gerona
 
⭐⭐⭐⭐⭐ SOLUCIÓN LECCIÓN SISTEMAS EMBEBIDOS, 2do Parcial (2020 PAO 1)
⭐⭐⭐⭐⭐ SOLUCIÓN LECCIÓN SISTEMAS EMBEBIDOS, 2do Parcial (2020 PAO 1)⭐⭐⭐⭐⭐ SOLUCIÓN LECCIÓN SISTEMAS EMBEBIDOS, 2do Parcial (2020 PAO 1)
⭐⭐⭐⭐⭐ SOLUCIÓN LECCIÓN SISTEMAS EMBEBIDOS, 2do Parcial (2020 PAO 1)Victor Asanza
 
Ejercisos condicionales
Ejercisos condicionalesEjercisos condicionales
Ejercisos condicionalesJoshe Varillas
 
Portafolio segundo parcial
Portafolio segundo parcialPortafolio segundo parcial
Portafolio segundo parcialHugo Arechiga
 
Examen de Turbo C
Examen de Turbo CExamen de Turbo C
Examen de Turbo Ctacubomx
 
Resolución de problemas con java
Resolución de problemas con javaResolución de problemas con java
Resolución de problemas con javadiegocastro1234
 
Código Java Ecuación cuadrática
Código Java Ecuación cuadráticaCódigo Java Ecuación cuadrática
Código Java Ecuación cuadráticaCarmen Nereira
 

Similar a Clase 05d cobertura de codigo (20)

Ejercicios3
Ejercicios3Ejercicios3
Ejercicios3
 
6 Upv Solo Pruebas 2009
6 Upv Solo Pruebas 20096 Upv Solo Pruebas 2009
6 Upv Solo Pruebas 2009
 
Practica 1
Practica 1Practica 1
Practica 1
 
Cecytem
CecytemCecytem
Cecytem
 
Por que java
Por que javaPor que java
Por que java
 
PARADIGMAS FP Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
PARADIGMAS FP  Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONAPARADIGMAS FP  Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
PARADIGMAS FP Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
 
Ejercicios propuestos
Ejercicios propuestosEjercicios propuestos
Ejercicios propuestos
 
Ejercicios propuestosc++
Ejercicios propuestosc++Ejercicios propuestosc++
Ejercicios propuestosc++
 
Unit Testing - Trovit
Unit Testing - TrovitUnit Testing - Trovit
Unit Testing - Trovit
 
Unit Testing - GTUG
Unit Testing - GTUGUnit Testing - GTUG
Unit Testing - GTUG
 
⭐⭐⭐⭐⭐ SOLUCIÓN LECCIÓN SISTEMAS EMBEBIDOS, 2do Parcial (2020 PAO 1)
⭐⭐⭐⭐⭐ SOLUCIÓN LECCIÓN SISTEMAS EMBEBIDOS, 2do Parcial (2020 PAO 1)⭐⭐⭐⭐⭐ SOLUCIÓN LECCIÓN SISTEMAS EMBEBIDOS, 2do Parcial (2020 PAO 1)
⭐⭐⭐⭐⭐ SOLUCIÓN LECCIÓN SISTEMAS EMBEBIDOS, 2do Parcial (2020 PAO 1)
 
Ejercisos condicionales 1
Ejercisos condicionales 1Ejercisos condicionales 1
Ejercisos condicionales 1
 
Ejercisos condicionales
Ejercisos condicionalesEjercisos condicionales
Ejercisos condicionales
 
Portafolio segundo parcial
Portafolio segundo parcialPortafolio segundo parcial
Portafolio segundo parcial
 
Examen de Turbo C
Examen de Turbo CExamen de Turbo C
Examen de Turbo C
 
Desarrollo De Programas Ejemplos 01
Desarrollo De Programas Ejemplos 01Desarrollo De Programas Ejemplos 01
Desarrollo De Programas Ejemplos 01
 
Desarrollo de programas_ejemplos_01
Desarrollo de programas_ejemplos_01Desarrollo de programas_ejemplos_01
Desarrollo de programas_ejemplos_01
 
Resolución de problemas con java
Resolución de problemas con javaResolución de problemas con java
Resolución de problemas con java
 
Código Java Ecuación cuadrática
Código Java Ecuación cuadráticaCódigo Java Ecuación cuadrática
Código Java Ecuación cuadrática
 
Java básico
Java  básicoJava  básico
Java básico
 

Último

EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptxEL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptxMiguelAtencio10
 
presentacion de PowerPoint de la fuente de poder.pptx
presentacion de PowerPoint de la fuente de poder.pptxpresentacion de PowerPoint de la fuente de poder.pptx
presentacion de PowerPoint de la fuente de poder.pptxlosdiosesmanzaneros
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíassuserf18419
 
Presentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxPresentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxLolaBunny11
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITMaricarmen Sánchez Ruiz
 
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdfRefrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdfvladimiroflores1
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricKeyla Dolores Méndez
 
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxPROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxAlan779941
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan JosephBRAYANJOSEPHPEREZGOM
 
Presentación de elementos de afilado con esmeril
Presentación de elementos de afilado con esmerilPresentación de elementos de afilado con esmeril
Presentación de elementos de afilado con esmerilJuanGallardo438714
 
Modulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdfModulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdfAnnimoUno1
 
Desarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdfDesarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdfJulian Lamprea
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveFagnerLisboa3
 
Avances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanaAvances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanamcerpam
 
Avances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estosAvances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estossgonzalezp1
 

Último (15)

EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptxEL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
 
presentacion de PowerPoint de la fuente de poder.pptx
presentacion de PowerPoint de la fuente de poder.pptxpresentacion de PowerPoint de la fuente de poder.pptx
presentacion de PowerPoint de la fuente de poder.pptx
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnología
 
Presentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxPresentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptx
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNIT
 
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdfRefrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
 
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxPROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Joseph
 
Presentación de elementos de afilado con esmeril
Presentación de elementos de afilado con esmerilPresentación de elementos de afilado con esmeril
Presentación de elementos de afilado con esmeril
 
Modulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdfModulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdf
 
Desarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdfDesarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdf
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial Uninove
 
Avances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanaAvances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvana
 
Avances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estosAvances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estos
 

Clase 05d cobertura de codigo

  • 1. Pruebas de Software Cobertura de Código Complejidad Ciclomática Universidad de los Andes Demián Gutierrez Febrero 2013
  • 2. Code Coverage ¿code coverage? ¿cobertura de código?
  • 3. Code Coverage dado un conjunto de pruebas ¿qué porcentaje del total del software bajo prueba (código) es cubierto por las pruebas?
  • 4. Code Coverage dado el siguiente método 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); } } ¿cómo lo probamos? (de forma satisfactoria)
  • 5. 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); } } @Test public 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?
  • 6. Code Coverage veamos otro ejemplo 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"); } } ¿cómo lo probamos? (de forma satisfactoria)
  • 7. Code 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"); } } @Test public void faa_line_coverage() { Faa faa = new Faa(); faa.methodUnderTest(1, 2); } ¿se ejecutan todas las líneas de código? cobertura de líneas de código del 100% ¿será suficiente?
  • 8. Code 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"); } } @Test public void faa_line_coverage() { Faa faa = new Faa(); faa.methodUnderTest(1, 2); } se ejecutan todas las líneas de código, pero no se prueban todos las posibles salidas del if, es decir, no hay un 100% de cobertura de ramas
  • 9. 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"); } } @Test @Test public void faa_branch_coverage1() { public void faa_branch_coverage2() { Bar bar = new Bar(); Bar bar = new Bar(); bar.methodUnderTest(1, 2); bar.methodUnderTest(3, 2); } } ahora no solo se ejecutan el 100% de las líneas de código, sino que se ejecutan todas las alternativas de cada estructura de control (100% cobertura de ramas) ¿será suficiente?
  • 10. Code Coverage aún otro ejemplo 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"); } } } ¿cómo lo probamos? (de forma satisfactoria)
  • 11. Code Coverage aún otro ejemplo 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"); } } } no hay manera de obtener 100% de cobertura de líneas de código con un sólo test
  • 12. 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"); } @Test @Test public void bar_branch_coverage1() { public void bar_branch_coverage2() { Bar bar = new Bar(); Bar bar = new Bar(); bar.methodUnderTest(1, 1, 2); 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?
  • 13. 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"); } @Test @Test public void bar_branch_coverage1() { public void bar_branch_coverage2() { Bar bar = new Bar(); Bar bar = new Bar(); bar.methodUnderTest(1, 1, 2); bar.methodUnderTest(3, 3, 2); } } ¿se prueban todas las combinaciones posibles entre las distintas ramas? (cobertura de caminos) para tener un 100% de cobertura de caminos no es suficiente con 2 pruebas
  • 14. 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"); } @Test @Test public void bar_path_coverage1() { public void bar_path_coverage3() { Bar bar = new Bar(); Bar bar = new Bar(); bar.methodUnderTest(1, 1, 2); bar.methodUnderTest(1, 3, 2); } } @Test @Test public void bar_path_coverage2() { public void bar_path_coverage4() { Bar bar = new Bar(); Bar bar = new Bar(); bar.methodUnderTest(3, 3, 2); bar.methodUnderTest(3, 1, 2); } } ahora hay 100% de cobertura de caminos
  • 15. 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"); } @Test @Test public void bar_path_coverage1() { public void bar_path_coverage3() { Bar bar = new Bar(); Bar bar = new Bar(); bar.methodUnderTest(1, 1, 2); bar.methodUnderTest(1, 3, 2); } } @Test @Test public void bar_path_coverage2() { public void bar_path_coverage4() { Bar bar = new Bar(); Bar bar = new Bar(); bar.methodUnderTest(3, 3, 2); bar.methodUnderTest(3, 1, 2); } } ahora hay 100% de cobertura de caminos
  • 17. 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
  • 18. 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); CC=1 System.err.println("do something with c: " + c); } } public class Faa { CC=2 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"); } }
  • 19. 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
  • 20. 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 * 1 CC = 3 en general #pruebas 100% Cobertura de Ramas <= complejidad ciclomática <= #pruebas 100% Cobertura de Caminos
  • 21. Code Coverage Ejemplos Corriendo Emma / EclEmma (http://www.eclemma.org/)
  • 22. 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
  • 23. Gracias ¡Gracias!