Unit Test, NUnit oder Visual Studio?

114

Ich verwende Visual Studio (manchmal Resharper), um meinen Komponententest auszuführen.

Ich habe von NUnit gehört, aber ich weiß nicht viel darüber ...

Sollte es mich interessieren? Kann es etwas Besseres bieten als Visual Studio?

Soll ich NUnit verwenden und warum?

Tim
quelle
12
Betrachten Sie auch xunit, aber was auch immer Sie einen Blick auf ein TestDriven.net
Ian Ringrose
Siehe auch stackoverflow.com/questions/707444/…
David Schmitt
versuchen Sie xunit.net. Es ist Open Source und ein schönes Unit-Test-Framework für die .net-App.
Mukesh Arora

Antworten:

100

NUnit hat gegenüber MS-Test nur wenige Vorteile

  1. Suite-Attribut - kann Tests aggregieren und separat ausführen (nützlich für große Projekte mit schnellen und langsamen Tests zum Beispiel)
  2. Lesbare Assert Methode, zB Assert.AreEqual(expected, actual)vsAssert.That(actual, Is.EqualTo(expected))
  3. NUnit hat häufige Versionsaktualisierungen - MS-Test hat nur eine pro VS-Version.
  4. Viele integrierte Läufer, einschließlich Resharper und TestDriven.NET
  5. Erwartete Ausnahmebestätigung - kann mithilfe des Attributs in NUnit erfolgen, muss jedoch mithilfe von Try-Catch in MS-Test erfolgen
  6. [TestCase]! NUnit ermöglicht parametrisierte Tests.
Elisha
quelle
32
Die Ausnahme kann auch durch ein Attribut in MS-Test: ExpectedExceptionAttribute bestätigt werden.
Stefan Steinegger
9
Ich würde NUnit mit Assert.Throws <> () verwenden, da dies dem AAA-Prinzip folgt, das für den Attributweg nicht durch ist.
Oliver Hanappi
25
# 3 ist keine Funktion, es ist ein Problem und # 5 ist 100% falsch; MS Test hat das Attribut ExpectedException und hat es immer .
Randolpho
4
@Elisha Soweit ich mich erinnere, haben sie die Überprüfung von Nachrichtentexten absichtlich nicht unterstützt, da der Text nicht als signifikant angesehen wird und willkürlich sein kann. Das heißt, es hat keinen Einfluss auf den Programmfluss.
Rob Kent
7
"# 3 ist kein Feature, es ist ein Problem" - klingt nicht nach einer sehr agilen Denkweise ...
SamuelKDavis
72

Aus meiner heutigen Sicht (nach 8 Monaten der Entwicklung mit etwa 10 Entwicklern im Durchschnitt) rate ich würde gegen mit MSTest aus den folgenden Gründen

  • Das Framework an sich ist ziemlich langsam. Ich meine nicht den Testcode, den Sie schreiben - das liegt unter Ihrer Kontrolle. Ich meine, das Framework, das diese Tests ausführt, ist langsam, egal ob es eine Testsuite, einzelne Tests usw. ausführt.
  • Die Notwendigkeit, eine Test-Metadatendatei zu führen, was immer zu Komplikationen führt, wenn mehrere Entwickler daran arbeiten (z. B. die Metadaten neu erstellen usw.). Jede andere Testsuite benötigt keine Metadatendatei. Es ist nett, Ihre Tests zu organisieren, aber Sie können dasselbe durch Namespaces, Klassen und Methodennamen erreichen.
  • Wenn Sie bei der kontinuierlichen Integration Komponententests auf Ihrem Build-Computer ausführen möchten, müssen Sie Visual Studio auf diesem Computer installieren.

Mit anderen Worten, wenn ich mich vor 8 Monaten erneut entscheiden müsste, würde ich wahrscheinlich NUnit nehmen. Ich habe möglicherweise nicht den integrierten Testergebnisbericht, aber Entwickler hätten eine nahtlosere Testerfahrung.

flq
quelle
6
+1, vermeiden Sie MSTest, es sei denn, Sie haben keine Wahl. Die verschiedenen Open-Source-Frameworks sind besser (xUnit, NUnit, MbUnit usw.).
Brannon
49

Hier ist meine Erfahrung mit MS Test

  • Wir führen MS Test mit rund 3800 Test durch.
  • Es dauert sehr lange, bis die Tests ausgeführt werden. Dies ist schmerzhaft, wenn einzelne Tests ausgeführt werden.
  • Die Ausführung der Tests dauert ca. 1 GB. Nein, es liegt nicht an Speicherlecks in unseren Tests. Häufig stoßen wir auf OutOfMemoryExceptions.
  • Da es so viele Ressourcen verbraucht, beginnen wir, die Tests aus Batch-Dateien auszuführen. Wofür ist die gesamte Integration gut?
  • Es ist fehlerhaft und instabil:
    • Wenn Sie beispielsweise das Attribut [Ignorieren] aus einem Test entfernen, wird es nicht erkannt, da Informationen zu Tests irgendwo zwischengespeichert werden. Sie müssen die Testliste aktualisieren, wodurch das Problem manchmal behoben wird, oder VS neu starten.
    • Referenzbaugruppen werden nicht zufällig in das out-Verzeichnis kopiert.
    • Bereitstellungselemente (zusätzliche zu verwendende Dateien) funktionieren einfach nicht richtig. Sie werden zufällig ignoriert.
  • In den Dateien vsmdi und testrunconfig sind Informationen versteckt (im Testcode nicht sichtbar). Wenn Sie sich nicht darum kümmern, funktioniert es möglicherweise nicht.
  • Funktionell mag es mit NUnit vergleichbar sein, aber es ist sehr teuer, wenn Sie die Verwendung der VS-Tester-Edition in Betracht ziehen.

Ergänzung: Wir haben jetzt noch einige Tests, können nicht einmal sagen, wie viele. Aufgrund von OutOfMemoryExceptions und anderen Instabilitätsproblemen können sie nicht mehr alle in Visual Studio ausgeführt werden. Wir führen die Tests über Skripte aus. Es wäre einfach, Testergebnisse in Visual Studio anzuzeigen, aber wenn die Lösung geöffnet ist, stürzt VS (jedes Mal) ab. Wir müssen also die fehlgeschlagenen Tests mithilfe der Textsuche durchsuchen. Ein integriertes Tool hat keinen Vorteil mehr.


Ein weiteres Update : Wir verwenden jetzt VS 2013. Viele Dinge haben sich geändert. Sie haben den MS Test Test Runner zum dritten Mal seit unserem Start neu geschrieben. Dies verursachte viele bahnbrechende Änderungen, aber keine der neuen Versionen machte etwas besseres. Wir sind froh, dass wir die ausgefallenen Funktionen von MS Test nicht verwendet haben, da sie nicht mehr unterstützt werden. Es ist wirklich eine Schande. Wir verwenden immer noch Skripte, um alle Komponententests zu erstellen und auszuführen, da dies einfacher ist. Visual Studio benötigte einige Minuten, um Tests auszuführen (Zeitmessungen nach der Kompilierung bis zum ersten Teststart). Sie beheben es wahrscheinlich mit einem Update und dies könnte ein spezifisches Problem unseres Projekts sein. Resharper ist jedoch viel schneller, wenn dieselben Tests ausgeführt werden.

Schlussfolgerung : Zumindest in Kombination mit Resharper ist MS Test nützlich. Und ich hoffe, dass sie endlich herausfinden, wie der Testläufer geschrieben werden soll, und diese Art von Änderungen nicht vornehmen, wenn wir Visual Studio das nächste Mal aktualisieren.

Stefan Steinegger
quelle
Ich habe vor kurzem angefangen, sie ohne Debugging auszuführen , macht es viel schneller und viel ähnlicher, wie NUnit verwendet werden könnte, aber es ist immer noch blöd. Es scheint, dass die schlechte Leistung damit zusammenhängt, dass Visual Studio beim Debuggen funky Sachen macht. (Das heißt, verwenden Sie "Strg + F5" anstatt nur "F5" - Sie erhalten immer noch die schöne "Integration" mit VS)
Arafangion
Gute Antwort, hat mir Zeit gespart
FindOutIslamNow
18

NUnit kann in Kombination mit Visual Studio verwendet werden. Es ist ein Rahmen, kein separates Programm. Sie könnten sich also darum kümmern, ob es zu Ihnen passt :).

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

"Nach der Installation des Plugins finden Sie ein neues Untermenü unter dem Menü Extras."

Siehe http://nunitit.codeplex.com/ für weitere Informationen über sie zu importieren.

Auch bei der Suche nach SO kann viel gefunden werden. In diesem Thema werden beispielsweise die Vorteile von NUnit gegenüber MS-Standardtests aufgeführt.

bastijn
quelle
3

NUnit arbeitet mit der Standard Edition von VS.

Per Erik Stendahl
quelle
1
Vergessen Sie nicht die Express-Versionen von Visual Studios.
Chobo2
Post-Build-Schritt für das Unit-Test-Assembly-Projekt - \ path \ to \ nUnit $ (TargetFileName)
Steve Gilham
1

Ich bin mir anderer nicht sicher, aber NUnit bietet eine schöne GUI und Konsole zum Ausführen Ihrer Unit-Tests. Außerdem können Sie einen Bericht über das Ergebnis der Ausführung des NUnit-Tests erstellen, der detailliert angibt, ob der Test fehlgeschlagen oder bestanden wurde und wann er durchgeführt wurde Nehmen Sie für Ihren Unit-Test

Vinay Pandey
quelle
1

NUnit ist ein Unit-Testing-Framework, das auch von Resharper unterstützt wird. Ich denke, Sie verwenden das Unit-Testing-Framework von Microsoft, daher ist NUnit nur eine Alternative zum Microsoft-Produkt;)

Hier ist der Link zur Homepage von NUnit: http://nunit.org

Oliver Hanappi
quelle
Sie meinen also, dass nunit nichts anderes als ein Microsoft Unit Testing Framework bringt?
Tim
Siehe meinen Link zum Beispiel in meinem Beitrag (oben).
Bastijn
Ich verwende NUnit und kenne das Unit-Testing-Framework von Microsoft nicht wirklich. Daher kann ich nicht sagen, was besser ist. Ich denke, es besteht eine gute Chance, dass Sie hier auf SO ein Thema zu den Unterschieden finden.
Oliver Hanappi
Es bietet einige nützliche Konstrukte wie [TestCase] ​​zum Ausführen einer Testmethode mit verschiedenen Argumenten, [Theorie] - zum Erstellen ausführlicherer Spezifikationen und andere. Es unterstützt auch eine sehr schöne fließende Syntax für Behauptungen. Und last but not least wird es viel breiter als MSTest verwendet, sodass Sie bessere Chancen haben, Support / Informationen zu erhalten, wenn Sie in Schwierigkeiten geraten.
Elder_george
0

In NUnit werden Tests nicht parallel ausgeführt. Es scheint vielmehr, dass alle Tests in einem einzigen Thread ausgeführt werden. In MSTest wird jeder Test in einem separaten Thread instanziiert. Dies führt dazu, dass die Läufe verschachtelt werden. Wenn Test A für seinen Erfolg von Test B abhängt, schlägt er wahrscheinlich fehl, da Test B wahrscheinlich ausgeführt wird, während Test A ausgeführt wird.

Mourad Samy
quelle
-12

Wenn Sie Visual Studio verwenden, müssen Sie NUnit für Unit-Tests verwenden, und wenn Sie Java (Netbeans) ausführen, müssen Sie JUnit für Unit-Tests verwenden.

Hier ist ein Beispiel für einen einfachen Taschenrechner-Unit-Test

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");

        }
    }
}
Nipuna Prashan
quelle
4
Natürlich müssen Sie NUnit nicht verwenden, es ist nur ein Framework, niemand zwingt Sie, es zu verwenden. Sie könnten sogar Ihre eigene schreiben, wenn Sie sich langweilen.
HimBromBeere