¿Cómo leo un informe de cobertura de Estambul?

131

Siempre he usado Jasmine para mis pruebas unitarias, pero recientemente comencé a usar Estambul para darme informes de cobertura de código. Quiero decir, entiendo la esencia de lo que están tratando de decirme, pero no se sabe muy bien lo que cada uno de estos porcentajes representan (Stmts, ramas, Funcs, líneas). Hasta ahora, Google no he podido encontrar una explicación / recurso sólido.

Pregunta : Como dije, lo entiendo, pero ¿alguien puede publicar una explicación adecuada o un enlace a una explicación adecuada?

Pregunta terciaria : ¿Hay alguna forma de identificar qué partes específicas de su código no están cubiertas? Hasta ahora sin realmente asimilar este informe, básicamente estoy adivinando.

-------------------|-----------|-----------|-----------|-----------|
File               |   % Stmts |% Branches |   % Funcs |   % Lines |
-------------------|-----------|-----------|-----------|-----------|
   controllers/    |      88.1 |     77.78 |     78.57 |      88.1 |
      dashboard.js |      88.1 |     77.78 |     78.57 |      88.1 |
-------------------|-----------|-----------|-----------|-----------|
All files          |      88.1 |     77.78 |     78.57 |      88.1 |
-------------------|-----------|-----------|-----------|-----------|
Scott Sword
fuente
3
La ejecución de Estambul también debe producir un archivo HTML para el informe (debe estar en la carpeta de cobertura). Este HTML debería brindarle información detallada cuando hace clic en archivos / carpetas
Yaron Schwimmer
Gracias @yarons. Eso definitivamente ayuda a profundizar en la cobertura e identificar lo que específicamente no se está cubriendo. Todavía no entiendo en profundidad lo que significan los porcentajes = /.
Scott Sword

Respuestas:

217

Existen varios criterios de cobertura, los principales son:

  • Cobertura de funciones ¿Se ha llamado a cada función (o subrutina) en el programa?
  • Cobertura del estado de cuenta ¿Se ha ejecutado cada estado del programa?
  • Cobertura de rama ¿Se ha ejecutado cada rama (también llamada ruta DD) de cada estructura de control (como en declaraciones if y case)? Por ejemplo, dada una declaración if, ¿se han ejecutado las ramas verdadera y falsa? Otra forma de decir esto es, ¿se han ejecutado todas las ventajas del programa?
  • Cobertura de línea ¿se ha ejecutado cada línea ejecutable en el archivo fuente?

Para cada caso, el porcentaje representa el código ejecutado frente al código no ejecutado , que equivale a cada fracción en formato de porcentaje (por ejemplo: 50% de ramas, 1/2).

En el informe del archivo:

  • 'E' significa 'otra ruta no tomada', lo que significa que para la instrucción marcada if / else, la ruta 'if' ha sido probada pero no la 'otra'.
  • 'I' significa 'si la ruta no se tomó', que es el caso opuesto: el 'si' no se ha probado.
  • La xNcolumna de la izquierda es la cantidad de veces que se ejecutó esa línea.
  • Las líneas no ejecutadas, o fragmentos de código, se resaltarán en rojo.

Esto se ha verificado para Estambul v0.4.0, no estoy seguro de si esto todavía se aplica a las versiones posteriores, pero dado que la biblioteca se basa en principios teóricos sólidos, el comportamiento no debería cambiar demasiado para las versiones más nuevas.

También proporciona algunos códigos de color:

Rosado : declaraciones no cubiertas.

naranja : funciones no cubiertas.

Amarillo : ramas no cubiertas.

Documentos completos de Estambul aquí:

https://istanbul.js.org

Para una teoría más detallada sobre la cobertura del código:

https://en.wikipedia.org/wiki/Code_coverage

¡Espero eso ayude!

Amy Pellegrini
fuente
8

La ejecución de Estambul también debe producir un archivo HTML para el informe (debe estar en la carpeta de cobertura). Este HTML debería proporcionarle información detallada cuando haga clic en archivos / carpetas.

El porcentaje de funciones cubiertas se calcula por el número de funciones que se llamaron durante las pruebas, dividido por el número total de funciones. Lo mismo ocurre con las líneas y las declaraciones (que generalmente estarán cercanas entre sí a menos que tenga declaraciones muy largas). Las ramas significan puntos de decisión como if-elsebloques. Por ejemplo, digamos que su código solo contiene una if-elsedeclaración, y sus pruebas solo pasan por la ifparte pero no por la elseparte, entonces su porcentaje de ramas debe ser del 50%.

Espero que aclare las cosas.

Yaron Schwimmer
fuente
Corrí Estambul especificando "test" : "nyc mocha"en package.json. Mi carpeta de cobertura está en blanco. Pensamientos?
TheCrazyProgrammer
1
Agregué el reportero HTML. Ahora funciona. "test" : "nyc --reporter=html mocha"
TheCrazyProgrammer
Como ejemplo: si tiene una rama grande if y una pequeña rama else, y solo se ejecutó la rama if, la cobertura de la línea se verá excelente, pero la cobertura de la rama seguirá siendo solo del 50%. Además, puede tener varias declaraciones por línea si las declaraciones están separadas por punto y coma o si la línea incluye una definición de función (que contiene sus propias declaraciones). Puede tener varias líneas por declaración si la declaración tiene saltos de línea antes del punto y coma final.
Hew Wolff
0

Agregando a las respuestas anteriores

El% de declaraciones se calcula tomando un porcentaje del número de declaraciones cubiertas por su prueba, por ejemplo, 12/18 * 100 = 66.67%. Esto significa que su prueba cubrió solo el 66.67%.

El% Branch también se calcula de la misma manera. Lo mismo para sus% Functions y% lines.

En el directorio raíz de su proyecto, hay una carpeta de cobertura que contiene la salida HTML de su prueba. Haz clic en él y visualízalo en el navegador. Debería ver algo como esto

Imagen que muestra la salida de los resultados de la prueba.

Espero que esto te ayude a entenderlo mejor.

Samuel Pinheiro
fuente