Domanda

Come vai di solito a circa separare il vostro codice e associati unit test?Conosco persone che creare un progetto separato per test di unità, che personalmente ho trovato confuso e difficile da mantenere.D'altra parte, se si mescolano codice e propri test in un unico progetto, si finisce con binari relative al tuo framework di unit test (sia NUnit, MbUnit o qualunque altra cosa) e proprio dei binari affiancati.

Questo va bene per il debug, ma una volta ho costruito una versione, Io davvero non voglio che il mio codice di riferimento il framework per lo unit testing più.

Una soluzione che ho trovato è quello di racchiudere tutte le vostre unità di test all'interno #if DEBUG -- #endif direttive:quando nessun codice fa riferimento a un'unità di prove di assemblaggio, il compilatore è abbastanza intelligente per omettere il riferimento al codice compilato.

Ci sono altri (forse più comodo) opzioni per raggiungere un simile obiettivo?

È stato utile?

Soluzione

Io sicuramente avvocato separare le prove per un progetto separato.E ' l'unico modo per andare, a mio parere.

Sì, come Gary dice, inoltre, impone di verificare il comportamento attraverso metodi pubblici piuttosto che giocare con le interiora delle classi

Altri suggerimenti

Come gli altri segnaliamo, separata progetto di test (per ogni progetto) è un buon modo per farlo.Io di solito specchio gli spazi dei nomi e creare una classe di test per ogni classe normale con 'test' aggiunto il nome.Questo è supportato direttamente nell'IDE se si dispone di Visual Studio Team System, che permette di generare automaticamente un test di classi e metodi in un altro progetto.

Una cosa da ricordare se si desidera testare le classi e i metodi con 'interna' della funzione di accesso è quello di aggiungere la seguente riga al AssemblyInfo.cs file per ogni progetto per essere testato:

[assembly: InternalsVisibleTo("UnitTestProjectName")]

L' .Net framework dopo il v2 ha una caratteristica utile in cui è possibile selezionare un'assemblea con il InternalsVisibleTo attributo che consente il montaggio di accedervi da un altro.
Una sorta di assemblea tunnelling funzione.

Ancora un'altra alternativa all'utilizzo di direttive per il compilatore all'interno di un file o la creazione di un progetto separato è solo a creare ulteriori .cs i file nel progetto.

Con un po ' di magia nel file di progetto, è possibile richiedere che:

  1. nunit.quadro Dll sono solo di riferimento in una build di debug, e
  2. il file di prova sono inclusi solo nelle build di debug

Esempio .csproj estratto:

<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">

   ...

   <Reference Include="nunit.framework" Condition=" '$(Configuration)'=='Debug' ">
      <SpecificVersion>False</SpecificVersion>
      <HintPath>..\..\debug\nunit.framework.dll</HintPath>
   </Reference>

   ...

   <Compile Include="Test\ClassTest.cs" Condition=" '$(Configuration)'=='Debug' " />

   ...
</Project>

Vorrei raccomandare un progetto separato per test di unità (e ancora di più progetti per i test di integrazione, test funzionali, etc.).Ho cercato di miscelazione codice e test nello stesso progetto e l'ho trovato molto meno gestibile di divisione in progetti separati.

Mantenendo in parallelo spazi dei nomi e l'utilizzo di un sensibile convenzione di denominazione per le prove (es.MyClass e MyClassTest) vi aiuterà a mantenere il manutenibile.

Fintanto che i test sono in una stanza separata progetto, il test di riferimento il codice, ma il codice non ha di riferimento il test.Mi chiedo, cosa c'è confusione circa il mantenimento di due progetti?È possibile mantenere la stessa soluzione per l'organizzazione.

La parte complicata, naturalmente, è quando l'azienda dispone di 55 progetti nella soluzione e il 60% di loro sono prove.Considerati fortunato.

Ho messo il test in un progetto separato, ma nella stessa soluzione.Concesso, in grandi soluzioni ci potrebbe essere un sacco di progetti, ma la soluzione explorer è abbastanza buono su di separazione e se si dà tutto ciò che è ragionevole nomi io non penso sia un problema.

Per ogni progetto c'è un corrispondente .Progetto di Test che contiene i test su di esso.

E. g.per l'assemblea chiamata, dire "Acme.BillingSystem.Utils", ci sarebbe un montaggio di prova chiamato "Acme.BillingSystem.Utils.Test".

Escludere dalla versione di spedizione del vostro prodotto non spedizione che dll.

Ho sempre il mio test di unità in una stanza separata progetto in modo da compilare una propria assemblea.

Una cosa da considerare è le versioni di VisualStudio prima del 2005 non consentire EXE progetti di assemblaggio per essere da riferimento per altri progetti.Quindi, se si sta lavorando su un progetto di eredità in VS.NET le opzioni sarebbero:

  • Mettere unit test nello stesso progetto e l'uso di compilazione condizionale per escluderli dalla build di rilascio.
  • Spostare il tutto dll assemblee in modo il tuo exe è solo un punto di ingresso.
  • Aggirare l'IDE di hacking il file di progetto in un editor di testo.

Dei tre compilazione condizionale è meno soggetto ad errori.

Io assolutamente d'accordo con tutti gli altri che si dovrebbero separare i test per il codice di produzione.Se ti ostini a non, tuttavia, è necessario definire un condizionale comiplation costante chiamata di PROVA, e avvolgere tutti gli unit test di classi con un

#if TEST
#endif

per assicurarsi che il codice di test non compilare in uno scenario di produzione.Una volta fatto questo, si dovrebbe essere in grado di escludere la dll di test dalla produzione alla distribuzione, o ancora meglio (ma più in manutenzione), creare un NAnt o MSBuild per la produzione che viene compilato senza i riferimenti alle dll di test.

Ho sempre creare un Acme.Roba.Progetto di Test che viene compilato separatamente.

Converse argomento è:Perché vuoi fare il test?Perché non in grado di fornire la prova?Se è possibile fornire le prove con un test runner è possibile avere un certo livello di test di accettazione e di auto-test forniti con il prodotto.

Ho sentito parlare di questo argomento un paio di volte e pensato ma io personalmente ancora mantenere i test in un progetto separato.

Se il #if(DEBUG) tag permette una pulizia "release" versione, perché avete bisogno di un progetto separato per le prove.Nunit LibarryA/B esempio (sì, so che è un esempio) fa questo.Attualmente lottando con lo scenario.Aveva un progetto separato, ma questo sembra forse permettere di alcuni miglioramenti di produttività.Ancora hummin e hawin.

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