Preguntas frecuentes (FAQ)

P. ¿Qué hace que una línea esté parcialmente cubierta (señalado con un indicador amarillo)?

R. Una línea se indicará como parcialmente cubierta si no se ejecutan todas las ramas a través del código.

A continuación se proporcionan un par de ejemplos:

  1. Manejadores de excepciones:

  2. try {
    methodA() // methodA throws Exception
    } catch (Exception e) {..}

    La línea que llama a methodA está parcialmente cubierta porque hay dos vías de acceso: o bien se lanza y se captura una excepción, o bien no se lanza una excepción y el programa se ejecuta normalmente. En el caso en el que no se lanza la excepción, la cobertura parcial se indica porque la captura no se ejecuta nunca.

  3. Código de constructor compartido:
  4. En el ejemplo que figura más arriba, la línea 4 está marcada como parcialmente cubierta. Fíjese en que el código de inicialización de variable de instancia se ejecuta sin que importe qué constructor se utiliza para crear la instancia de objeto. El compilador pone el código de inicialización en ambos constructores. El código que figura más arriba es por tanto más o menos equivalente a:

    Puesto que sólo utilizamos un constructor, la otra vía de acceso de ejecución no se ejecuta y se indica la cobertura parcial.

P. ¿En los informes de cobertura de código, por qué el total de líneas de las que se informa para un paquete no es igual al total mostrado para las clases en ese paquete?

R. Al informar del total de líneas de un paquete descontamos las líneas compartidas entre métodos para que no se cuenten dos veces.

P. ¿Por qué las definiciones de clase (por ejemplo public class Foo {..}) se indican como no cubiertas (rojo) o parcialmente cubiertas (amarillo)?

R. Si la clase no tiene un constructor predeterminado explícito, el compilador generará uno y, como es implícito, puede estar asociado a esa línea de código. En segundo lugar, si tiene un código de inicialización estático (por ejemplo, campos estáticos), el compilador genera bloques de inicialización estáticos que también pueden asociarse a esa línea.

P. ¿Por qué los indicadores de cobertura del Explorador de paquetes aparecen en rojo incluso aunque el porcentaje cubierto sobrepase el nivel de cobertura aceptable?

R. Cuando se establece más de un criterio de aceptación (por ejemplo, método Y bloque), el indicador se mostrará en rojo si no se cumple alguno de los criterios. Los criterios de aceptación se establecen seleccionando propiedades de cobertura de código y después habilitando los indicadores y los porcentajes. Los indicadores de cobertura de código se establecen seleccionando preferencias de cobertura de código y después habilitando los indicadores (método, bloque, etc.). El color lo determinarán los criterios establecidos mediante la página de propiedades y no mediante la página de preferencias.

P. ¿Qué líneas no se cuentan en la cobertura de código?

R. Lo siguiente no se cuenta como cubierto, no cubierto ni parcialmente cubierto y no se utiliza para calcular el porcentaje cubierto:

P. ¿Qué significa el concepto de bloque en la cobertura de bloque?

R. Una unidad ejecutable empieza al principio de cada bloque básico y en cada código de byte cuyo número de línea fuente es diferente del código de byte anterior. Un bloque básico es una región de instrucciones de código de byte dentro de la cual no se puede salir a una rama ni entrar en otra. Cuando se ejecuta la primera instrucción en un bloque básico, se ejecutan todas las instrucciones, por lo que se considera que las instrucciones son un sólo grupo.

Los bloques básicos terminan con instrucciones como por ejemplo branch, call, throw y return.

P. ¿Por qué al depurar aplicaciones habilitadas para cobertura de código, el depurador recorre llc_probe.class en lugar del método esperado?

R. Esto es debido a la forma de recopilación de datos de cobertura de código. Para solucionarlo, debe utilizar los filtros de recorrer: