Cobertura de pruebas con Coverlet en .NET

Resumen

La cobertura de pruebas unitarias en .NET es la métrica que te dice qué tan efectivas son las pruebas que escribes con xUnit y herramientas como Mock. Si ya sabes construir pruebas, este es el siguiente paso lógico: medir cuánta lógica de tu código realmente estás validando, identificar vacíos y enfocar tu esfuerzo donde más importa.

Dentro de un método pueden convivir múltiples flujos: condicionales, if, else y llamadas a otras funciones. Medir manualmente esa complejidad sería inviable, así que necesitas herramientas automáticas que te entreguen un porcentaje claro y accionable.

¿Qué es la cobertura de pruebas unitarias y para qué sirve?

La cobertura es una medición que arroja un porcentaje sobre cuánto de tu código está siendo ejecutado por las pruebas. No se trata de escribir más pruebas por escribir, sino de entender dónde tu lógica queda sin validar.

¿Qué porcentaje de cobertura es ideal en un proyecto .NET? Entre 70% y 80% para aplicaciones tradicionales. Si construyes una librería o utilidad, como un proyecto de manipulación de strings, lo ideal es superar el 90%.

Llegar al 100% suele ser poco realista porque hay código de plantilla, arquitectura y librerías externas que no forman parte de tu lógica de negocio. Aun así, librerías open source masivas como ReactJS o Angular se acercan a ese tope porque son usadas por miles de personas y cada función debe estar probada [2:30].

¿Qué herramientas existen para medir cobertura en .NET?

Hay varias opciones según tu entorno, tu presupuesto y la versión de .NET con la que trabajes. Algunas vienen integradas, otras son extensiones y otras son librerías que se instalan como paquetes.

  • Analyze Code Coverage for All Tests: opción nativa de Visual Studio Enterprise. No requiere instalar nada extra, pero depende de una licencia costosa, normalmente disponible si tu empresa es partner de Microsoft [3:30].
  • NCover y OpenCover: herramientas más antiguas, todavía funcionales, pero orientadas a .NET Framework, la versión clásica que poco a poco va siendo reemplazada [4:25].
  • DotCover: utilidad de JetBrains, incluida dentro de ReSharper. Con un clic detecta tus pruebas, las analiza y devuelve el porcentaje de cobertura [4:50].
  • FineCode Coverage: extensión gratuita de Visual Studio que vive de donaciones de la comunidad. Se apoya en librerías como OpenCover o Coverlet y funciona tanto para .NET Framework como para .NET moderno [5:25].

¿Cuál es la diferencia entre DotCover y FineCode Coverage? DotCover es una herramienta comercial de JetBrains con análisis propio. FineCode Coverage es gratuita y se apoya en librerías open source como Coverlet para generar el reporte.

¿Por qué Coverlet es la mejor opción para .NET moderno?

Coverlet es la librería en la que vale la pena concentrarse. Es completamente gratuita, open source y multiplataforma, así que funciona sin problema en Windows, Mac y Linux. Forma parte del suite de librerías open source de .NET Core, lo que la convierte en la opción natural para aplicaciones modernas.

Aunque soporta ambos frameworks, está mucho más orientada a .NET y .NET Core. Si trabajas con una aplicación clásica en .NET Framework, probablemente te sirvan más NCover u OpenCover. Pero para todo lo nuevo, Coverlet es el camino.

¿Qué ventajas técnicas ofrece Coverlet?

Más allá de ser gratuita, Coverlet tiene tres puntos fuertes que la hacen práctica en el día a día:

  • Funciona con cualquier librería de pruebas, no importa si usas xUnit, NUnit o MSTest.
  • Permite generar reportes de cobertura apoyándose en componentes adicionales.
  • Tiene múltiples parámetros de configuración para afinar el porcentaje y excluir lo que no quieres medir.

¿Cómo instalar y usar Coverlet en tu proyecto?

La configuración es sorprendentemente simple. Solo necesitas dos paquetes NuGet en tu proyecto de pruebas:

  • coverlet.msbuild
  • coverlet.collector

Con estos dos instalados ya puedes obtener la cobertura desde Visual Studio usando la extensión FineCode Coverage, o directamente desde la terminal con un comando.

bash dotnet test /p:CollectCoverage=true

¿Cómo se obtiene cobertura de pruebas con dotnet test? Instala los paquetes coverlet.msbuild y coverlet.collector, y ejecuta dotnet test con el parámetro CollectCoverage=true. La terminal te devolverá el porcentaje de cobertura.

Dos paquetes y un comando. Con eso tienes una métrica real de qué tan bien estás probando tu código, lista para revisar en la siguiente clase cuando midamos la cobertura del proyecto de manipulación de strings. ¿Qué porcentaje crees que vamos a obtener? Déjamelo en los comentarios.