Pregunta

Quiero tratar PartCover para la cobertura de código. Estoy corriendo Visual Studio 2008 Professional con MSTest. La Professional Edition no incluye el Equipo de herramientas de prueba, como cobertura de código.

Por lo tanto, estoy tratando PartCover, pero no puedo conseguir que funcione. En el PartCover.Browser He seleccionado el ejecutable MSTest, he señalado los argumentos de trabajo a mi tests.dll, y he tratado de señalar mi directorio de trabajo en la carpeta Resultado de la pruebas, pero me da un error:

"Informe está vacía. Compruebe la configuración y ejecución de nuevo destino."

No sé qué probar siguiente.

Editar

Resulta que tenía dos problemas. En primer lugar, yo no estaba poniendo mis reglas derecha. En segundo lugar, tenía espacios en mis argumentos de trabajo. Los espacios estaban dando un error, pero que no aparecen en cualquier lugar.

¿Fue útil?

Solución

Sí, tuve este problema también. Echa un vistazo al formato para el campo de Reglas.

En el navegador añadir algo como:

+[MyNamespace.MyAssemblyName]*

Cuando el nombre de ensamblado que se especifica es el nombre del conjunto que contiene los tipos que quiera cobertura para. Comience con:

+[*]*

y partcover estará feliz de darle la métrica de cobertura para el proyecto de prueba de unidad, ninguna biblioteca de referencia y que una y otra vez.

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

También puede excluir espacios de nombres o tipos de contenidos o restringir los tipos de dentro del espacio de nombres se obtiene de los 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 asterisco como comodín y caracteres que componen los nombres de montaje y de clase, así que es bastante limitado, pero suficiente para obtener los datos que desea). Echa un vistazo a la sección de reglas en el manual. Si usted no tiene el manual, descargar desde SourceForge .

Otros consejos

he tenido que pasar por una serie de pasos para obtener finalmente PartCover de trabajo cuando se llama desde un script de NAnt. Recogí todo lo que tenía que hacer aquí, para comodidad de los demás; cuenta que algunos de esto ya fue respondida por otros pero pasé un montón de tiempo en poner todo junto.

En primer lugar, como se contesta en otro lugar aquí, si su sistema operativo es de 64 bits, que necesita para funcionar [más reciente SDK de Windows] \ bin \ CorFlags.exe [PartCover directorio de instalación] \ PartCover.exe / 32BIT + / Fuerza

Este es un paso de una sola vez, después de instalar PartCover. Se va a cambiar el ejecutable, y advertirle de que tendrá que ser vuelto a firmar la asamblea, pero no lo hizo y (finalmente) funcionó bien. Tenga en cuenta que a pesar de que parece que CorFlags no hice lo que me pidió y se le advierte acerca de la firma, se cambió el .exe, simplemente no tiene que apuntar explícitamente.

A continuación, una vez más si su sistema operativo es de 64 bits y utiliza NUnit (u otra prueba exe) sin PartCover, que se necesitan para invocar una versión compilada de forma explícita para x86. En el caso de NUnit, eso sería nunit-consola-x86.exe. Llamando nunit-console.exe sería simplemente pasar indefinidamente para mí después de hacer el trabajo, y no volver a un símbolo.

A continuación, como también es contestada en otro lugar aquí, PartCover 2.3, una versión dev, estaba fallando en silencio incluso después de ejecutar CorFlags en él. Sin embargo, trabajaron 2.2.

A continuación, cuando se invoca PartCover.exe, la sintaxis de los argumentos es - arg-nombre ... y NO - = arg-nombre (es decir, el tablero de instrumentos nombre del espacio de arg, no es igual a raya raya arg nombre); los documentos PartCover parecen ir en ambos sentidos, pero de signo igual no funcionó para mí.

Después de lo anterior, PartCover fue finalmente trabajando desde la línea de comandos. He utilizado un archivo de configuración (se puede utilizar la aplicación de navegador PartCover interfaz de usuario para guardar un archivo de configuración, que luego se puede utilizar desde la línea de comandos), por lo que los únicos argumentos que especificados son el archivo de configuración de ruta completa y el archivo de informe de salida nombre de ruta completo.

Esto todavía no estaba funcionando cuando se invoca desde un script de NAnt, por lo que finalmente se dio cuenta de que los valores arg tuvieron que ser citado ... y utilizar los tokens HTML codificado para las cotizaciones. Por lo tanto ...

de NAnt extracto:

<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 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! Esperamos que esto salvar a otra persona los dolores de cabeza que tenía.

Yo tenía el mismo problema con los informes de la PartCover. Así que he estado tratando de hacer que funcione bien y acabo de descubrir que el problema era de los dos archivos XSLT que vienen con la distribución PartCover.

Me fijo estos archivos y ahora todo está funcionando bien para mí:

por el conjunto

<?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>

    

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 encuentre útil. Además, cualquier comentario acerca de estos archivos es bienvenida, por lo que puede proporcionar la commutiy con los archivos correctos. Ver esta pregunta relacionada

@pelazm -. Gracias por una excelente orientación

Dos cosas menores para añadir a su solución:

(a) Si no se desea un PartCover.settings.xml externa

<!-- 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) informe HTML Gaspar Nagy es bastante bueno - http://gasparnagy.blogspot.com/2010/09/detailed-report-for-partcover-in.html

he tenido problemas similares con mi código no aparece en el informe cuando se utiliza PartCover versión 2.3.0.18745. Al usar la versión 2.2.0.34631 resuelto el problema.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top