- Obtenemos el reporte de cobertura en xml
dotnet test /p:CollectCoverage=true /p:CoverletOutputFormat=cobertura
- Utilizando ReportGenerator
reportgenerator "-reports:coverage.cobertura.xml” "-targetdir:coverage-report" -reporttypes:html;
Si ya lograste medir la cobertura de tus pruebas unitarias en .NET, el siguiente paso es transformar esos números de consola en un reporte visual de cobertura que puedas analizar con calma. Aquí aprenderás a generar reportes en formato Cobertura y HTML usando ReportGenerator y la extensión FineCodeCoverage en Visual Studio.
¿Cómo exportar la cobertura a un archivo XML estándar?
El primer paso es decirle a Coverlet que exporte los resultados en un formato que cualquier herramienta pueda leer. El formato Cobertura es el estándar más usado en .NET y en otros lenguajes, y muchos servicios en la nube lo aceptan sin configuración extra.
El comando que usas en la terminal es este:
bash dotnet test /p:CollectCoverage=true /p:CoverletOutputFormat=cobertura
Al ejecutarlo obtienes el resumen habitual: cuántas pruebas pasaron, cuántas fallaron y los porcentajes de cobertura. Pero ahora aparece también un archivo cobertura.xml dentro del proyecto de pruebas [03:20].
¿Qué contiene el archivo cobertura.xml? Tiene el detalle por cada método: líneas cubiertas, branches evaluados y un flag en true o false según si el escenario se cumple. Es la materia prima para cualquier reporte visual.
¿Por qué usar el formato Cobertura y no otro?
Porque es interoperable. Funciona con .NET, con otros frameworks y con plataformas de integración continua. Si más adelante mueves tu pipeline a la nube, no tendrás que regenerar nada.
¿Cómo generar un reporte HTML con ReportGenerator?
El XML es completo, pero leerlo a mano es incómodo. Para eso instalas ReportGenerator desde el gestor de paquetes NuGet buscando “Report G”. Esta librería en realidad es una tool de .NET, así que funciona como herramienta de línea de comandos más que como dependencia del proyecto [05:10].
Una vez instalada, ejecutas el comando con dos parámetros obligatorios y uno opcional:
-reports: la ruta al archivo cobertura.xml generado en el paso anterior.-targetdir: la carpeta donde quieres guardar el reporte, por ejemplo coverage-report. Si no existe, se crea sola.-reporttypes: opcional, define el formato de salida. HTML es el más fácil de interpretar.Al correrlo, aparece una nueva carpeta coverage-report con todos los archivos necesarios. Abres index.html y ya tienes el reporte navegable [07:45].
¿Qué información puedes ver en el reporte HTML?
Puedes navegar por cada clase detectada en las pruebas. En el ejemplo, la clase StringOperations muestra el detalle por método: porcentaje de cobertura, líneas cubiertas y escenarios faltantes.
Un caso concreto: un método aparece con 50 % de cobertura porque solo se prueba el escenario donde se lanza una excepción, pero no el camino feliz donde retorna el string correctamente. Otro método, removeWhiteSpaces, aparece sin cobertura porque ni siquiera está implementado todavía.
¿Qué es un branch en cobertura de código? Es cada camino posible de ejecución dentro de un método, por ejemplo las ramas de un if o un switch. La cobertura de branch mide cuántos de esos caminos fueron ejecutados por tus pruebas.
¿Cómo ver la cobertura sin salir de Visual Studio con FineCodeCoverage?
Si prefieres no abrir el navegador cada vez, puedes instalar la extensión FineCodeCoverage desde el menú de extensiones de Visual Studio. Después de instalarla, cierras y vuelves a abrir el editor para que aparezca [10:30].
La encuentras en View > Other Windows > FineCodeCoverage. Ahí mismo puedes:
Un detalle importante: FineCodeCoverage no reutiliza el XML que ya generaste, sino que crea su propio reporte sobre todo el proyecto, sin filtros ni exclusiones por defecto.
¿Cómo configurar FineCodeCoverage para excluir clases?
Vas a Tools > Options y buscas la sección de FineCodeCoverage. Ahí defines qué motor usar (Coverlet, OpenCover o el de Microsoft) y aplicas filtros por directorio o por atributo.
La opción clave es ExcludeByAttribute: indicas el atributo que quieres usar para que ciertas clases o métodos queden fuera del cálculo. Así obtienes un porcentaje más realista, sin contaminar con código generado o utilitarios que no necesitan pruebas.
¿Cuándo usar ReportGenerator y cuándo FineCodeCoverage? Usa ReportGenerator cuando quieras integrar el reporte en un pipeline de CI/CD o compartirlo como HTML. Usa FineCodeCoverage cuando estés desarrollando y necesites feedback inmediato dentro de Visual Studio.
Ahora cuentas con dos caminos complementarios para analizar tu cobertura: uno automatizable y portable, otro integrado al editor. ¿Cuál vas a probar primero en tu próximo proyecto con xUnit? Cuéntame en los comentarios qué métricas te interesa empezar a vigilar.
Si ya lograste medir la cobertura de tus pruebas unitarias en .NET, el siguiente paso es transformar esos números de consola en un reporte visual de cobertura que puedas analizar con calma. Aquí aprenderás a generar reportes en formato Cobertura y HTML usando ReportGenerator y la extensión FineCodeCoverage en Visual Studio.
El primer paso es decirle a Coverlet que exporte los resultados en un formato que cualquier herramienta pueda leer. El formato Cobertura es el estándar más usado en .NET y en otros lenguajes, y muchos servicios en la nube lo aceptan sin configuración extra.
El comando que usas en la terminal es este:
bash dotnet test /p:CollectCoverage=true /p:CoverletOutputFormat=cobertura
Al ejecutarlo obtienes el resumen habitual: cuántas pruebas pasaron, cuántas fallaron y los porcentajes de cobertura. Pero ahora aparece también un archivo cobertura.xml dentro del proyecto de pruebas [03:20].
¿Qué contiene el archivo cobertura.xml? Tiene el detalle por cada método: líneas cubiertas, branches evaluados y un flag en true o false según si el escenario se cumple. Es la materia prima para cualquier reporte visual.
Porque es interoperable. Funciona con .NET, con otros frameworks y con plataformas de integración continua. Si más adelante mueves tu pipeline a la nube, no tendrás que regenerar nada.
El XML es completo, pero leerlo a mano es incómodo. Para eso instalas ReportGenerator desde el gestor de paquetes NuGet buscando “Report G”. Esta librería en realidad es una tool de .NET, así que funciona como herramienta de línea de comandos más que como dependencia del proyecto [05:10].
Una vez instalada, ejecutas el comando con dos parámetros obligatorios y uno opcional:
-reports: la ruta al archivo cobertura.xml generado en el paso anterior.-targetdir: la carpeta donde quieres guardar el reporte, por ejemplo coverage-report. Si no existe, se crea sola.-reporttypes: opcional, define el formato de salida. HTML es el más fácil de interpretar.Al correrlo, aparece una nueva carpeta coverage-report con todos los archivos necesarios. Abres index.html y ya tienes el reporte navegable [07:45].
Puedes navegar por cada clase detectada en las pruebas. En el ejemplo, la clase StringOperations muestra el detalle por método: porcentaje de cobertura, líneas cubiertas y escenarios faltantes.
Un caso concreto: un método aparece con 50 % de cobertura porque solo se prueba el escenario donde se lanza una excepción, pero no el camino feliz donde retorna el string correctamente. Otro método, removeWhiteSpaces, aparece sin cobertura porque ni siquiera está implementado todavía.
¿Qué es un branch en cobertura de código? Es cada camino posible de ejecución dentro de un método, por ejemplo las ramas de un if o un switch. La cobertura de branch mide cuántos de esos caminos fueron ejecutados por tus pruebas.
Si prefieres no abrir el navegador cada vez, puedes instalar la extensión FineCodeCoverage desde el menú de extensiones de Visual Studio. Después de instalarla, cierras y vuelves a abrir el editor para que aparezca [10:30].
La encuentras en View > Other Windows > FineCodeCoverage. Ahí mismo puedes:
Un detalle importante: FineCodeCoverage no reutiliza el XML que ya generaste, sino que crea su propio reporte sobre todo el proyecto, sin filtros ni exclusiones por defecto.
Vas a Tools > Options y buscas la sección de FineCodeCoverage. Ahí defines qué motor usar (Coverlet, OpenCover o el de Microsoft) y aplicas filtros por directorio o por atributo.
La opción clave es ExcludeByAttribute: indicas el atributo que quieres usar para que ciertas clases o métodos queden fuera del cálculo. Así obtienes un porcentaje más realista, sin contaminar con código generado o utilitarios que no necesitan pruebas.
¿Cuándo usar ReportGenerator y cuándo FineCodeCoverage? Usa ReportGenerator cuando quieras integrar el reporte en un pipeline de CI/CD o compartirlo como HTML. Usa FineCodeCoverage cuando estés desarrollando y necesites feedback inmediato dentro de Visual Studio.
Ahora cuentas con dos caminos complementarios para analizar tu cobertura: uno automatizable y portable, otro integrado al editor. ¿Cuál vas a probar primero en tu próximo proyecto con xUnit? Cuéntame en los comentarios qué métricas te interesa empezar a vigilar.
dotnet test /p:CollectCoverage=true /p:CoverletOutputFormat=cobertura
reportgenerator "-reports:coverage.cobertura.xml” "-targetdir:coverage-report" -reporttypes:html;
Si no les detecta reportgenerator como un comando del cmdlet, instalenlo global. Les dejo el comando extraido de NuGet
dotnet tool install --global dotnet-reportgenerator-globaltool --version 5.2.0
Parámetro para crear un reporte de la cobertura de los test con Coverlet:
dotnet test /p:CollectCoverage=true /p:CoverletOutpuFormat=cobertura
Por que me sale este error reportgenerator : El término 'reportgenerator' no se reconoce como nombre de un cmdlet, función, archivo de script o programa ejecutable. Compruebe si escribió correctamente el nombre o, si incluyó una ruta de acceso, compruebe que dicha ruta es correcta e inténtelo de nuevo. En línea: 1 Carácter: 1
+ CategoryInfo : ObjectNotFound: (reportgenerator:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
Comando para generar el reporte html a partir del .xml con ReportGenerator
reportgenerator "-reports:coverage.cobertura.xml” "-targetdir:coverage-report" -reporttypes:html;
En la pagina de Nuget donde busco para instalar las herramientas en visual studio code aparecen 2: ReportGenerator y ReportGenerator.Core ¿cual es la diferencia? ¿Cual instalamos en code?
A mí no me sale la extensión de FineCode Coverage disponible para instalar. No aparece en los resultados de búsqueda.
Solución de ChatGPT para los que no les reconoce el archivo
La línea de comandos que proporcionaste tiene un problema con las comillas dobles. Asegúrate de usar comillas dobles consistentes y correctamente formateadas. Aquí está la corrección:
reportgenerator "-reports:coverage.cobertura.xml" "-targetdir:coverage-report" -reporttypes:html
Asegúrate de que las comillas dobles estén correctamente formateadas. Puedes copiar y pegar la línea de comandos corregida para ejecutar ReportGenerator. Si aún encuentras problemas, revisa la ubicación del archivo de cobertura y ajusta la ruta en consecuencia.
El reporte de Method Coverage ahora funciona solo para los patrocinadores

Gente los invito a estudiar sobre pruebas de mutación y dotnet stryker, considero que las validaciones van un paso más allá al validar que los tests estén bien construidos (y en el camino uno al final termina revisando la cobertura)