open net coverage code unit-testing mstest code-coverage partcover

unit-testing - open - .net code coverage



Hacer que PartCover funcione (5)

Sí, yo también tuve este problema. Consulte el formato para el campo Reglas.

En el navegador, agregue algo como:

+[MyNamespace.MyAssemblyName]*

Donde el nombre del ensamblado que especifique es el nombre del ensamblaje que contiene los tipos para los que desea cobertura. Inicia con:

+[*]*

y Partcover estará encantado de darle métricas de cobertura para el proyecto de prueba de la unidad, las bibliotecas a las que hace referencia, y así sucesivamente.

Desde la línea de comando, especifique el mismo patrón en el argumento --include=[MyNamespace.MyAssembly]* : --include=[MyNamespace.MyAssembly]*

También puede excluir espacios de nombres o tipos contenidos o restringir los tipos dentro del espacio de nombres para los que se obtienen datos de cobertura en el informe. El formato de las reglas es un subconjunto de la sintaxis de expresiones regulares de acuerdo con el manual (que consiste en asterix como un comodín y caracteres que componen los nombres de ensamblado y clase, por lo que son bastante limitados pero suficientes para obtener los datos que desea). Consulte la sección de reglas en el manual. Si no tiene el manual, descárguelo de sourceforge .

Quiero probar PartCover para la cobertura de código. Estoy ejecutando Visual Studio 2008 Professional con MSTest. Professional Edition no incluye las herramientas de Team Testing, como Code Coverage.

Entonces, estoy intentando PartCover, pero no puedo hacer que funcione. En el navegador PartCover.Browser he seleccionado el ejecutable MSTest, he apuntado los argumentos de trabajo a mi test.dll, y he intentado señalar mi directorio de trabajo a la carpeta TestResults, pero aparece un error:

"El informe está vacío. Compruebe la configuración y ejecute el objetivo nuevamente".

No sé qué probar después.

Editar

Resulta que tuve dos problemas. Primero, no estaba poniendo mis Reglas correctas. En segundo lugar, tenía espacios en mis argumentos de trabajo. Los espacios daban un error, pero no aparecían en ningún lado.


Tuve problemas similares con mi código que no aparece en el informe cuando uso PartCover versión 2.3.0.18745. Usar la versión 2.2.0.34631 resolvió el problema.


Tuve que pasar por una serie de pasos para finalmente obtener el funcionamiento de PartCover cuando lo llamé desde un script NAnt. Recogí todo lo que tenía que hacer aquí para la conveniencia de los demás; tenga en cuenta que algo de esto ya fue respondido por otros, pero pasé mucho tiempo juntando todo.

En primer lugar, como se responde en otro lugar aquí, si su sistema operativo es de 64 bits, deberá ejecutar [SDK de Windows más reciente] / bin / CorFlags.exe [directorio de instalación de PartCover] / PartCover.exe / 32BIT + / Force

Este es un paso de una sola vez, después de la instalación de PartCover. Cambiará el ejecutable y le advertirá que será necesario volver a firmar el ensamblado, pero no lo hice y finalmente funcionó bien. Tenga en cuenta que aunque parece que CorFlags no hizo lo que pidió y le advirtió sobre la firma, cambió el .exe, simplemente no lo señala explícitamente.

A continuación, nuevamente, si su sistema operativo es de 64 bits y usa NUnit (u otro exe de prueba) con PartCover, necesitará invocar una versión compilada explícitamente para x86. En el caso de NUnit, eso sería nunit-console-x86.exe. Llamar a nunit-console.exe me colgaría indefinidamente después de hacer el trabajo, y no regresaría a un aviso.

Luego, como también se responde en otro lugar aquí, PartCover 2.3, una compilación de desarrollo, estaba fallando silenciosamente incluso después de ejecutar CorFlags en él. Sin embargo, 2.2 funcionó.

Luego, cuando se invoca PartCover.exe, la sintaxis de los argumentos es - arg-name ... y NOT - = arg-name (es decir, dash dash space arg name, no dash dash es igual a arg name); los documentos de PartCover parecen funcionar en ambos sentidos, pero el signo de igual no me funcionó.

Después de lo anterior, PartCover finalmente estaba trabajando desde la línea de comando. Utilicé un archivo de configuración (puede usar la aplicación de interfaz de usuario del navegador PartCover para guardar un archivo de configuración, que luego puede usar desde la línea de comandos), de modo que los únicos argumentos que especifiqué fueron la ruta completa del archivo de configuración y el archivo de informe de salida nombre completo camino.

Esto todavía no funcionaba cuando se invocaba desde un script NAnt, así que finalmente me di cuenta de que los valores de arg tenían que ser citados ... y de usar los tokens codificados en HTML para las comillas. Así...

Extracto de NAnt:

<property name="PartCoverExePath" value="c:/Program Files (x86)/PartCover .NET 2/PartCover.exe" /> <property name="PartCoverWorkPath" value="c:/Projects/MyProject/trunk/CI/" /> <property name="PartCoverSettingsFileName" value="PartCover.Settings.xml" /> <property name="PartCoverReportFileName" value="PartCover.Report.xml" /> <target name="MyTarget"> <exec program="${PartCoverExePath}"> <arg value="--settings &quot;${PartCoverWorkPath}${PartCoverSettingsFileName}&quot;" /> <arg value="--output &quot;${PartCoverWorkPath}${PartCoverReportFileName}&quot;" /> </exec> </target>

Y el archivo de configuración de PartCover:

<PartCoverSettings> <Target>C:/CI/Binaries/NUnit2.5.2/bin/net-2.0/nunit-console-x86.exe</Target> <TargetWorkDir>c:/Projects/MyProject/trunk/MyProject.Test/bin/Debug</TargetWorkDir> <TargetArgs>MyProject.Test.dll</TargetArgs> <Rule>+[*]*</Rule> <Rule>-[log4net*]*</Rule> <Rule>-[nunit*]*</Rule> <Rule>-[MyProject.Test*]*</Rule> </PartCoverSettings>

¡Uf! Espero que esto le ahorre a alguien más los dolores de cabeza que tuve.


@pelazm - Gracias por una excelente orientación.

Dos cosas menores para agregar a su solución:

(a) Si no desea un PartCover.settings.xml externo

<!-- Runs unit tests through PartCover to calculate unit test covereage--> <!-- Use %2a instead of * and %3f instead of ? to prevent expansion --> <!-- %40 = @ %25 = % %24 = $ --> <Target Name="RunTests"> <ItemGroup> <pc4_settings Include="--target &quot;$(NUnitEXE)&quot;"/> <pc4_settings Include="--target-work-dir &quot;$(RootDirectory)/src&quot;"/> <pc4_settings Include="--include [%2a]%2a"/> <pc4_settings Include="--exclude [nunit%2a]%2a"/> <pc4_settings Include="--exclude [log4net%2a]%2a"/> <pc4_settings Include="--exclude [MetadataProcessor.Tests%2a]%2a"/> </ItemGroup> <CreateItem Include="$(RootDirectory)/src/**/bin/$(Configuration)/*.Tests.dll"> <Output TaskParameter="Include" ItemName="TestAssemblies" /> </CreateItem> <Exec Command="&quot;$(PartCover4Directory)/PartCover.exe&quot; --register @(pc4_settings,'' '') --target-args &quot;%(TestAssemblies.Identity) $(NUnitArgs) /xml:%(TestAssemblies.Identity).NUnitResults.xml&quot; --output $(BuildDirectory)/PartCover-results.xml" ContinueOnError="true" WorkingDirectory="$(BuildDirectory)"> <Output TaskParameter="ExitCode" ItemName="ExitCodes"/> </Exec> <XslTransformation XslInputPath="$(RootDirectory)/tools/partcover4/xslt/PartCoverFullReport.xslt" XmlInputPaths="$(BuildDirectory)/PartCover-results.xml" OutputPaths="$(BuildDirectory)/PartCover-results-PartCoverFullReport.html" /> <Error Text="Test error occurred" Condition="''%(ExitCodes.Identity)''>0"/> </Target>

(b) El informe HTML de Gáspár Nagy es bastante bueno - http://gasparnagy.blogspot.com/2010/09/detailed-report-for-partcover-in.html


Tuve el mismo problema con los informes de PartCover. Así que he estado tratando de hacerlo funcionar bien y descubrí que el problema eran los dos archivos XSLT que vienen con la distribución de PartCover.

Solucioné estos archivos y ahora todo está funcionando bien para mí:

informe por asamblea

<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxml="urn:schemas-microsoft-com:xslt"> <xsl:output method="html" indent="yes"/> <xsl:template match="/"> <xsl:variable name="cov0style" select="''background:#E79090;text-align:right;''"/> <xsl:variable name="cov20style" select="''background:#D79797;text-align:right;''"/> <xsl:variable name="cov40style" select="''background:#D7A0A0;text-align:right;''"/> <xsl:variable name="cov60style" select="''background:#C7A7A7;text-align:right;''"/> <xsl:variable name="cov80style" select="''background:#C0B0B0;text-align:right;''"/> <xsl:variable name="cov100style" select="''background:#D7D7D7;text-align:right;''"/> <table style="border-collapse: collapse;"> <tr style="font-weight:bold; background:whitesmoke;"> <td colspan="2">Coverage by assembly</td> </tr> <xsl:variable name="asms" select="/PartCoverReport/Assembly"/> <xsl:for-each select="$asms"> <xsl:variable name="current-asm-node" select="."/> <tr> <xsl:element name="td"> <xsl:attribute name="style">background:ghostwhite; padding: 5px 30px 5px 5px;</xsl:attribute> <xsl:value-of select="$current-asm-node/@name"/> </xsl:element> <xsl:variable name="codeSize" select="sum(/PartCoverReport/Type[@asmref=$current-asm-node/@id]/Method/pt/@len)+0"/> <xsl:variable name="coveredCodeSize" select="sum(/PartCoverReport/Type[@asmref=$current-asm-node/@id]/Method/pt[@visit>0]/@len)+0"/> <xsl:element name="td"> <xsl:if test="$codeSize=0"> <xsl:attribute name="style"> <xsl:value-of select="$cov0style"/> </xsl:attribute> 0% </xsl:if> <xsl:if test="$codeSize &gt; 0"> <xsl:variable name="coverage" select="ceiling(100 * $coveredCodeSize div $codeSize)"/> <xsl:if test="$coverage &gt;= 0 and $coverage &lt; 20"> <xsl:attribute name="style"> <xsl:value-of select="$cov20style"/> </xsl:attribute> </xsl:if> <xsl:if test="$coverage &gt;= 20 and $coverage &lt; 40"> <xsl:attribute name="style"> <xsl:value-of select="$cov40style"/> </xsl:attribute> </xsl:if> <xsl:if test="$coverage &gt;= 40 and $coverage &lt; 60"> <xsl:attribute name="style"> <xsl:value-of select="$cov60style"/> </xsl:attribute> </xsl:if> <xsl:if test="$coverage &gt;= 60 and $coverage &lt; 80"> <xsl:attribute name="style"> <xsl:value-of select="$cov80style"/> </xsl:attribute> </xsl:if> <xsl:if test="$coverage &gt;= 80"> <xsl:attribute name="style"> <xsl:value-of select="$cov100style"/> </xsl:attribute> </xsl:if> <xsl:value-of select="$coverage"/>% </xsl:if> </xsl:element> </tr> </xsl:for-each> </table>

informe por clase

<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxml="urn:schemas-microsoft-com:xslt"> <xsl:output method="html" indent="no"/> <xsl:template match="/"> <xsl:variable name="cov0style" select="''background:#FF4040;text-align:right;''"/> <xsl:variable name="cov20style" select="''background:#F06060;text-align:right;''"/> <xsl:variable name="cov40style" select="''background:#E78080;text-align:right;''"/> <xsl:variable name="cov60style" select="''background:#E0A0A0;text-align:right;''"/> <xsl:variable name="cov80style" select="''background:#D7B0B0;text-align:right;''"/> <xsl:variable name="cov100style" select="''background:#E0E0E0;text-align:right;''"/> <table style="border-collapse: collapse;"> <tr style="font-weight:bold; background:whitesmoke;"><td colspan="2">Coverage by class</td></tr> <xsl:for-each select="/PartCoverReport/Type"> <tr> <xsl:element name="td"> <xsl:attribute name="style">background:ghostwhite; padding: 5px 30px 5px 5px;</xsl:attribute> <xsl:value-of select="@name"/> </xsl:element> <xsl:variable name="codeSize" select="sum(./Method/pt/@len)+0"/> <xsl:variable name="coveredCodeSize" select="sum(./Method/pt[@visit>0]/@len)+0"/> <xsl:element name="td"> <xsl:if test="$codeSize=0"> <xsl:attribute name="style"><xsl:value-of select="$cov0style"/></xsl:attribute> 0% </xsl:if> <xsl:if test="$codeSize &gt; 0"> <xsl:variable name="coverage" select="ceiling(100 * $coveredCodeSize div $codeSize)"/> <xsl:if test="$coverage &gt;= 0 and $coverage &lt; 20"><xsl:attribute name="style"><xsl:value-of select="$cov20style"/></xsl:attribute></xsl:if> <xsl:if test="$coverage &gt;= 20 and $coverage &lt; 40"><xsl:attribute name="style"><xsl:value-of select="$cov40style"/></xsl:attribute></xsl:if> <xsl:if test="$coverage &gt;= 40 and $coverage &lt; 60"><xsl:attribute name="style"><xsl:value-of select="$cov60style"/></xsl:attribute></xsl:if> <xsl:if test="$coverage &gt;= 60 and $coverage &lt; 80"><xsl:attribute name="style"><xsl:value-of select="$cov80style"/></xsl:attribute></xsl:if> <xsl:if test="$coverage &gt;= 80"><xsl:attribute name="style"><xsl:value-of select="$cov100style"/></xsl:attribute></xsl:if> <xsl:value-of select="$coverage"/>% </xsl:if> </xsl:element> </tr> </xsl:for-each> </table> </xsl:template> </xsl:stylesheet>

Espero que encuentres esto útil. Además, se agradece cualquier comentario sobre estos archivos, por lo que podemos proporcionar a la comunidad los archivos correctos. Ver esta pregunta relacionada