¿De qué manera las herramientas de cobertura de código como NCover saben qué partes del código se ejecutaron y qué partes no?¿Cómo funcionan las herramientas de cobertura de código?
Respuesta
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'.
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.
"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. –
@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
@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. –
Aquí hay un documento técnico sobre How to Implement test coverage tools for arbitrary languages.
Mi empresa crea una familia de herramientas de cobertura de prueba para Java, C#, C++, PHP, COBOL, PLSQL, ... basadas en este principio.
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.
- Para la cobertura de líneas de código que utiliza los puntos de secuencia tomadas de un archivo
- 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.
- 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.
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.
- 1. Herramientas de cobertura de código en Java
- 2. Herramientas de cobertura de código para Scala
- 3. Ejecución por lotes de herramientas de cobertura de código VS
- 4. ¿Cuáles son algunas herramientas de cobertura de código para Perl?
- 5. Herramientas de cobertura de código para Symbian C++ y Maemo
- 6. herramientas de cobertura de código para expresiones regulares?
- 7. árbol de llamadas de un método: ¿cómo funcionan las herramientas de cobertura en Java? ¿Hay una API?
- 8. TDD y Cobertura de código
- 9. ¿Cuáles son las herramientas más efectivas (de acceso libre) para la cobertura del código C#?
- 10. Cobertura de código/cobertura recomendada valores
- 11. cobertura de código vs ExpectedException
- 12. Cobertura de código para PL/SQL
- 13. ¿Cobertura de código con nUnit?
- 14. Excluir métodos específicos de cobertura de código de cobertura?
- 15. Herramientas para visualizar el grafo de llamada de aplicación C++ multiproceso, cobertura de código multiproceso?
- 16. XCode - ¿Cobertura del código?
- 17. Excluir métodos de cobertura de código con Cobertura
- 18. Cobertura de código y culpa
- 19. google-test: código de cobertura
- 20. Herramienta de cobertura de código XSL
- 21. Herramientas gratuitas de cobertura de código en .NET para proyecto personal
- 22. Cobertura de código de Java en Hudson
- 23. ¿Cómo funcionan las cookies?
- 24. ¿Qué es la cobertura del código y cómo lo mides?
- 25. ¿Qué es la cobertura del código?
- 26. C Código: ¿Cómo funcionan esto?
- 27. ¿Cómo empezar a escribir una herramienta de cobertura de código?
- 28. PyCharm, Django: cobertura de código cero
- 29. ¿Cómo funcionan estos fragmentos de código exactamente?
- 30. ¿Cómo funcionan los perfiladores de código?
Esperaba ver algún código :) –
@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. –
En realidad lo he intentado, pero el código no es muy claro, ya que no hay comentarios en el código :) –