Pergunta

Eu quero tentar PartCover para cobertura de código. Estou executando o Visual Studio 2008 Professional com MSTest. faz o Professional Edition não inclui as ferramentas equipe de testes, como cobertura de código.

Então, eu estou tentando PartCover, mas não posso fazê-lo funcionar. No PartCover.Browser eu selecionei o MSTest executável, eu já apontou os argumentos de trabalho para o meu tests.dll, e eu tentei apontando meu diretório de trabalho para a pasta TestResults, mas eu recebo um erro:

"Relatório está vazio. Verifique as configurações e alvo corrida novamente."

Eu não sei que a próxima tentativa.

Editar

Acontece que eu tinha dois problemas. Primeiro, eu não estava colocando minhas regras direita. Em segundo lugar, eu tinha espaços em meus argumentos de trabalho. Os espaços foram dando um erro, mas não aparecendo em qualquer lugar.

Foi útil?

Solução

Sim, eu tive esse problema também. Confira o formato para o campo Regras.

No navegador adicionar algo como:

+[MyNamespace.MyAssemblyName]*

Quando o assembly nome especificado é o nome do assembly que contém os tipos que você quer cobertura para. Comece com:

+[*]*

e partcover terá todo o prazer dar-lhe métricas de cobertura para o projeto de teste de unidade, quaisquer bibliotecas que fazem referência e assim por diante.

A partir da linha de comando que você especificar o mesmo padrão no argumento --include: --include=[MyNamespace.MyAssembly]*

Você pode também excluem contido namespaces ou tipos ou restringir quais tipos de dentro do namespace você recebe dados de cobertura no relatório. O formato para as regras é um subconjunto da sintaxe de expressão regular de acordo com o manual (consistindo de asterix como um curinga e caracteres que compõem a montagem e nomes de classe, de modo bastante limitada, mas suficiente para obter os dados que você quer). Confira a seção sobre regras no manual. Se você não tiver o manual, baixá-lo a partir do SourceForge .

Outras dicas

Eu tive que passar por uma série de etapas para finalmente chegar PartCover trabalhar quando chamá-lo de um script NAnt. Eu colecionava tudo o que eu tinha que fazer aqui para a conveniência dos outros; nota que alguns dos isso já foi respondido por outros, mas eu passei toneladas de tempo de colocá-lo todos juntos.

Em primeiro lugar, como é respondida em outro lugar aqui, se seu sistema operacional é 64 bits, você precisa executar [mais recente do Windows SDK] \ [instalar PartCover dir] bin \ CorFlags.exe \ PartCover.exe / 32BIT + / Force

Este é um passo de uma só vez, após a instalação PartCover. Ela vai mudar o executável, e avisá-lo de que o conjunto terá de ser assinado-re, mas eu não fiz isso e (eventualmente) funcionou bem. Note-se que mesmo que ele se parece com CorFlags não fez o que você pediu e avisei sobre assinatura, que alterou o .exe, ele simplesmente não apontar isso explicitamente.

Em seguida, novamente se seu sistema operacional é 64 bits, e você usar NUnit (ou outro exe test) com PartCover, você vai precisar para invocar uma versão explicitamente compilado para x86. No caso do NUnit, que seria nunit-console de-x86.exe. Chamando nunit-console.exe seria apenas pendurar indefinidamente para mim depois de fazer o trabalho, e não retornar ao prompt.

A seguir, como também é respondida em outro lugar aqui, PartCover 2.3, uma compilação dev, estava falhando silenciosamente, mesmo após a execução CorFlags nele. No entanto, 2,2 funcionou.

Em seguida, quando PartCover.exe é invocado, a sintaxe para argumentos é - arg-nome ... e não - = arg-nome (ou seja, traço traço nome do espaço de arg, não traço traço é igual nome arg); os docs PartCover parecem ir para os dois lados, mas igual sinal simplesmente não funciona para mim.

Depois do acima, PartCover foi finalmente a trabalhar a partir da linha de comando. Eu usei um arquivo de configurações (você pode usar o aplicativo PartCover UI navegador para salvar um arquivo de configurações, que você pode usar na linha de comando), de modo a que os únicos argumentos I especificados foram as configurações de arquivo caminho completo e o arquivo de relatório de saída nome completo do caminho.

Isto ainda não estava funcionando quando chamado a partir de um script NAnt, então eu finalmente percebi que os valores arg tiveram de ser citado ... e usar os tokens HTML codificado para citações. Assim ...

NAnt trecho:

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

e arquivar o PartCover configurações:

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

Ufa! Esperemos que isto irá salvar outra pessoa as dores de cabeça que eu tinha.

Eu tive o mesmo problema com os relatórios PartCover. Então, eu tenho tentado fazer o trabalho certo e eu só descobri que o problema era os dois arquivos XSLT que vêm com a distribuição PartCover.

I fixa esses arquivos e agora tudo está funcionando bem para mim:

relatório da montagem

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

relatório da classe

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

Eu espero que você encontrar este útil. Além disso, qualquer feedback sobre este arquivos é bem-vinda, para que possamos oferecer o commutiy com arquivos corretos. Veja esta questão relacionado

@pelazm -. Obrigado por alguns excelente orientação

Duas pequenas coisas para adicionar à sua solução:

(a) Se você não quer um 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) relatório HTML de Gaspar Nagy é muito bom - http://gasparnagy.blogspot.com/2010/09/detailed-report-for-partcover-in.html

Eu tive problemas semelhantes com o meu código não aparecendo no relatório ao usar PartCover versão 2.3.0.18745. Usando a versão 2.2.0.34631 resolveu o problema.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top