NUnit vs. MbUnit vs. MSTest vs. xUnit.net [geschlossen]

390

Es gibt eine ganze Reihe von nichtssagenden Frameworks für .NET. Ich habe diesen kleinen Funktionsvergleich gefunden: http://xunit.github.io/docs/comparisons.html

Jetzt soll ich das beste für uns auswählen. Aber wie? Ist das wichtig? Welches ist am zukunftssichersten und hat eine ordentliche Dynamik dahinter? Sollte ich mich um die Funktionen kümmern? Während xUnit am modernsten und speziell für .NET entwickelt zu sein scheint, scheint NUnit wieder das zu sein, was allgemein akzeptiert wird. MSTest ist wieder in Visual Studio integriert ...

Bitbonk
quelle
11
Diese Vergleichstabelle ist Jahre veraltet. Zum Beispiel hat NUnit auch Assert.Throws usw., und alles in der Assertions-Tabelle ist die alte API. Die neue fließende Syntax von Assert.That (..., Is ....) ist viel besser und gibt es schon seit einiger Zeit.
Jim Cooper
11
Kennen Sie einen Tisch, der aktueller ist?
Bitbonk
1
Ende 2013 von xUnit.net => NUnit verschoben. Beachten Sie auch, dass xUnit.NET (das Projekt)! = XUnit (die Kategorie, zu der NUnit gehört)
DeepSpace101
3
@Sid warum bist du von xUnity.net umgezogen => NUnit?
Alexander Logger
2
Ähnliche Frage gestellt in 2014 Visual Studio 2013 MSTest vs NUnit
Michael Freidgeim

Antworten:

197

Ich weiß, dass dies ein alter Thread ist, aber ich dachte, ich würde eine Abstimmung für xUnit.NET veröffentlichen . Während die meisten anderen erwähnten Test-Frameworks ziemlich gleich sind, hat xUnit.NET einen ziemlich einzigartigen, modernen und flexiblen Ansatz für Unit-Tests gewählt. Die Terminologie wird geändert, sodass Sie TestFixtures und Tests nicht mehr definieren. Sie geben Fakten und Theorien zu Ihrem Code an, die sich besser in das Konzept eines Tests aus TDD / BDD-Sicht integrieren lassen.

xUnit.NET ist auch EXTREM erweiterbar. Die Attributklassen FactAttribute und TraitAttribute sind nicht versiegelt und bieten überschreibbare Basismethoden, mit denen Sie genau steuern können, wie die von diesen Attributen dekorierten Methoden ausgeführt werden sollen. Während xUnit.NET in seiner Standardform das Schreiben von Testklassen ermöglicht, die NUnit-Testgeräten mit ihren Testmethoden ähnlich sind, sind Sie überhaupt nicht auf diese Form des Komponententests beschränkt. Es steht Ihnen frei, das Framework zu erweitern, um die hier dargestellten Concern / Context / Observation-Spezifikationen im BDD-Stil zu unterstützen .

xUnit.NET unterstützt auch das sofortige Testen im Fit-Stil mit seinem Theory-Attribut und den entsprechenden Datenattributen. Fit-Eingabedaten können aus Excel, einer Datenbank oder sogar einer benutzerdefinierten Datenquelle wie einem Word-Dokument geladen werden (indem das Basisdatenattribut erweitert wird). Auf diese Weise können Sie eine einzige Testplattform sowohl für Komponententests als auch für Integrationstests nutzen kann bei der Reduzierung von Produktabhängigkeiten und erforderlichen Schulungen enorm sein.

Andere Testansätze können auch mit xUnit.NET implementiert werden ... die Möglichkeiten sind ziemlich unbegrenzt. In Kombination mit einem anderen sehr zukunftsweisenden Spott-Framework, Moq , bilden die beiden eine sehr flexible, erweiterbare und leistungsstarke Plattform für die Implementierung automatisierter Tests.

jrista
quelle
35
Während dies vor über einem Jahr der Fall war, hat NUnit seitdem die meisten der fraglichen Attribute hinzugefügt. In NUnit können Sie Tests in beide Richtungen schreiben.
Mark Levison
8
Es geht nicht so sehr darum, welche Attribute verfügbar sind, sondern wie sie verwendet werden können. xUnit.NET wurde von Grund auf als hochflexibles und erweiterbares Framework konzipiert, das Sie nicht an eine bestimmte Testmethode gebunden hat und bei dem Sie das Kernframework nicht regelmäßig aktualisieren müssen, um die neuesten Funktionen zu erhalten.
jrista
9
1. Deutlich unterschiedliche Namen auf Attributen machen keinen großen Sinn. 2. NUnit war erweiterbar und ist weiterhin erweiterbar :? 3. Datenzeilenparameter für Tests werden in nunit unterstützt. Vor einiger Zeit wurden sie in einer Erweiterung unterstützt :) 4. Nunit kombiniert mit Moq schafft das gleiche. 5. Für BDD würde ich specflow sagen, das sich problemlos in viele Unit-Testing-Frameworks integrieren lässt.
Graffic
8
Ich mag den Sound von xUnit, aber es hat keine Dokumentation :(
Colonel Panic
10
xUnit hat überhaupt keine Dokumentation! Beispiel: Versuchen Sie herauszufinden, was Traitwirklich funktioniert, oder ob Sie verschiedene Tests innerhalb eines Elterntests gruppieren können (z. B. alle testsinnerhalb eines Tests testfixture). nUnit erstellt eine großartige hierarchische Ansicht anstelle der flachen Ansicht von xUnit für Tests. Außerdem macht die Nomenklatur keinen Sinn - Fakten und Theorie? Sei realistisch! Das sind besser Tests und Daten.
DeepSpace101
134

NUnit wird wahrscheinlich am meisten von Tools von Drittanbietern unterstützt. Es ist auch schon länger als die anderen drei.

Ich persönlich interessiere mich nicht sehr für Unit-Test-Frameworks, verspottete Bibliotheken sind meiner Meinung nach viel wichtiger (und sperren Sie viel mehr ein). Wählen Sie einfach eine aus und bleiben Sie dabei.

Alexander Kojevnikov
quelle
3
Was ist Ihre Top-Mock-Bibliothek?
Dplante
31
Ich mag Moq, RhinoMocks ist auch gut.
Alexander Kojevnikov
5
Es könnte sich auch lohnen, Pex und Maulwürfe zu überprüfen. Der Maulwurfsteil ist besonders nützlich zum Verspotten.
Charles Prakash Dasari
4
MSPec mit FakeItEasy ... macht Testfälle lesbarer
Robie
5
MSpec mit NSubstitute und AutoFixture ist meine Wahl.
Daniel Hilgarth
108

Ich würde nicht mit MSTest gehen. Obwohl es wahrscheinlich der zukunftsfähigste Beweis für die Frameworks ist, hinter denen Microsoft steht, ist es nicht die flexibelste Lösung. Ohne Hacks läuft es nicht alleine. Daher ist es schwierig, es auf einem anderen Build-Server als TFS auszuführen, ohne Visual Studio zu installieren. Der Visual Studio-Testläufer ist tatsächlich langsamer als Testdriven.Net + eines der anderen Frameworks. Und da die Releases dieses Frameworks an Releases von Visual Studio gebunden sind, gibt es weniger Updates. Wenn Sie mit einem älteren VS arbeiten müssen, sind Sie an einen älteren MSTest gebunden.

Ich denke nicht, dass es sehr wichtig ist, welches der anderen Frameworks Sie verwenden. Es ist wirklich einfach, von einem zum anderen zu wechseln.

Ich persönlich benutze XUnit.Net oder NUnit, je nach den Vorlieben meiner Mitarbeiter. NUnit ist der Standard. XUnit.Net ist das schlankste Framework.

Mendelt
quelle
36
Ich bin gezwungen worden, zu diesem Schluss zu treten und zu schreien. Ich wollte MSTest unbedingt wegen seiner Integration in Visual Studio verwenden, aber das ist auch seine Schwäche. Ich muss Tests auf einem Build-Server ausführen, der nicht von Microsoft stammt, und ich kann Visual Studio auf keinen Fall darauf installieren, nur um dies zu erreichen. Es ist eine Schande, dass Microsoft großartige Tools produziert und diese dann fast unerreichbar macht.
Tim Long
11
+1 für das Ausrufen der Schrecklichkeit, die MSTest ist. Letztendlich spielt es keine Rolle, welches Unit-Test-Framework Sie verwenden, solange es nicht MSTest ist
Mike Mooney
21

Erwägen Sie, MSTest durch ein anderes Testframework zu ergänzen, nicht zu ersetzen. Sie können die Visual Studio MSTest-Integration beibehalten und gleichzeitig die Vorteile eines umfassenderen Testframeworks nutzen.

Zum Beispiel benutze ich xUnit mit MSTest. Fügen Sie einen Verweis auf die Assembly xUnit.dll hinzu, und führen Sie einfach so etwas aus. Überraschenderweise funktioniert es einfach!

using Microsoft.VisualStudio.TestTools.UnitTesting;
using Assert = Xunit.Assert;  // <-- Aliasing the Xunit namespace is key

namespace TestSample
{
    [TestClass]
    public class XunitTestIntegrationSample
    {
        [TestMethod]
        public void TrueTest()
        {
            Assert.True(true);  // <-- this is the Xunit.Assert class
        }

        [TestMethod]
        public void FalseTest()
        {
            Assert.False(true);
        }
    }
}
Matt Crouch
quelle
Diese Technik funktioniert möglicherweise auch für NUnit, MBUnit oder andere Test-Frameworks, die in anderen Antworten erwähnt werden, aber ich habe sie nicht ausprobiert.
Matt Crouch
1
Glaubst du, ich könnte parametrisierte Tests bekommen, um mit MSTest mit diesem Ansatz zu arbeiten, Matt?
DevDave
@ DevDave Nein. In seinem Beispiel hat er gerade eine Klasse aus einer anderen Assembly verwendet. Wenn Sie parametrisierte Tests wünschen, benötigen Sie ein anderes Testframework, das speziell für die Erweiterung von MSTest entwickelt wurde.
Zoran404
3
Suprisingly, it just works!Sie haben gerade eine statische Funktion von einer anderen Assembly aufgerufen. Warum bist du überrascht, dass es funktioniert? Auch wenn Sie nur Aussagen benötigen, warum nicht eine speziell dafür hergestellte Baugruppe verwenden?
Zoran404
9

Nunit funktioniert nicht gut mit Mixed-Mode-Projekten in C ++, also musste ich es löschen

Eric
quelle
3
Ich bin nicht stolz auf diese Antwort, aber ich habe Unit-Tests für dieses Projekt eingestellt. Ich habe viele Validierungsverfahren zur Laufzeiterkennung von Fehlern geschrieben
Eric
2
Ich hatte gehofft, NUnit im gemischten Modus verwenden zu können, fand es aber auch unzureichend. Am Ende entschied ich mich für googletest, ein ausgezeichnetes C ++ - Unit-Test-Framework, das einfach einzurichten ist.
Chillitom
8

Es ist keine große Sache im kleinen / persönlichen Maßstab, aber es kann schnell eine größere Sache im größeren Maßstab werden. Mein Arbeitgeber ist ein großer Microsoft-Shop, der sich aus mehreren Gründen nicht an Team System / TFS beteiligen kann / kann. Wir verwenden derzeit Subversion + Orcas + MBUnit + TestDriven.NET und es funktioniert gut, aber TD.NET zu bekommen war ein großer Aufwand. Die Versionsempfindlichkeit von MBUnit + TestDriven.NET ist ebenfalls ein großer Aufwand, und es ist nicht trivial, eine zusätzliche kommerzielle Sache (TD.NET) für die rechtliche Überprüfung und Beschaffung zu verwalten und zu verwalten. Mein Unternehmen ist wie viele andere Unternehmen mit einem MSDN-Abonnementmodell fett und zufrieden, und es ist einfach nicht daran gewöhnt, einmalige Beschaffungen für Hunderte von Entwicklern abzuwickeln. Mit anderen Worten, das vollständig integrierte MS-Angebot ist zwar definitiv nicht immer das beste Brot, aber meiner Meinung nach ein bedeutender Mehrwert.

Ich denke, wir bleiben bei unserem aktuellen Schritt, weil er funktioniert und wir den Buckel organisatorisch bereits überwunden haben, aber ich wünschte, MS hätte ein überzeugendes Angebot in diesem Bereich, damit wir unseren Entwicklungsstapel ein wenig konsolidieren und vereinfachen können.

user8133
quelle
2
ReSharper hat in diesem Bereich ein überzeugendes Angebot!
Eichhörnchen
7
Ihre Antwort ist neugierig und scheint sich selbst zu widersprechen. Sie sagen, Sie sind ein großer Microsoft-Shop, verwenden jedoch kein TFS (was der springende Punkt ist - ohne dieses können Sie die vertikale Integration nicht nutzen) und verwenden ein MSDN-Abonnementmodell, verwenden jedoch ein Nicht-Abonnement -MS Ansatz. Ich bin verloren, um ehrlich zu sein. Nun, leider veraltete Antwort.
nicodemus13
6

Es ist keine große Sache, es ist ziemlich einfach, zwischen ihnen zu wechseln. Die Integration von MSTest ist auch keine große Sache, greifen Sie einfach zu testdriven.net.

Wie die vorherige Person sagte, wählen Sie einen spöttischen Rahmen, mein Favorit im Moment ist Moq.


quelle