CruiseControl.NET e Nunit

Ieri mi sono ritrovato a valutare CruiseControl.NET per usarlo nel processo di sviluppo di un medio/grosso progetto. Del tool se ne parla anche su alcuni blog amaricani e anche sui blog di UGI e a tal proposito rimando alla categoria di articoli "CruiseControl.NET e NAnt" di  FoxyBlog .

Il tool è davvero interessante ancora se in _beta_ (siamo ad oggi alla release 0.91, se non ricordo male). Esso si basa sul principio dell'"integrazione continua" . Periodicamente contriolla nel repository del codice, esempio CVS o VSS sono integrabili velocemennte,  se ci sono stati cambiamenti e quindi ricompila. Eventualmente lancia lo unit test, nunit, se vogliamo fa un giro di fxcop e magari a anche di ncover. Il risultato finale è quello di tenere dei report  -abbastanza esaustivi - delle varie compilazioni/build del progetto. Il tool è pluggabile per cui ognuno può abbellire la sua integarazione come meglio crede per pioi esserne informato in varie modalità, mail, web etc...

La cosa con cui mi sono scontrato ieri è stata l'integrazione con nunit. Tutto sembra predisposto per una buona integrazione con il tool ma poi nella documentaizone alla voce "CruiseControl.NET : NUnit Task" leggiamo "We recommend not using this task, and using your builder to run your tests if possible. This way if the tests fail and you don't know why, it is a lot easier to try and replicate the problem on another machine." Sempre nella documentaizone ufficiale vedo che si potrebbe usare nunit oltre che con il suo plugin ben integrato anche come processo esterno, "CruiseControl.NET : Using CruiseControl.NET with NUnit "... ci provo! Oltre tutto lanciare il nunit come processo mi permette 1) di controllare meglio il test potendo specificare un progetto (e non i singoli assemby esplicitamente) e 2) di avere maggiore controllo sulle eventuali configurazioni, di cui ho scritto in "NUnit e .config".  Il risultato è quello che volevo ma con un piccolo fastidio.

Se lo unit test va bene tutto ok, se lo unit test va male (alcuni test non vengono passati)... beh apriti cielo, il tool notifica che l'intergrazione è fallita e il report non riporta bene i risultati dello unit test. Dopo un po di prove sono arrivato alla conclusione che il problema è che se l'eseguibile/processo esterno torna un codice di errore diverso da "0" allora l'integrazione viene considerata fallita, e qusto non sarebbe male... ma nunit quando ci sono errori nei test torna un codice diverso da "0" che fa saltare il tutto :o

Quello che ho fatto è stato di incapsulare la chiamata a nunit in in bat e lanciare il bat invece dell'exe di nunit. Ecco di seguito la configurazione ccnet server e il bat.

[unitest.bat]

@SET NUNIT_XML=%cd%\%2
@del /F /Q "%NUNIT_XML%" @"C:\Program Files\NUnit 2.2\bin\nunit-console.exe" "%1" "/xml:%NUNIT_XML%" /nologo @if not errorlevel 0 do exit 0

[ccnet.config]

<cruisecontrol>
<project ... >
...
<tasks>
  <devenv>
      <solutionfile>NorthWindVBNET.sln</solutionfile>
      <configuration>Debug</configuration>
      <executable>C:\Program Files\Microsoft Visual Studio .NET 2003\Common7\IDE\devenv.com</executable>
  </devenv>
  <exec executable="unittest.bat">
   <baseDirectory>C:\Program Files\CruiseControl.NET\NorthWindVBNET</baseDirectory>
    <buildArgs>NorthWind.Test\NorthWind.Test.nunit NorthWind.Test-result.xml</buildArgs>
  </exec>

  <merge>
      <files>
          <file>*-result.xml</file>
      </files>
  </merge> </tasks> ...  </project>
</cruisecontrol>

Questa è la soluzione che ho trovato, e sarei curioso di avere le opinioni di altri che hanno avuto esigenza di integrare ccnet e nunit e si sono trovati a gestire lo stesso problema oppure hanno agito in maniera totalmente diversa. 

«giugno»
domlunmarmergiovensab
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789