Unit test, NUnit o Visual Studio?


114

Sto usando Visual Studio (a volte resharper) per eseguire il mio unit test.

Ho sentito parlare di NUnit, ma non ne so molte cose ...

Dovrei preoccuparmene? Può offrire qualcosa di meglio dello studio visivo?

Dovrei usare NUnit e perché?


12
considera anche xunit, tuttavia qualunque cosa tu faccia dai un'occhiata a TestDriven.net
Ian Ringrose


prova xunit.net. È open source e un bel framework di unit test per l'app .net.
Mukesh Arora

Risposte:


100

NUnit ha pochi vantaggi rispetto a MS-Test

  1. Attributo della suite: può aggregare i test ed eseguirli separatamente (utile per progetti di grandi dimensioni con test veloci e lenti, ad esempio)
  2. Metodo di asserzione leggibile, ad es. Assert.AreEqual(expected, actual)VsAssert.That(actual, Is.EqualTo(expected))
  3. NUnit ha frequenti aggiornamenti di versione: MS-Test ne ha solo uno per versione VS.
  4. Molti runner integrati tra cui Resharper e TestDriven.NET
  5. Asserzione messaggio di eccezione prevista - può essere eseguita utilizzando l'attributo in NUnit ma deve essere eseguita utilizzando Try-Catch in MS-Test
  6. [TestCase]! NUnit consente test parametrizzati.

32
L'eccezione può anche essere dichiarata dall'attributo in MS-Test: ExpectedExceptionAttribute.
Stefan Steinegger

9
Userei NUnit con Assert.Throws <> () perché questo segue il principio AAA, che non è valido per il modo attributo.
Oliver Hanappi

25
# 3 non è una funzionalità, è un problema e # 5 è falso al 100%; MS Test ha l'attributo ExpectedException e lo ha sempre .
Randolpho

4
@Elisha Per quanto ricordo, deliberatamente non supportavano il controllo del testo del messaggio perché il testo non è considerato significativo e può essere arbitrario. Cioè, non influisce sul flusso di un programma.
Rob Kent,

7
"# 3 non è una funzionalità, è un problema" - non sembra un modo di pensare molto agile ...
SamuelKDavis

72

Dal mio punto di vista corrente (dopo 8 mesi di sviluppo con circa 10 sviluppatori in media) vorrei consigliare contro usando MSTest per i seguenti motivi

  • Il framework in sé è piuttosto lento. Non mi riferisco al codice di prova che scrivi: è sotto il tuo controllo. Voglio dire che il framework che esegue questi test è lento, sia che stia eseguendo una suite di test, singoli test ecc.
  • La necessità di mantenere un file Test-Metadata che porta sempre a complicazioni quando diversi sviluppatori ci stanno lavorando (ricreando ad esempio i metadati, ecc.). Ogni altra suite di test non necessita di un file di metadati. È abbastanza carino organizzare i tuoi test, ma puoi ottenere lo stesso attraverso spazi dei nomi, classi e nomi di metodi.
  • Eseguendo l'integrazione continua, se desideri eseguire unit test sulla tua macchina di compilazione, dovrai installare Visual Studio su quella macchina.

In altre parole, se dovessi decidere di nuovo 8 mesi fa, probabilmente prenderei NUnit. Potrei non avere il rapporto sui risultati dei test integrato, ma gli sviluppatori avrebbero un'esperienza di test più fluida.


6
+1, evita MSTest a meno che tu non abbia scelta. I vari framework open source sono migliori (xUnit, NUnit, MbUnit, ecc.).
Brannon,

49

Ecco la mia esperienza con MS Test

  • Stiamo eseguendo MS Test con circa 3800 Test.
  • Ci vuole molto tempo prima che i test inizino ad essere eseguiti, il che è doloroso quando si eseguono test singoli.
  • Ci vuole circa 1 GB di memoria per eseguire i test. No, non è dovuto a perdite di memoria nei nostri test. Spesso ci imbattiamo in OutOfMemoryExceptions.
  • Poiché utilizza così tante risorse, stiamo iniziando a eseguire i test da file batch. Allora a cosa serve l'intera integrazione?
  • È bacato e instabile:
    • Ad esempio, se rimuovi l'attributo [Ignora] da un test, non lo riconosce, perché memorizza nella cache le informazioni sui test da qualche parte. È necessario aggiornare l'elenco di test, che a volte risolve il problema, o riavviare VS.
    • In modo casuale non copia gli assembly di riferimento nella directory out.
    • Gli elementi di distribuzione (file aggiuntivi da utilizzare) semplicemente non funzionano correttamente. Vengono ignorati in modo casuale.
  • Sono presenti informazioni nascoste (non visibili nel codice di prova) nei file vsmdi e testrunconfig. Se non ti interessa, potrebbe non funzionare.
  • Funzionalmente potrebbe essere paragonabile a NUnit, ma è molto costoso se si considera l'utilizzo dell'edizione VS tester.

Inoltre: ora abbiamo altri test, non possiamo nemmeno dire quanti. È impossibile eseguirli più da Visual Studio, a causa di OutOfMemoryExceptions e altri problemi di instabilità. Eseguiamo i test da script. Sarebbe facile visualizzare i risultati dei test in Visual Studio, ma quando la soluzione è aperta, VS si blocca (ogni volta). Quindi dobbiamo cercare i test falliti utilizzando la ricerca di testo. Non c'è più alcun vantaggio di uno strumento integrato.


Un altro aggiornamento : ora stiamo usando VS 2013. Molte cose sono cambiate. Hanno riscritto il test runner di MS Test per la terza volta da quando abbiamo iniziato. Ciò ha causato molte modifiche sostanziali, ma nessuna delle nuove versioni ha funzionato meglio. Siamo contenti di non aver utilizzato le fantasiose funzionalità di MS Test, perché non sono più supportate. È davvero un peccato. Stiamo ancora utilizzando gli script per creare ed eseguire tutti gli unit test, perché è più maneggevole. Visual Studio ha richiesto alcuni minuti per avviare l'esecuzione dei test (misure di tempo dopo la compilazione fino all'inizio del primo test). Probabilmente lo risolvono con un aggiornamento e questo potrebbe essere un problema specifico del nostro progetto. Tuttavia, Resharper è molto più veloce quando si eseguono gli stessi test.

Conclusione : almeno in combinazione con Resharper, MS Test è utile. E spero che finalmente scoprano come dovrebbe essere scritto il test runner e non apporteranno questo tipo di modifiche sostanziali quando aggiorneremo Visual Studio la prossima volta.


Recentemente ho iniziato a eseguirli senza eseguire il debug, lo rende molto più veloce e molto più simile a come potrebbe essere utilizzato NUnit, ma è ancora schifoso. Sembra che le scarse prestazioni siano legate a Visual Studio che fa cose funky durante il debug. (Cioè, usa "ctrl + F5" invece di "F5" - ottieni comunque la bella "integrazione" con VS)
Arafangion

Buona risposta, mi ha fatto risparmiare tempo
FindOutIslamNow

18

NUnit può essere utilizzato in combinazione con Visual Studio. È un framework, non un programma separato. Quindi potresti interessarti e vedere se ti va bene :).

testo alternativo http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=nunitit&DownloadId=61802

"Dopo aver installato il plug-in, troverai un nuovo sottomenu nel menu degli strumenti."

Vedere http://nunitit.codeplex.com/ per ulteriori informazioni sull'importazione.

Inoltre, è possibile trovare molto utilizzando la ricerca di SO. Questo argomento elenca i vantaggi di NUnit rispetto ai test standard MS, ad esempio.



3

NUnit funziona con l'edizione Standard di VS.


1
Non dimenticare le versioni express di Visual Studios.
chobo2

Passaggio di post-compilazione sul progetto di assemblaggio di unit test - \ path \ to \ nUnit $ (TargetFileName)
Steve Gilham

1

Non sono sicuro degli altri, ma NUnit fornisce una bella GUI e una console per eseguire i tuoi test unitari e puoi anche generare un report del risultato dell'esecuzione di NUnit Test che fornirebbe i dettagli di dove il test è fallito o superato e anche a che ora è stato prendi per il tuo unit test


1

NUnit è un framework di unit test, supportato anche da resharper. Penso che tu stia utilizzando il framework di unit test di Microsoft, quindi NUnit è solo un'alternativa al prodotto Microsoft;)

Ecco il collegamento alla homepage di NUnit: http://nunit.org


quindi vuoi dire che nunit non porta nient'altro che il framework di test di unità di Microsoft?
Tim

Sì, vedi il mio link per esempio nel mio post (sopra).
bastijn

Sto usando NUnit e non conosco il framework di unit test di Microsoft, quindi non posso dire cosa sia meglio. Penso che ci siano buone probabilità che troverai qualche argomento sulle differenze qui su SO.
Oliver Hanappi

Fornisce alcuni costrutti utili come [TestCase] ​​per eseguire un metodo di test con argomenti diversi, [Teoria] - per costruire specifiche più elaborate e altri. Supporta anche una sintassi fluida molto piacevole per le asserzioni. E, ultimo ma non meno importante, è usato molto più ampio di MSTest, quindi avresti maggiori possibilità di ottenere supporto / informazioni se ti mettessi nei guai.
elder_george

0

In NUnit , i test non vengono eseguiti in parallelo. Piuttosto, sembra che tutti i test vengano eseguiti su un singolo thread. In MSTest, ogni test viene istanziato su un thread separato, il che risulta che le esecuzioni vengono intercalate. Pertanto, se il test A dipende dal test B per il suo successo, probabilmente fallirà poiché il test B probabilmente inizierà a essere eseguito mentre il test A è in esecuzione.


-12

Se stai usando Visual Studio devi usare NUnit per fare unit test, e se stai usando java (Netbeans) devi usare JUnit per unit test.

Ecco un esempio per un semplice test unitario della calcolatrice

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SimpleCalculator;
using NUnit.Framework;

namespace CalculatorTest
{
    [TestFixture]
    public class Class1
    {
        public Calculator _calculator;
        [TestFixtureSetUp]
        public void Initialize()
        {
            _calculator = new Calculator();
        }
        [Test]
        public void DivideTest()
        {
            int a = 10;
            int b = 2;
            int expectedValue = a / b;
            int actualvalue = _calculator.Divide(a, b);
            Assert.AreEqual(expectedValue, actualvalue,"Failure");

        }
    }
}

4
Naturalmente non , non è necessario utilizzare NUnit, è solo un quadro, nessuno ti costringe a usarlo. Puoi anche scriverne uno tuo se sei annoiato.
HimBromBeere
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.