NUnit vs Visual Studio 2008's Test Projects for Unit Testing? [chiuso]


254

Ho intenzione di avviare un nuovo progetto al lavoro e voglio entrare in test unitari. Useremo VS 2008, C # e le cose ASP.NET MVC. Sto cercando di utilizzare NUnit o i progetti di test integrati di VS2008, ma sono aperto alla ricerca di altri suggerimenti. Un sistema è migliore dell'altro o forse più facile da usare / capire dell'altro? Sto cercando di impostare questo progetto come una specie di "best practice" per i nostri sforzi di sviluppo.

Grazie per qualsiasi aiuto e suggerimenti !!

Risposte:


99

Daok ha nominato tutti i pro dei progetti di test VS2008, ecco i pro di NUnit.

  • NUnit ha un framework beffardo.
  • NUnit può essere eseguito all'esterno dell'IDE, questo può essere utile se si desidera eseguire test su un server di build non MS come CC.Net
  • NUnit ha più versioni in uscita rispetto a Visual Studio. Non devi aspettare anni per una nuova versione E non devi installare una nuova versione dell'IDE per ottenere nuove funzionalità.
  • Ci sono estensioni in fase di sviluppo per NUnit come test di riga ecc.
  • I test di Visual Studio impiegano molto tempo per avviarsi per qualche motivo. Questo è meglio nel 2008, ma è ancora troppo lento per i miei gusti. Eseguire rapidamente un test per vedere se non hai rotto qualcosa può richiedere troppo tempo. NUnit con qualcosa come Testdriven.Net per eseguire test dall'IDE è in realtà molto più veloce. soprattutto quando si eseguono test singoli.
    Secondo Kjetil Klaussen ciò è causato dal testrunner di Visual Studio, che esegue i test MSTest in TestDriven.Net rende le prestazioni MSTest paragonabili a NUnit.

19
Non puoi semplicemente usare mstest.exe per eseguire test MSTest al di fuori dell'IDE?
Phillip Wells,

13
Nunit che ha un quadro beffardo non è molto vantaggioso. Ho usato progetti di unit test VS 2008 con il framework Moq che utilizza un nuovo approccio, sfruttando gli alberi delle espressioni LINQ: code.google.com/p/moq
DSO

5
Un altro vantaggio per Nunit, per me comunque, è che Resharper ha un'interfaccia utente molto bella racchiusa attorno ad essa, che è molto più veloce dei componenti di test VS. Collega anche hyperlink la traccia dello stack di test non riusciti al codice.
Jeff Putz,

7
Il test unitario è incluso nella versione professionale di VS 2008.
user179700,

3
@Jeff Putz: Resharper può anche eseguire i test unitari di Visual Studio, anche al di fuori di un progetto di test.
Paul Ruane,

64

Il framework di unit test non ha molta importanza, perché puoi convertire le classi di test con file di progetto separati e compilazione condizionale (come questa, VS-> NUnit):

 #if! NUNIT
  utilizzando Microsoft.VisualStudio.TestTools.UnitTesting;
 #altro
  usando NUnit.Framework;
  utilizzando TestClass = NUnit.Framework.TestFixtureAttribute;
  utilizzando TestMethod = NUnit.Framework.TestAttribute;
  utilizzando TestInitialize = NUnit.Framework.SetUpAttribute;
  utilizzando TestCleanup = NUnit.Framework.TearDownAttribute;
  utilizzando TestContext = System.String;
  utilizzando DeploymentItem = NUnit.Framework.DescriptionAttribute;
 #finisci se

Il plug-in TestDriven.Net è carino e non molto costoso ... Con solo il semplice VS2008 devi trovare il test dalla tua classe di test o dalla tua lista di test. Con TestDriven.Net è possibile eseguire il test direttamente dalla classe che si sta testando. Dopotutto, il test unitario dovrebbe essere facile da mantenere e vicino allo sviluppatore.


12
Ho votato a questo verso il basso perché NUnit ha una sintassi più ricca di MSTest, il che significa che puoi passare da MSTest -> NUnit, ma non viceversa a meno che tu non sia MOLTO attento. La storia mostra che almeno uno di noi non lo è.
Thomas Eyde,

2
Sono d'accordo con Thomas. Ciò funzionerà supponendo che tu stia utilizzando le istruzioni di asserzione più elementari, ma il modello di vincolo NUnit è molto potente e abbastanza valido per scegliere NUnit su MSTest.
Mark,

Credo che questo approccio sia adottato dal modello ms e dal gruppo di pratica nei test EntLib.
robi-y,

1
@Dan Neely se stai testando i privati, stai sbagliando :(
JDPeckham,

2
@JDPeckham Non sto dicendo che le convenzioni su cosa dovrebbe / non debba essere fatto con uno strumento non siano importanti, ma alla fine ottenere il lavoro è la cosa più importante. Se ciò significa martellare un chiodo con la parte posteriore di un'ascia di guerra perché i venditori di utensili non vendono martelli, i produttori di asce dovranno solo vivere indignati.
Dan sta armeggiando a Firelight il

34

Vantaggi / modifiche del framework di test unità integrato VS2008

  1. La versione 2008 è ora disponibile in edizioni professionali (prima che richiedesse costose versioni di VS, questo è solo per test di unità di sviluppo.) Che ha lasciato molti sviluppatori con l'unica scelta di framework di test aperti / esterni.
  2. API integrata supportata da una singola azienda.
  3. Utilizzare gli stessi strumenti per eseguire e creare test (è possibile eseguirli utilizzando la riga di comando anche MSTest)
  4. Design semplice (non è garantito alcun framework Mock, ma questo è un ottimo punto di partenza per molti programmatori)
  5. Supporto a lungo termine concesso (ricordo ancora cosa è successo a nDoc, non voglio impegnarmi in un framework di test che potrebbe non essere supportato in 5 anni, ma considero ancora nUnit un ottimo framework.)
  6. Se si utilizza il server di Team Foundation come back-end, è possibile creare oggetti di lavoro o bug con i dati del test non riusciti in modo semplice.

4
Penso che stia ancora raccontando il punto di vista di Microsoft sui test che NON è nella versione standard, solo professionale e superiore.
J Wynia,

D'accordo, mi piacerebbe vederlo in versione standard. Nelle versioni espresse sarà eccessivo per un principiante.
Simara,

1
@J Wynia: Leggere la loro decisione di includerlo solo in Professional e sopra come dire qualcosa sulla loro visione sui test sta leggendo troppo. È più probabile una decisione commerciale che filosofica.
Jason,

@Simara Testing dovrebbe essere inerente al ciclo di vita dello sviluppo. Dovrebbe essere fornito in edizioni espresse.
Eastender,

33

Uso NUnit da 2 anni. Va tutto bene, ma devo dire che il sistema di unità in VS è piuttosto bello perché è all'interno della Gui e può più facilmente fare test per funzioni private senza doversi preoccupare. Inoltre, il Test unitario di VS ti consente di fare cover e altre cose che NUnit da sola non può fare.


44
Non dovresti toccare i tuoi privati. Scherzi a parte, una scuola di pensiero è che tutto ciò di cui hai bisogno per il test sono i tuoi metodi pubblici. Chiamare tutti i tuoi metodi pubblici dovrebbe chiamare tutti i tuoi metodi privati. Se un metodo privato non viene chiamato tramite un metodo pubblico, il metodo privato è ridondante.
Lieven Keersmaekers,

7
@Lieven: se stai testando i privati ​​anche se il pubblico stai davvero facendo un test di integrazione e non un test unitario. (Certo che non sono uno zelante TDD e probabilmente vorrei solo testare il pubblico ... ma ho voglia di aiutare ad iniziare una rissa)
Matthew Whited,

11
@Matthew, i test di integrazione stanno testando due o più unità insieme. Il test di metodi privati ​​è solo una (enorme) violazione dell'incapsulamento e può portare a fragili test unitari che devono essere modificati ogni volta che l'implementazione cambia.
Omer Rauchwerger,

3
Puoi anche usare [assembly: InternalsVisibleTo (...)] con una direttiva del compilatore per eliminarlo quando stai realizzando una build RTM.
Iain Galloway,

1
Tocco i miei privati ​​tutto il tempo :) Penso che ci sia valore nel testare specificamente i membri privati ​​per evitare il sovraccarico dal test dei chiamanti che richiedono molte configurazioni complesse.
Crackerjack,

14

Un leggero fastidio del framework di test di Visual Studio è che creerà molti file di test che tendono a ingombrare la directory del progetto, anche se non è un grosso problema.

Inoltre, se non si dispone di un plug-in come TestDriven.NET, non è possibile eseguire il debug dei test delle unità NUnit (o MbUnit, xUnit, ecc.) All'interno dell'ambiente Visual Studio, come è possibile con il framework di test Microsoft VS, integrato.


3
È possibile eseguire il debug del test NUnit in Visual Studio 2005.
Jason Short

Puoi anche eseguire il debug di xunit ma non è ovvio come configurarlo (pagina delle proprietà)
annakata,

1
Puoi facilmente eseguire il debug di NUnit collegando il debugger al processo NUnit in esecuzione, come ha detto grimus. Nessun vero svantaggio qui.
Anne Schuessler,

1: Numero di test configurabili nelle impostazioni VS - L'ho impostato su uno. 2: Concordo con i commenti sopra - possibili ma imbarazzanti, 3: Complessivamente, preferisco l'ambiente di test VS integrato.
RaoulRubin,

14

Leggermente fuori tema, ma se vai con NUnit posso consigliare di utilizzare ReSharper : aggiunge alcuni pulsanti all'interfaccia utente VS che rendono molto più semplice l'esecuzione e il debug dei test all'interno dell'IDE.

Questa recensione è leggermente obsoleta, ma lo spiega in modo più dettagliato:

http://codebetter.com/blogs/paul.laudeman/archive/2006/08/15/Using-ReSharper-as-an-essential-part-of-your-TDD-toolkit.aspx


Con il plug-in Gallio per R # puoi anche eseguire MSTest.
Kjetil Klaussen,

CodeRush inserisce le icone nei test direttamente nel codice in modo da poter eseguire un test o tutti i test in una classe o in uno spazio dei nomi. Vedi qui: community.devexpress.com/blogs/markmiller/archive/2009/11/16/…
Ryan Lundy

Resharper eseguirà anche i test MSTest.
JDPeckham,


11

Il mio obiettivo principale con i test unitari VS su NUnit è che la creazione del test VS tende a iniettare un sacco di codice generato per l'accesso di membri privati.

Alcuni potrebbero voler testare i loro metodi privati, altri no, questo è un argomento diverso.

La mia preoccupazione è quando scrivo unit test che dovrebbero essere estremamente controllati, quindi so esattamente cosa sto testando ed esattamente come lo sto testando. Se c'è un codice generato automaticamente sto perdendo parte di quella proprietà.


11

Ho fatto un TDD usando entrambi e (forse sono un po 'stupido) nUnit sembra essere molto più veloce e più semplice da usare per me. E quando dico molto, intendo molto.

In MS Test, ci sono troppi attributi, ovunque: il codice che esegue i test reali sono le minuscole righe che puoi leggere qua e là. Un gran casino. In nUnit, il codice che esegue il test domina solo gli attributi, come dovrebbe fare.

Inoltre, in nUnit, devi solo fare clic sui test che vuoi eseguire (solo uno? Tutti i test che coprono una classe? Un assembly? La soluzione?). Un click. E la finestra è chiara e grande. Ottieni chiare luci verdi e rosse. Sai davvero cosa succede in un colpo solo.

In VSTS, l'elenco dei test è bloccato nella parte inferiore dello schermo, è piccolo e brutto. Devi guardare due volte per sapere cosa è successo. E non puoi eseguire un solo test (beh, non l'ho ancora scoperto!).

Ma potrei sbagliarmi, ovviamente - ho appena letto circa 21 post sul blog su "Come fare TDD semplice usando VSTS". Avrei dovuto leggere di più, hai ragione.

Per nUnit, ne ho letto uno. E stavo TDDing lo stesso giorno. Con divertimento.

A proposito, di solito adoro i prodotti Microsoft. Visual Studio è davvero lo strumento migliore che uno sviluppatore può acquistare, ma TDD e la gestione degli oggetti di lavoro in Visual Studio Team System fanno davvero schifo.

Ti auguro il meglio. Sylvain.


9

Ho ricevuto messaggi secondo cui "La struttura dei file NUnit è più ricca di VSTest" ... Naturalmente se preferisci la struttura dei file NUnit, puoi usare questa soluzione in un altro modo, come questo (NUnit-> VS):

 #if !MSTEST
  using NUnit.Framework;
 #else
  using Microsoft.VisualStudio.TestTools.UnitTesting;
  using TestFixture = Microsoft.VisualStudio.TestTools.UnitTesting.TestClassAttribute;
  using Test = Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute;
  using SetUp = Microsoft.VisualStudio.TestTools.UnitTesting.TestInitializeAttribute;
  using TearDown = Microsoft.VisualStudio.TestTools.UnitTesting.TestCleanupAttribute;
 #endif

O qualsiasi altra conversione ... :-) Questo utilizzo qui è solo un alias per il compilatore.


1
Non capisco cosa stai dicendo qui.
Positivo

nessuna configurazione / smontaggio a livello di apparecchio :( o presumono che usiamo ctor e dtor?
JDPeckham

9

Per prima cosa voglio correggere un'istruzione errata: è possibile eseguire msTest al di fuori di Visual Studio utilizzando la riga di comando. Sebbene diversi strumenti di CI come TeamCity abbiano un supporto migliore per NUnit (probabilmente cambierebbe man mano che msTest diventa più popolare). Nel mio progetto attuale utilizziamo entrambi e l'unica grande differenza che abbiamo riscontrato è che mstest viene sempre eseguito come 32 bit mentre NUnit viene eseguito come test 32 bit o 64 bit, il che conta solo se il codice utilizza codice nativo che è 32/64 dipendente.


8

Ho iniziato con MSTest ma ho cambiato per un semplice motivo. MSTest non supporta l'ereditarietà dei metodi di test da altri assembly.

Odiavo l'idea di scrivere lo stesso test più volte. Soprattutto su un grande progetto in cui i metodi di test possono essere facilmente eseguiti in centinaia di test.

NUnit fa esattamente quello di cui ho bisogno. L'unica cosa che manca a NUnit è un componente aggiuntivo di Visual Studio che può visualizzare lo stato Rosso / Verde (come VSTS) di ogni test.



7

Se stai considerando MSTest o nUnit, ti consiglio di consultare mbUnit. Le mie ragioni sono

  1. Compatibilità TestDriven.Net. Niente di meglio ha TestDriven.Net.ReRunWithDebugger associato a una combinazione di tasti.
  2. Il framework Gallio. Gallio è un test runner come nUnits. L'unica differenza è che non importa se hai scritto i tuoi test in nUnit, msTest, xUnit o mbUnit. Tutti corrono.
  3. Compatibilità con nUnit. Tutte le funzionalità di nUnit sono supportate da mbUnit. Penso che non hai nemmeno bisogno di cambiare i tuoi attributi (dovrai verificarlo), solo i tuoi riferimenti e usi.
  4. La raccolta afferma. mbUnit ha più casi Assert, inclusa la classe CollectionAssert. Fondamentalmente non è più necessario scrivere i propri test per vedere se 2 raccolte sono uguali.
  5. Test combinatori. Non sarebbe bello se tu potessi fornire due set di dati e ottenere un test per tutte le combinazioni di dati. È in mbUnit.

Inizialmente ho acquisito mbUnit a causa della sua funzionalità [RowTest ....] e non ho trovato un solo motivo per tornare indietro. Ho spostato tutte le mie suite di test attivi da nUnit e non ho mai guardato indietro. Da allora ho convertito due diversi team di sviluppo in vantaggi.


6

Per quanto ne so, al momento sono disponibili quattro framework per test unitari con .NET

  • NUnit
  • MbUnit
  • MSTest
  • xUnit

NUnit è sempre stata in vantaggio ma il divario si è chiuso nell'ultimo anno circa. Preferisco ancora NUnit, soprattutto perché hanno aggiunto un'interfaccia fluida qualche tempo fa che rende i test molto leggibili.

Se hai appena iniziato a testare l'unità, probabilmente non fa molta differenza. Una volta che sarai pronto, sarai in una posizione migliore per giudicare quale struttura è la migliore per le tue esigenze.


6

Non mi piace il framework di test integrato VS perché ti costringe a creare un progetto separato anziché avere i tuoi test come parte del progetto che stai testando.


3
Puoi effettivamente ingannare Visual Studio modificando manualmente i file di progetto e aggiungendo i valori di ProjectTypeGuids che utilizza per identificare i progetti di test: & lt; ProjectTypeGuids & gt; {3AC096D0-A1C2-E12C-1390-A8335801FDAB}; {FAE04EC0-301F-11D3- BF4B-00C04F79EFBC} & lt; / ProjectTypeGuids & gt;
Paul Ruane,

5

MSTest è essenzialmente NUnit leggermente rielaborato, con alcune nuove funzionalità (come l'impostazione dell'assemblaggio e lo smontaggio, non solo il dispositivo e il livello di test) e manca alcuni dei migliori bit (come la nuova sintassi del vincolo 2.4). NUnit è più maturo e offre maggiore supporto da parte di altri fornitori; e, naturalmente, dato che è sempre stato gratuito (mentre MSTest è entrato nella versione Professional del 2008, prima che fosse in SKU molto più costosi), la maggior parte dei progetti ALT.NET lo utilizza.

Detto questo, ci sono alcune aziende che sono incredibilmente riluttanti a usare qualcosa che non ha l'etichetta Microsoft su di esso, e in particolare il codice OSS. Pertanto, disporre di un quadro di prova ufficiale per gli Stati membri può essere la motivazione di cui tali aziende hanno bisogno per sottoporsi ai test; e siamo onesti, è il test che conta, non quale strumento usi (e usando il codice di Tuomas Hietanen sopra, puoi quasi rendere intercambiabile il tuo framework di test).


Adoro la sintassi del contraint di NUnit ma penso che dovresti leggere questo riguardo agli attributi SetUpe TearDown: jamesnewkirk.typepad.com/posts/2007/09/why-you-should-.html
Nessuno

4

Con il rilascio in .NET 4.0 del sistema Code Contracts e la disponibilità di un controllo statico , sarebbe necessario scrivere teoricamente un numero inferiore di casi di test e uno strumento come Pex aiuterà a identificare tali casi. Collegandolo alla discussione in corso, se hai bisogno di fare di meno con i tuoi test unitari perché i tuoi contratti coprono la tua coda, allora perché non andare avanti e usare i pezzi incorporati poiché è una dipendenza in meno da gestire. In questi giorni, sono tutto sulla semplicità. :-)

Guarda anche:


3

Preferirei usare il piccolo framework di test di MS, ma per ora mi attengo a NUnit. I problemi con gli SM sono generalmente (per me)

  • File "test" condiviso (inutile) che deve essere mantenuto
  • Gli elenchi dei test causano conflitti con più sviluppatori / VCS
  • Scarsa interfaccia utente integrata - configurazione confusa, selezione di test onerosa
  • Nessun buon corridore esterno

Avvertenze - Se stessi testando un sito aspx, utilizzerei sicuramente MS - Se sviluppassi da solo, anche MS andrebbe bene - Se avessi abilità limitate e non potessi configurare NUnit :)

Trovo molto più semplice scrivere i miei test e accendere NUnitGUI o uno degli altri front-end (testDriven è di gran lunga molto costoso). Anche l'impostazione del debug con la versione da riga di comando è abbastanza semplice.


In questo momento sto usando Resharper per eseguire i test MS, quindi non mi dispiace molto. Preferisco CodeRush + RefactorPro, anche se non è quello che usiamo qui. Forse ora hanno anche un corridore decente per MS Test.
Andrew Backer,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.