Solucionar problemas de cobertura de código
Se aplica a: Visual Studio
La herramienta de análisis de cobertura de código de Visual Studio recopila datos para ensamblados nativos y administrados (archivos .dll o .exe). Sin embargo, en algunos casos, la ventana Resultados de cobertura de código muestra un error similar a "Resultados vacíos generados: ....". Este artículo le ayuda a solucionar los diversos motivos por los que puede encontrarse con resultados vacíos.
¿Qué debería ver?
Si se elige un comando Analizar cobertura de código en el menú Prueba, y si la compilación y las pruebas se ejecutan correctamente, debería ver una lista de resultados en la ventana Cobertura de código. Es posible que tenga que expandir los elementos para ver los detalles.
Para obtener más información, vea Usar cobertura de código para determinar la cantidad de código que se está probando.
Causas posibles para no ver ningún resultado o ver resultados antiguos
No está usando la edición correcta de Visual Studio
Necesita Visual Studio Enterprise.
No se ejecutó ninguna prueba
Análisis
Compruebe la ventana de salida. En la lista desplegable Mostrar resultados desde, elija Pruebas. Compruebe si hay advertencias o errores registrados.
Explicación
El análisis de cobertura de código se realiza mientras se ejecutan las pruebas. Solo incluye los ensamblados cargados en memoria cuando se ejecutan las pruebas. Si no se ejecuta ninguna de las pruebas, no hay nada que notificar con respecto a la cobertura de código.
Resolución
En el Explorador de pruebas, seleccione Ejecutar todo para comprobar que las pruebas se ejecutan correctamente. Corrija cualquier error antes de usar Analizar cobertura de código.
Está viendo un resultado anterior
Cuando se modifican y se vuelven a ejecutar las pruebas, todavía puede estar visible un resultado de cobertura de código anterior, incluido el color del código de esa ejecución anterior. Siga estos pasos para resolver el problema:
- Ejecute Analizar cobertura de código.
- Asegúrese de que ha seleccionado el conjunto de resultados más reciente en la ventana de resultados de cobertura de código.
Los archivos .pdb (símbolo) no están disponibles
Análisis
Abra la carpeta de destino de compilación (normalmente bin\debug) y compruebe que para cada ensamblado hay un archivo .pdb en el mismo directorio que el archivo .dll o .exe .
Explicación
El motor de cobertura de código requiere que todos los ensamblados tengan accesible su archivo .pdb asociado durante la ejecución de pruebas. Si no hay ningún archivo .pdb para un ensamblado determinado, el ensamblado no se analiza.
El archivo .pdb se debe generar a partir de la misma compilación que los archivos .dll o .exe.
Resolución
Asegúrese de que la configuración de compilación genere el archivo .pdb .
Si los archivos .pdb no se actualizan cuando se compila el proyecto, abra las propiedades del proyecto, seleccione la página Compilar , elija Avanzadas e inspeccione La información de depuración.
En Visual Studio 2022 y versiones posteriores, para proyectos de C# destinados a .NET Core o .NET 5+, abra las propiedades del proyecto, seleccione la pestaña Compilar , elija General e inspeccione símbolos de depuración.
En el caso de proyectos C++, asegúrese de que los archivos .pdb generados tienen información de depuración completa. Abra las propiedades del proyecto y compruebe que la opción Enlazador>Depurar>Generar información de depuración está establecida en Generar información de depuración optimizada para compartir y publicar (/DEBUG:FULL).
Si los archivos .pdb y .dll o .exe están en distintos lugares, copie el archivo .pdb en el mismo directorio. También es posible configurar el motor de cobertura de código para buscar archivos .pdb en otra ubicación. Para obtener más información, vea Personalizar el análisis de cobertura de código.
Se usa un binario instrumentado o optimizado
Análisis
Determine si el binario se ha sometido a cualquier forma de optimización avanzada, como la optimización guiada por perfiles, o se ha instrumentado mediante una herramienta de generación de perfiles como vsinstr.exe o vsperfmon.exe.
Explicación
Si otra herramienta de generación de perfiles ya ha instrumentado u optimizado un ensamblado, este se omitirá del análisis de cobertura de código. El análisis de cobertura de código no se puede realizar en dichos ensamblados.
Resolución
Desactive la optimización y use una nueva compilación.
El código no se administra (.NET) ni el código nativo (C++)
Análisis
Determine si está ejecutando algunas pruebas en código administrado o de C++.
Explicación
El análisis de cobertura de código de Visual Studio solo está disponible en código administrado y nativo (C++). Si trabaja con herramientas de terceros, puede que parte del código, o todo, se ejecute en una plataforma diferente.
Resolución
Ninguno disponible.
El nombre del proyecto incluye "DataCollector"
Los proyectos que usan DataCollector en el nombre del proyecto no se identificarán mediante la cobertura de código.
NGen ha instalado el ensamblado
Análisis
Determine si el ensamblado se carga desde la caché de imágenes nativas.
Explicación
Por motivos de rendimiento, los ensamblados de imágenes nativas no se analizan. Para obtener más información, vea el artículo sobre Ngen.exe (generador de imágenes nativas).
Resolución
Use una versión MSIL del ensamblado. No lo procese con NGen.
El archivo .runsettings personalizado tiene problemas de sintaxis
Análisis
Si usa un archivo .runsettings personalizado, podría contener un error de sintaxis. La cobertura de código no se ejecuta y la ventana de cobertura de código no se abre al final de la ejecución de pruebas o muestra los resultados antiguos.
Explicación
Puede ejecutar las pruebas unitarias con un archivo .runsettings personalizado para configurar las opciones de cobertura de código. Las opciones permiten incluir o excluir archivos. Para obtener más información, vea Personalizar el análisis de cobertura de código.
Resolución
Hay dos posibles tipos de errores:
Error de XML
Abra el archivo .runsettings en el editor XML de Visual Studio. Busque las indicaciones del error.
Error de expresión regular
Cada cadena del archivo es una expresión regular. Revise cada una de ellas en busca de errores y, en particular, busque:
- Paréntesis no coincidentes (...) o paréntesis sin escape \(...\). Si desea asociar un paréntesis en la cadena de búsqueda, debe indicar su secuencia de escape. Por ejemplo, para hacer coincidir una función, use:
.*MyFunction\(double\)
- Asterisco o signo más al principio de una expresión. Para asociar cualquier cadena de caracteres, use un punto seguido de un asterisco:
.*
- Paréntesis no coincidentes (...) o paréntesis sin escape \(...\). Si desea asociar un paréntesis en la cadena de búsqueda, debe indicar su secuencia de escape. Por ejemplo, para hacer coincidir una función, use:
Archivo .runsettings personalizado con exclusiones incorrectas
Análisis
Si usa un archivo .runsettings personalizado, asegúrese de que incluye el ensamblado.
Explicación
Puede ejecutar las pruebas unitarias con un archivo .runsettings personalizado para configurar las opciones de cobertura de código. Las opciones permiten incluir o excluir archivos. Para obtener más información, vea Personalizar el análisis de cobertura de código.
Resolución
Quite todos los Include
nodos del archivo .runsettings y, a continuación, quite todos los Exclude
nodos. Si eso corrige el problema, vuelva a colocarlos en fases.
Asegúrese de que el nodo DataCollectors especifica la cobertura de código. Compárelo con el ejemplo de Personalizar el análisis de cobertura de código.
Siempre se muestra algún código como no cubierto
El código de inicialización de archivos DLL nativos se ejecuta antes de la instrumentación
Análisis
En el código nativo vinculado estáticamente, parte de la función de inicialización DllMain y el código al que llama se muestran a veces como no cubiertos, aunque se haya ejecutado el código.
Explicación
La herramienta de cobertura de código funciona insertando la instrumentación en un ensamblado justo antes de que la aplicación comience a ejecutarse. En cualquier ensamblado cargado con antelación, el código de inicialización de DllMain se ejecuta tan pronto como se carga el ensamblado y antes de que se ejecute la aplicación. Ese código aparece como no cubierto, que normalmente se aplica a los ensamblados cargados estáticamente.
Resolución
Ninguno.