2010-06-16 9 views

Respuesta

7

Cita directamente de la NCover FAQ: NCover informa el porcentaje de sucursales en el código que se han tomado durante el transcurso de sus pruebas automatizadas. Lo logra instrumentando el código fuente en cada rama, y ​​escribiendo los puntos de 'golpe' en un archivo. Estos puntos de 'golpe' se comparan con el total de puntos posibles que podrían haber sido 'golpeados'.

+1

Esperaba ver algún código :) –

+7

@Yassir: Es posible que desee aclarar su pregunta al respecto. Sin embargo, dado que NCover es de código abierto, ya puede ver cómo lo hace ... Sugeriría ver si puede ver una versión lo más temprana posible, donde probablemente habrá menos código y, por lo tanto, debería mostrarle la estructura más fácil. –

+0

En realidad lo he intentado, pero el código no es muy claro, ya que no hay comentarios en el código :) –

1

Requiere que ejecute sus pruebas una vez con el análisis de cobertura de código habilitado, y luego simplemente cuenta el número de bloques (es decir, bloques de alcance) cubiertos y se compara con el número total de bloques en el proyecto (s) están probando.

El razonamiento básico es que si se cubre cada posible combinación de bloques de códigos, todas las rutas de códigos están cubiertas . El principal argumento en contra de poner demasiado peso en los números de cobertura de código es que los bloques "fáciles" como getters y setters, que no dan ningún valor real (y apenas podrían salir mal ...) cuentan tanto como más bloques de código propensos a errores .


1) Como ha señalado Ira Baxter en un comentario, la redacción anterior de esta frase es incorrecta. Por favor, lea los comentarios para una discusión sobre esto.

+4

"Si cada bloque está cubierto, todas las rutas de código están cubiertas". Falso. Imagine cuatro bloques, dos pares A1 A2 B1 B2, cada uno controlado por un if-thenelse A y B. Bajo el supuesto de que las condiciones if son independientes, hay 4 rutas posibles. Con A verdadero, puedes ejercitar B verdadero y falso; que cubrirá A1 B1 B2. Con A falso y B falso, están cubiertos A2 y B2. Con el conjunto de prueba descrito hasta ahora, A1 A2 B1 B2 (todos los bloques) están cubiertos. Pero la ruta A2 B1 no se ha ejecutado. No todos los caminos están cubiertos. Cobertura de bloque/rama! = Cobertura de ruta. –

+0

@IraBaxter No creo que el objetivo sea cubrir cada combinación de ejecución de código, pero que todos los bloques de código estén cubiertos al menos una vez. – Brenden

+1

@Brenden: por lo general, alguien que no sea usted define los criterios de "lo suficientemente bueno". Algunos se sentirán satisfechos con "cada bloque se ejecuta al menos una vez"; eso es esencialmente "cobertura de sucursal". Algunos insisten en que cada subcondición causal de cualquier expresión booleana está cubierta; esta es la razón por la cual el software de avión es tan bueno (DO-178B). Otros pueden insistir en que todos los caminos estén cubiertos. El punto es que hay muchos criterios y audiencias diferentes para cada uno. Te dicen lo que es aceptable, no al revés. –

3

Sé que esta es una pregunta antigua, pero si aún está interesado, puede ver un ejemplo de cómo se realiza dicha instrumentación para aplicaciones .NET mirando el proyecto de código abierto OpenCover.

OpenCover inserta puntos de instrumentación en puntos significativos en el código.

  1. Para la cobertura de líneas de código que utiliza los puntos de secuencia tomadas de un archivo
  2. PDB para la cobertura rama instrucciones de instrumentos de TI COND_BRANCH instrumentando el objetivo (s) de salto y la siguiente instrucción después de la instrucción de salto es decir, ningún salto.
  3. Para instrumentación de método, instrumenta la primera instrucción de cualquier método.

Todas estas reglas se aplican en CoverageInstrumentation.cpp después de que se hayan ubicado los puntos apropiados utilizando Mono.Cecil y se hayan pasado al perfilador desde el host de la consola.

El código fuente para PartCover también está disponible (como se indica), pero esto es mucho más difícil de seguir, pero también utiliza puntos de secuencia de PDB para determinar dónde instrumenta el código.

3

De this fuente:

NCover utiliza la API .NET perfilador Marco para supervisar la ejecución de una aplicación.Cuando un método se carga por el CLR, NCover recupera la IL y lo reemplaza con IL código instrumentado

Así que en resumen, se engancha en sí en la compilación justo a tiempo.

No todas las herramientas funcionan de la misma manera. Otras herramientas funcionan modificando el bytecode de su aplicación una vez que el código ha sido compilado.

Cuestiones relacionadas