Question

Je veux essayer PartCover pour la couverture de code. Je suis en cours d'exécution Visual Studio 2008 Professional avec MSTest. La Professional Edition ne comprend pas les outils Test d'équipe, comme la couverture du code.

Alors, je suis en train PartCover, mais je ne peux pas le faire fonctionner. Dans le PartCover.Browser j'ai choisi l'exécutable MSTest, je l'ai souligné les arguments de travail à mon tests.dll, et je l'ai essayé pointant vers mon répertoire de travail dans le dossier TestResults, mais je reçois une erreur:

« Rapport est vide. Vérifiez les paramètres et la cible de courir. »

Je ne sais pas quoi essayer suivant.

Modifier

Il se trouve que j'avais deux problèmes. Tout d'abord, je ne mets pas mes règles droit. Deuxièmement, j'avais des espaces dans mes arguments de travail. Les espaces donnaient une erreur, mais ne se présente pas partout.

Était-ce utile?

La solution

Oui, j'ai eu ce problème aussi. Vérifiez le format du champ Règles.

Dans le navigateur ajouter quelque chose comme:

+[MyNamespace.MyAssemblyName]*

Si le nom de l'assembly que vous spécifiez est le nom de l'assembly contenant les types que vous souhaitez une couverture pour. Commencez avec:

+[*]*

et partcover vous donnera heureusement des mesures de couverture pour le projet de test unitaire, toutes les bibliothèques que vous faites référence et ainsi de suite.

A partir de la ligne de commande que vous spécifiez le même schéma dans l'argument --include:    --include=[MyNamespace.MyAssembly]*

Vous pouvez également exclure ou contenus namespaces types ou restreindre les types à partir de l'espace de noms que vous obtenez les données de couverture dans le rapport. Le format des règles est un sous-ensemble de la syntaxe d'expression régulière selon le manuel (composé de asterix comme un joker et des caractères qui composent les noms d'assemblage et de classe, donc assez limité, mais assez pour obtenir les données que vous voulez). Consultez la section sur les règles du manuel. Si vous ne possédez pas le manuel, télécharger depuis sourceforge.

Autres conseils

Je devais passer par un certain nombre d'étapes pour obtenir enfin PartCover travailler lors de l'appel d'un script NAnt. Je collectionnais tout ce que je devais faire ici pour la commodité des autres; Notez que certains cela a été déjà répondu par d'autres, mais j'ai passé des tonnes de temps mettre tous ensemble.

D'abord, comme on répond ailleurs ici, si votre système d'exploitation 64 bits, vous devez exécuter [le plus récent SDK Windows] \ bin \ CorFlags.exe [PartCover install dir] \ PartCover.exe / 32BIT + / force

Ceci est une étape unique, après l'installation PartCover. Il va changer l'exécutable, et vous avertir que l'assemblée devra être re-signé, mais je ne le faisais pas et (éventuellement) a bien fonctionné. Notez que même si elle ressemble CorFlags ne faites pas ce que vous avez demandé et vous a appris au sujet de la signature, il n'a pas modifié le fichier .exe, il ne vient pas pointer explicitement.

Ensuite, à nouveau si votre système d'exploitation est de 64 bits, et que vous utilisez NUnit (ou un autre test exe) avec PartCover, vous aurez besoin d'invoquer une version explicitement compilé pour x86. Dans le cas de NUnit, ce serait nunit-console-x86.exe. Appel nunit-console.exe serait tout simplement bloquer indéfiniment pour moi après avoir fait le travail, et ne pas revenir à une invite.

Ensuite, comme cela est également une réponse ailleurs ici, PartCover 2.3, une version dev, échouait en silence, même après l'exécution de CorFlags dessus. Cependant, 2.2 travaillé.

Ensuite, lorsque PartCover.exe est invoqué, la syntaxe des arguments est - arg nom ... et NON - = arg nom (à savoir l'espace tableau de bord tableau de bord nom de arg, tableau de bord tableau de bord est égal à ne pas arg nom); les docs PartCover semblent aller dans les deux sens, mais signe égal juste ne fonctionne pas pour moi.

Après ce qui précède, PartCover travaillait enfin de la ligne de commande. J'ai utilisé un fichier de paramètres (vous pouvez utiliser l'application de l'interface utilisateur du navigateur PartCover pour enregistrer un fichier de paramètres, que vous pouvez ensuite utiliser à partir de la ligne de commande), de sorte que les seuls args j'ai spécifié étaient le fichier de paramètres chemin complet et le fichier de rapport de sortie nom de chemin complet.

encore ne fonctionnait pas lorsqu'il est appelé à partir d'un script NAnt, donc je me suis finalement rendu compte que les valeurs de arg devaient être cité ... et d'utiliser les jetons codés HTML pour les citations. Ainsi ...

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

Et le fichier de paramètres 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>

Ouf! Espérons que cela sauvera quelqu'un d'autre les maux de tête que j'avais.

J'ai eu le même problème avec les rapports PartCover. J'ai donc essayé de le faire fonctionner à droite et je viens de découvrir que le problème était les deux fichiers XSLT qui viennent avec la distribution de PartCover.

Je fixe ces fichiers et maintenant tout fonctionne bien pour moi:

par assemblage

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

    

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

J'espère que vous trouverez ce utile. En outre, tous les commentaires sur ce fichier est bien accueilli, afin que nous puissions fournir les commutiy avec les fichiers corrects. Voir cette question connexe

@pelazm -. Merci pour un excellent guidage

Deux petites choses à ajouter à votre solution:

(a) Si vous ne voulez pas un PartCover.settings.xml externe

<!-- 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) le rapport HTML de Gáspár Nagy est assez bon - http://gasparnagy.blogspot.com/2010/09/detailed-report-for-partcover-in.html

J'ai eu des problèmes similaires avec mon code ne se présente pas dans le rapport lors de l'utilisation de la version PartCover 2.3.0.18745. En utilisant la version 2.2.0.34631 a résolu le problème.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top