MICROSOFT VISUAL STUDIO: UnitTest and TRX files
MICROSOFT VISUAL STUDIO: UnitTest and TRX files

MICROSOFT VISUAL STUDIO: UnitTest, CodeCoverage and TRX files

Avete a che fare con UnitTest in ambiente Visual Studio? Volete esportare i vostri test?

Dovete testare un web service? Avete a che fare con problemi di Code Coverage? Volete eliminare dalla Code Coverage le classi di test? Volete eliminare dalla Code Coverage le classi generate da Entity Framework?

Siete nel posto giusto.

 

 

ESPORTARE GLI UNIT-TEST

Supponiamo di avere una solution Visual Studio, supponiamo di avere una batteria di test unitari e di voler esportare il risultato.

Come si fa? Da Visual Studio 2013 questa semplicissima opprtunità pare non ci sia.

Cosa alquanto strana!!!

A mio giudizio è una funzionalità assolutamente indispensabile, Mi sembra ovvio che se faccio dei test unitari prima o poi avrò la necessità di salvare il loro risultato.

Allora come fare? Per fortuna, Visula Studio mette a disposizione una comando da usare via Console.

Il comando da usare è il seguente:

 

mstest /testcontainer:<path to DLL>\myUnitTestSolution.dll /resultsfile:<path to save results>\mytest.trx

 

Così facendo si ottiene il file TRX dei nostri test.

Dove si trova questa console? Di solito si trova nella stessa cartella dell'eseguibile di Visual Studio, ad es. D:\Programmi (x86)\Microsoft Visual Studio 12.0\Common7\IDE.

Un altro comando, che non ho provato ma che dovrebbe fare la stessa cosa, è il seguente:

 

vstest.console.exe <path to DLL>\myUnitTestSolution.dll /Settings:<path to my test config>\test.runsettings" /logger:trx

 

COSA è UN FILE TRX?

Cos'è un file TRX? E' un file XML che descrive il risultato della nostra batteria di test.

 

TRASFORMARE I FILE TRX IN HTML

Questo file può anche essere trasformato in HTML mediante l'uso di un altro programma.

Cosa che tra l'altro consiglio perché il formato TRX altrimenti è poco utilizzabile.

Il programma da usare è Trx2HTML.

Questo programma è semplicissimo da usare. Basta unzipparlo e mettere il file TRX nella stessa cartella.

Poi da prompt DOS si digita:

 

trx2html.exe mytest.trx

 

Ed il gioco è fatto!

 

TESTARE UN WEB SERVICE

E' possibile testare un web service?

Certo che sì, e lo si può fare usando i Web Performance Test.

La migliore guida è proprio quella della Microsoft 

How to: Create a Web Service Test

 

CODE COVERAGE: ESCLUDERE LE CLASSI DI TEST

E' normale che dalla analisi del Code Coverage si vogliano escludere le classi di test.

Per fare questo è sufficiente mettere il seguente attributo alla classe:

 

using System.Diagnostics.CodeAnalysis;
[ExcludeFromCodeCoverage]
public class MiaClasseDaEscludere

{

...

}

 

Un'altra utile guida è la seguente https://msdn.microsoft.com/it-it/library/jj159530(v=vs.120).aspx

In questa guida spiega come usare il file CodeCoverage.runsettings.

Questo file permette di configurare al meglio l'analisi della copertura del codice. Ad esempio permette di togliere progetti importati nella solution che quindi non devono rientrare nella copertura.

Per fare questo occorre avere una struttura simile alla seguente:

 

<RunSettings>
  <DataCollectionRunSettings>
    <DataCollectors>
      <DataCollector friendlyName="Code Coverage" uri="datacollector://Microsoft/CodeCoverage/2.0" assemblyQualifiedName="Microsoft.VisualStudio.Coverage.DynamicCoverageDataCollector, Microsoft.VisualStudio.TraceCollector, Version=11.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
        <Configuration>
          <CodeCoverage>
            <ModulePaths>
              <Include>
                <ModulePath>.*\.dll$</ModulePath>
                <ModulePath>.*\.exe$</ModulePath>
              </Include>
              <Exclude>
                <ModulePath>.*CPPUnitTestFramework.*</ModulePath>
                <ModulePath>.*my dll path to exclude.*</ModulePath>
              </Exclude>
            </ModulePaths>

 

Un'altra personalizzazione che vale la pena discutere è la seguente: eliminare dalla Code Coverage le classi generate da Entity Framework.

Vediamo come fare:

 

<Functions>
              <Exclude>
                <Function>^Fabrikam\.UnitTest\..*</Function>
                <Function>^std::.*</Function>
                <Function>^ATL::.*</Function>
                <Function>.*::__GetTestMethodInfo.*</Function>
                <Function>^Microsoft::VisualStudio::CppCodeCoverageFramework::.*</Function>
                <Function>^Microsoft::VisualStudio::CppUnitTestFramework::.*</Function>
                <Function>^nameSpaceEntityFramework\..*</Function>
              </Exclude>
            </Functions>

 

Al posto di "nameSpaceEntityFramework" bisogna mettere il vostro namespace, ovvero il namespace associato agli oggetti che Entity Framework ha creato per voi. Eliminare queste classi mediante namespace è la via sicuramente più semplice. Occhio però a non utilizzare lo stesso namespace con classi non generate da Entity Framework. Per evitare questo io, di solito, metto queste classi in una cartella chiamata DataAccessor.

Buon lavoro!