¿Qué es la cobertura de código y cómo la mide?

276

¿Qué es la cobertura de código y cómo la mide?

Me hicieron esta pregunta con respecto a nuestra cobertura de código de prueba de automatización. Parece ser que, fuera de las herramientas automatizadas, es más arte que ciencia. ¿Hay ejemplos reales de cómo usar la cobertura de código?

Brian G
fuente

Respuestas:

243

La cobertura de código es una medida de cuántas líneas / bloques / arcos de su código se ejecutan mientras se ejecutan las pruebas automatizadas.

La cobertura de código se recopila mediante el uso de una herramienta especializada para instrumentar los binarios para agregar llamadas de rastreo y ejecutar un conjunto completo de pruebas automatizadas contra el producto instrumentado. Una buena herramienta le dará no solo el porcentaje del código que se ejecuta, sino que también le permitirá profundizar en los datos y ver exactamente qué líneas de código se ejecutaron durante una prueba en particular.

Nuestro equipo utiliza Magellan , un conjunto interno de herramientas de cobertura de código. Si usted es una tienda .NET, Visual Studio tiene herramientas integradas para recopilar la cobertura del código. También puede rodar algunas herramientas personalizadas, como se describe en este artículo .

Si usted es una tienda de C ++, Intel tiene algunas herramientas que se ejecutan para Windows y Linux, aunque no las he usado. También he oído que existe la herramienta gcov para GCC, pero no sé nada al respecto y no puedo darle un enlace.

En cuanto a cómo lo usamos, la cobertura del código es uno de nuestros criterios de salida para cada hito. En realidad, tenemos tres métricas de cobertura de código: cobertura de pruebas unitarias (del equipo de desarrollo), pruebas de escenario (del equipo de prueba) y cobertura combinada.

Por cierto, aunque la cobertura del código es una buena métrica de la cantidad de pruebas que está haciendo, no es necesariamente una buena métrica de qué tan bien está probando su producto. Hay otras métricas que debe usar junto con la cobertura del código para garantizar la calidad.

Franci Penov
fuente
41
"Hay otras métricas que debe usar junto con la cobertura del código para garantizar la calidad". ¿Podría decir cuáles son estas otras métricas?
Soldados
También puede usar Testwell CTC ++ , es una herramienta de cobertura de código bastante completa para C, C ++, C # y Java
B_PRIEUR
1
@Abdul Cuando mide la cobertura de código, debe ejecutar ambos tipos de pruebas y medir la cobertura de código por separado. En cuanto a los "arcos de código", esas son las ramas de ejecución de código, como si / entonces.
Franci Penov
1
@Maverick la mayoría de las personas asumen pruebas unitarias cuando hablan de la cobertura del código, sin embargo, en Microsoft estábamos midiendo la cobertura del código tanto de las pruebas unitarias como de las pruebas de integración.
Franci Penov
1
@darth_coder nada en general. La aplicación tampoco se instrumentará automáticamente, y si no hay nada que recopile los datos de instrumentación, la presencia de la nueva aplicación es irrelevante. El único caso en el que podría afectar las cosas es si la aplicación se ejecuta al mismo tiempo que se ejecutan las pruebas automáticas y está causando que el código del sistema operativo instrumentado se ejecute dentro del mismo proceso que la automatización de la prueba, lo que podría mostrar que se está ejecutando algún código del sistema operativo No tocado por las pruebas.
Franci Penov
190

La cobertura del código básicamente prueba que cuánto de su código está cubierto bajo las pruebas. Por lo tanto, si tiene una cobertura de código del 90%, significa que hay un 10% de código que no está cubierto por las pruebas. Sé que podría estar pensando que el 90% del código está cubierto, pero debe mirar desde un ángulo diferente. ¿Qué te detiene para obtener una cobertura del 100% del código?

Un buen ejemplo será este:

if(customer.IsOldCustomer()) 
{
}
else 
{
}

Ahora, en el código anterior hay dos caminos / ramas. Si siempre está presionando la rama "SÍ", entonces no está cubriendo la otra parte y se mostrará en los resultados de la Cobertura del Código. Esto es bueno porque ahora sabes lo que no está cubierto y puedes escribir una prueba para cubrir la parte más. Si no hubo cobertura de código, entonces estás sentado en una bomba de tiempo para explotar.

NCover es una buena herramienta para medir la cobertura del código.

azamsharp
fuente
55
¡La mejor respuesta, hace casi 10 años! ¡Maldición! :)
Nikos
44
Respuesta simple y significativa :)
Parveen
Si. El único que tenía sentido. Aunque ni siquiera me molesté en seguir desplazándome hacia abajo. Aquí es donde me detuve. Marcado como favorito
TheRealChx101
64

Solo recuerde, tener una "cobertura de código del 100%" no significa que todo se pruebe por completo, aunque significa que se prueba cada línea de código, no significa que se prueben en todas las situaciones (comunes).

Usaría la cobertura de código para resaltar bits de código para los que probablemente debería escribir pruebas. Por ejemplo, si la herramienta de cobertura de código que muestra myImportantFunction () no se ejecuta mientras se ejecutan mis pruebas unitarias actuales, probablemente deberían mejorarse.

Básicamente, el 100% de cobertura de código no significa que su código sea perfecto. Úselo como guía para escribir pruebas más completas (unitarias).

dbr
fuente
1
- "100% de cobertura de código" no significa que todo se haya probado por completo, aunque significa que se prueba cada línea de código, no significa que se prueben en cada situación (común) ...- "en cada (común) situación "es esto en lo que respecta a la entrada de datos y parámetros? Tengo dificultades para entender por qué si todo se prueba, no equivale a una prueba completa.
Abdul
20
El hecho de que cada línea de su código se ejecute en algún momento de sus pruebas, no significa que haya probado todos los escenarios posibles en los que el código podría ejecutarse. Si acaba de tener una función que tomó xy regresó x/xy ejecutó la prueba usando my_func (2), tendría una cobertura del 100% (ya que se habrá ejecutado el código de la función) pero se ha perdido un gran problema cuando 0 es el parámetro. Es decir, no ha probado todos los escenarios necesarios incluso con una cobertura del 100%.
Steve
¿Puede examinar esta situación cuando los casos de prueba de la Unidad no están escritos para todos los métodos? ¿La cobertura del código seguirá siendo del 100%? stackoverflow.com/questions/43395968/…
Sachin Kumar
52

Complementando algunos puntos a muchas de las respuestas anteriores:

La cobertura del código significa qué tan bien su conjunto de prueba está cubriendo su código fuente. es decir, en qué medida el código fuente está cubierto por el conjunto de casos de prueba.

Como se mencionó en las respuestas anteriores, hay varios criterios de cobertura, como rutas, condiciones, funciones, declaraciones, etc. Sin embargo, los criterios adicionales que se deben cubrir son

  1. Cobertura de condición: todas las expresiones booleanas que se evaluarán para verdadero y falso.
  2. Cobertura de decisión: no solo las expresiones booleanas se evaluarán para verdadero y falso una vez, sino para cubrir todo el cuerpo if-elseif-else posterior.
  3. Cobertura de bucle: significa que cada bucle posible se ha ejecutado una vez, más de una vez y cero tiempo. Además, si tenemos una suposición sobre el límite máximo, entonces, si es factible, pruebe los tiempos límite máximos y, uno más que los tiempos límite máximos.
  4. Cobertura de entrada y salida: pruebe todas las llamadas posibles y su valor de retorno.
  5. Cobertura del valor del parámetro (PVC). Para verificar si se prueban todos los valores posibles para un parámetro. Por ejemplo, una cadena podría ser cualquiera de estos comúnmente: a) nulo, b) vacío, c) espacios en blanco (espacio, tabulaciones, nueva línea), d) cadena válida, e) cadena no válida, f) cadena de un solo byte, g ) cadena de doble byte. Si no se prueba cada valor de parámetro posible, puede dejar un error. Probar solo uno de estos podría dar como resultado una cobertura del código del 100% a medida que se cubre cada línea, pero como solo se prueba una de las siete opciones, significa que solo el 14.2% de cobertura del valor del parámetro.
  6. Cobertura de herencia: en el caso de una fuente orientada a objetos, al devolver un objeto derivado referido por clase base, se debe evaluar la cobertura a evaluar, si se devuelve un objeto hermano.

Nota: El análisis de código estático encontrará si hay algún código inalcanzable o código colgado, es decir, código no cubierto por ninguna otra llamada de función. Y también otra cobertura estática. Incluso si el análisis de código estático informa que el 100% del código está cubierto, no proporciona informes sobre su conjunto de prueba si se prueba toda la cobertura de código posible.

Chand51
fuente
2
Buena adición aquí a las otras respuestas
HDave
15

La cobertura del código se ha explicado bien en las respuestas anteriores. Entonces esta es más una respuesta a la segunda parte de la pregunta.

Hemos utilizado tres herramientas para determinar la cobertura del código.

  1. JTest : una herramienta patentada construida sobre JUnit. (También genera pruebas unitarias).
  2. Cobertura : una herramienta de cobertura de código fuente abierto que se puede combinar fácilmente con pruebas JUnit para generar informes.
  3. Emma , otro, este que hemos usado para un propósito ligeramente diferente al de las pruebas unitarias. Se ha utilizado para generar informes de cobertura cuando los usuarios finales acceden a la aplicación web. Esto, junto con las herramientas de prueba web (ejemplo: Canoo) puede brindarle informes de cobertura muy útiles que le indican cuánto código se cubre durante el uso típico del usuario final.

Utilizamos estas herramientas para

  • Revise que los desarrolladores hayan escrito buenas pruebas unitarias
  • Asegúrese de atravesar todo el código durante las pruebas de recuadro negro
Vivek Kodira
fuente
6

La cobertura del código es simplemente una medida del código que se prueba. Hay una variedad de criterios de cobertura que se pueden medir, pero generalmente son las diversas rutas, condiciones, funciones y declaraciones dentro de un programa las que componen la cobertura total. La métrica de cobertura del código es solo un porcentaje de las pruebas que ejecutan cada uno de estos criterios de cobertura.

En cuanto a cómo hago para realizar un seguimiento de la cobertura de la prueba de unidad en mis proyectos, utilizo herramientas de análisis de código estático para realizar un seguimiento.

Desarrollador SaaS
fuente
5

Para Perl está el excelente módulo Devel :: Cover que uso regularmente en mis módulos.

Si la compilación y la instalación son administradas por Module :: Build, simplemente puede ejecutar ./Build testcoverpara obtener un buen sitio HTML que le indica la cobertura por sub, línea y condición, con bonitos colores que facilitan ver qué ruta de código no se ha cubierto.

Moritz
fuente
1

En las respuestas anteriores, la cobertura del código se ha explicado bien. Solo estoy agregando algunos conocimientos relacionados con las herramientas si está trabajando en plataformas iOSy OSX, Xcode proporciona la posibilidad de probar y monitorear la cobertura del código.

Enlaces de referencia:

https://developer.apple.com/library/archive/documentation/DeveloperTools/Conceptual/testing_with_xcode/chapters/07-code_coverage.html

https://medium.com/zendesk-engineering/code-coverage-and-xcode-6b2fb8756a51

Ambos son enlaces útiles para aprender y explorar la cobertura de código con Xcode.

taha027
fuente