2011-02-24 6 views
7

En Cobertura, no puedo obtener que informe que se tomó la ruta condicional de una declaración afirmativa. ¿Es esta una limitación conocida?¿Por qué Cobertura no informa que se ha cubierto la ruta de acceso de la sucursal?

Tengo una prueba JUnit que espera y se lanzará AssertionError, y se procesa correctamente. El problema es que Cobertura informa que la rama de afirmación no estaba cubierta.


Después de más investigaciones, veo que se está detectando parte de la cobertura de la sucursal. La línea es pregunta es:

assert data != null; 

y Cobertura informa las coberturas como:

cobertura condicional 75% (3/4) [cada condición de 50%, 100%].

¿Cuáles son las diferentes condiciones de la sucursal que Cobertura espera?

Respuesta

3

Pude obtener el 100% de cobertura ejecutando JUnit dos veces; una vez con aserciones habilitadas, y una vez con aserciones deshabilitadas.

+2

¿Podría publicar la configuración POM relevante (para ejecutar las pruebas JUnit dos veces)? –

10

Me encontré con el mismo problema, por lo que invertí un poco de tiempo para realizar una ingeniería inversa de la respuesta, donándola a Stack   Overflow.

Para cada -statement Java assert, Cobertura comprueba dos condiciones:

  1. El que una sentencia assert dada fue ejecutado con la afirmación comprobación activada o desactivada.
  2. Si el predicado realmente se evalúa como verdadero o falso.

Por lo tanto, son posibles un total de cuatro resultados. La información proporcionada para una línea dada en un informe HTML consiste en

  • el resultado de la condición 1 (0-2 posibilidades sacados de 2 referente a la ejecución con la comprobación activado o desactivado),
  • y el resultado para la condición 2 (0-2 posibilidades sacadas de 2: aserción pase o falle).
  • el resultado global (0-4 de 4),

escenario típico son:

  • Ejecución de Cobertura una vez, con la comprobación de la afirmación discapacitados. Obtendrá:
    habilitado/deshabilitado: 50% (deshabilitado); Aprobado/Fallido: 0% (no alcanzado); Por lo tanto, en general el 25%.
    Cobertura informará esto como

    Conditional coverage 25% (1/4) [each condition 50%, 0%]

  • Ejecución de Cobertura una vez, con la afirmación de comprobar permitido. Normalmente sus afirmaciones son siempre ciertas, por lo tanto obtiene:
    Habilitado/Deshabilitado: 50% (habilitado); Aprobado/Fallido: 50% (siempre verdadero); Por lo tanto, en general: 50%.

  • Corriendo Cobertura dos veces, una vez con la verificación de afirmación habilitada, y una vez sin. Suponiendo que las aserciones son siempre verdaderas, obtenemos:
    Habilitado/Deshabilitado: 100% (habilitado y deshabilitado); Aprobado/Fallido: 50% (siempre verdadero); Por lo tanto, en general el 75%.

Entonces, si sumamos los casos de prueba que aseguran que una afirmación dada falla al menos una vez, y pasa al menos una vez, obtenemos todos los números en el 100%.

Nótese, sin embargo, que si se utiliza afirmaciones en el estilo de diseño por contrato, por lo general, ni siquiera será capaz de hacer fracasar, ver la respuesta a otra pregunta   Pila de desbordamiento, Cobertura coverage and the assert keyword.

Finalmente: aunque estos números son explicables, no estoy seguro de que sean muy útiles. Mi preferencia sería poder omitir la cobertura relacionada con la afirmación de los informes generales. Clover puede hacer esto, pero no conozco una herramienta de análisis de cobertura de fuente abierta con esta bonita función.

+1

¡Guau! Tal vez un truco 'javac' que reemplace todas las declaraciones de afirmación con noop podría ayudar a reparar la cobertura. Consulte http://scg.unibe.ch/staff/adriankuhn/javacompiler/forceassertions para saber cómo hacerlo. Sin embargo, eventualmente Cobertura debe ser reparado para ignorar las afirmaciones. Patch, ¿alguien? – akuhn

+0

Noops para rescatar informes de cobertura: ¡buena idea! – avandeursen

+0

Si está probando sus clases por unidad, no debería ser difícil hacer que las afirmaciones fallen. Supongo que depende del nivel en el que estás probando la unidad. Además, le advierto sobre la conversión de afirmaciones a no-operaciones, ya que podría terminar ocultando un error en su lógica de afirmación. – cmcginty

Cuestiones relacionadas