Domanda

Voglio provare PartCover per la copertura del codice.Sto lavorando con Visual Studio 2008 Professional con MSTest.La Professional Edition non include il Team di strumenti di Test, come la Copertura del Codice.

Così, sto cercando PartCover, ma non riesco a farlo funzionare.Nel PartCover.Browser ho selezionato la MSTest eseguibile, ho puntato il lavoro argomenti per la mia tests.dll ho provato a indirizzare il mio Lavoro la Directory contenente i risultati del test cartella, ma mi da un errore:

"Report è vuoto.Controllare le impostazioni ed eseguire target di nuovo."

Non so cosa provare.

Modifica

Si scopre che ho avuto due problemi.Primo, io non stavo mettendo la mia Norme di diritto.Secondo, ho avuto spazi nel mio lavoro di argomenti.Gli spazi sono stati dando un errore, ma non appare ovunque.

È stato utile?

Soluzione

Sì, ho avuto anche questo problema. Controlla il formato per il campo Regole.

Nel browser di aggiungere qualcosa come:

+[MyNamespace.MyAssemblyName]*

Se il nome di assembly specificato è il nome del gruppo che contiene i tipi che si desidera la copertura per. Inizia con:

+[*]*

e partcover sarà lieto di fornirvi le metriche di copertura per il progetto di test di unità, le librerie si fa riferimento e così via.

Dalla riga di comando si specifica lo stesso modello nell'argomento --include:    --include=[MyNamespace.MyAssembly]*

È inoltre possibile escludere spazi dei nomi o tipi di contenuti o limitare i tipi all'interno del namespace che si ottiene i dati di copertura nella relazione. Il formato per le regole è un sottoinsieme della sintassi delle espressioni regolari secondo il manuale (che consiste di Asterix come un jolly e caratteri che compongono i nomi di assemblaggio e di classe, in modo piuttosto limitata, ma sufficiente per ottenere i dati desiderati). Controlla la sezione sulle regole del manuale. Se non avete il manuale, scaricarlo da sourceforge .

Altri suggerimenti

Ho dovuto passare attraverso una serie di passaggi per arrivare, infine, PartCover di lavoro quando si chiama da un NAnt script.Ho raccolto tutto quello che dovevo fare qui anche per gli altri' convenienza;si noti che alcuni di questo è stato già risposto da altri, ma ho passato un sacco di tempo di mettere tutto insieme.

In primo luogo, come ha risposto altrove qui, se il vostro sistema operativo è a 64 bit, è necessario eseguire [più recente di Windows SDK]\bin\CorFlags.exe [PartCover installare dir]\PartCover.exe /32BIT+ /Forza

Questo è un tempo di passaggio, dopo PartCover installare.Sarà modificare il file eseguibile, e avverto che l'assemblea dovrà essere ri-firmato, ma non l'ho fatto e (eventualmente) funzionato bene.Nota che anche se sembra CorFlags non fare quello che hai chiesto e messo in guardia la firma, ha fatto cambiare il .exe semplicemente non sottolineare che in modo esplicito.

A quel punto, di nuovo, se il vostro sistema operativo è a 64 bit, e si utilizza NUnit (o un altro test exe) con PartCover, è necessario richiamare una versione espressamente compilato per x86.In NUnit caso, che sarebbe nunit-console-x86.exe.Chiamata nunit-console.exe sarebbe semplicemente appendere a tempo indeterminato per me dopo aver fatto il lavoro, e non per tornare al prompt.

A quel punto, come è anche risposto altrove qui, PartCover 2.3, un dev build, non è riuscito in silenzio anche dopo l'esecuzione CorFlags su di esso.Tuttavia, 2.2 lavorato.

A quel punto, quando PartCover.exe viene richiamato, la sintassi per argomenti -- arg-nome ...e NON --=arg-nome (es.trattino trattino spazio arg nome, non dash dash è uguale a nome arg);il PartCover documenti sembrano andare in entrambi i modi, ma il segno di uguale non ha funzionato per me.

Dopo quanto sopra, PartCover era finalmente a lavorare da riga di comando.Ho usato un file di impostazioni (è possibile utilizzare il PartCover browser UI app per salvare un file di impostazioni, che è quindi possibile utilizzare la riga di comando), in modo che gli unici argomenti che ho indicato erano le impostazioni del file completo di percorso, e il report di output il nome del file completo di percorso.

Questo ancora non funziona quando viene richiamato da un NAnt script, così ho finalmente capito che l'arg valori dovevano essere citato...e di utilizzare il codice HTML codificati i gettoni di presenza per i preventivi.Quindi...

NAnt estratto:

<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 il PartCover file di impostazioni:

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

Uff!Speriamo che questo sarà salvare qualcun altro, il mal di testa che ho avuto.

Ho avuto lo stesso problema con riporta il PartCover. Così ho cercato di farlo funzionare a destra e ho appena scoperto che il problema era i due file XSLT che vengono con la distribuzione PartCover.

Ho sistemato questi file e ora tutto sta funzionando benissimo per me:

rapporto di assemblaggio

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

    

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

Spero che hai trovato utile. Inoltre, tutte le risposte su questo file è accolto favorevolmente, in modo da poter fornire la commutiy con i file corretti. Vedere questa domanda relativa

@pelazm -. Grazie per un po 'una guida eccellente

Due cose minori per aggiungere alla vostra soluzione:

(a) Se non si desidera un PartCover.settings.xml esterna

<!-- 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) rapporto HTML di Gáspár Nagy è piuttosto buona - http://gasparnagy.blogspot.com/2010/09/detailed-report-for-partcover-in.html

ho avuto problemi simili con il mio codice non presentandosi nella relazione quando si utilizza PartCover versione 2.3.0.18745. Usando la versione 2.2.0.34631 risolto il problema.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top