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!