Unit Testing Frameworks - Was sind die wichtigsten Funktionen

8

Ich habe viel über die verfügbaren .NET-Unit-Test-Frameworks gelesen. Was mir nicht klar ist, sind die Hauptmerkmale, die die verfügbaren Frameworks unterscheiden. Was sind die Must-Have-Features, nach denen Sie bei der Evaluierung von Unit-Test-Frameworks Ausschau halten?

    
Jason Irwin 17.08.2009, 16:47
quelle

6 Antworten

1

Ich stimme zu, dass sie alle ziemlich ähnlich sind, wenn es um Behauptungen und andere grundlegende Merkmale geht. Wo sie sich unterscheiden, sind erweiterte Optionen wie Skripting-Frameworks, Build-Tools, automatisierte Integration usw.

Wenn Sie beabsichtigen, einen hochautomatisierten Build-Prozess mit etwas wie CruiseControl.NET mit vielen benutzerdefinierten Build-Optionen und benutzerdefinierten Scryptting auszuführen, würde ich wahrscheinlich NUnit verwenden. Es gibt viel mehr Haken, um andere Aktionen basierend auf den Testergebnissen auszulösen.

Wenn Sie gerade mit Komponententests beginnen und nur grundlegende Integrationstests planen, würde ich bei MStest bleiben, da es eng mit Visual Studio 2008 integriert ist. (NUnit bietet Optionen für die Integration in die IDE, aber die besseren Tools kosten Geld .)

Hier ist eine kleine Vergleichstabelle:

%Vor%     
jellomonkey 17.08.2009, 20:09
quelle
2

Hier sind einige Dinge, nach denen ich suche

  • Geschwindigkeit. Frameworks (und Testläufer) sind nicht alle gleich. Wenn Ihre Einheit Tests verzögert, ist Ihre produktive Zeit verschwendet.
  • Bestätigt. Diese müssen reichlich vorhanden sein, um viele Szenarien zu ermöglichen. Mögen Sie Ausnahmen, die zum Beispiel mit einem Attribut oder einem Assert.Throws abgefangen werden? Sind die Behauptungen in der Lage, numerische Vergleiche mit einer bestimmten Toleranz durchzuführen?
  • Verschiedenes. Nützliche Dinge, die bestimmte Frameworks wie z.B. Row-Tests oder das Einlesen von Testdaten im XML-Format.
Dmitri Nesteruk 17.08.2009 19:44
quelle
2

Die Sache, nach der ich suche, ist Toolset-Unterstützung, wobei meine Priorität Continuous Integration-Unterstützung ist. Der wichtigste Teil von Komponententests (zumindest für mich, der kein großer Fan von TDD ist) besteht darin, sie an meinen CI-Build-Server anzuschließen.

Aus diesem Grund favorisiere ich nUnit, da es in CruiseControl vordefinierte Build-Aufgaben dafür gibt, das ist mein Build-Server der Wahl. Das heißt nicht, dass Sie keine anderen Test-Frameworks in CC stecken können. NUnit ist einfach eine einfache Anwendung.

Was die verfügbaren Funktionen betrifft, hat MSTest einige wirklich nette Add-Ons, wenn Sie es mit dem fantastischen Visual Studio Team System mit TFS im Backend ausführen.

Nachdem all das gesagt wurde, gibt es wirklich keinen großen Unterschied in der Funktionalität der einzelnen Testframeworks (ich habe Erfahrung mit xUnit, nUnit und MSTest) - sie alle erlauben es Unit Tests zu definieren und darüber zu berichten wie mnay bestanden und wie viele fehlgeschlagen. Sie haben alle eine Art GUI, und es ist möglich, sie alle mit Build-Servern zu integrieren.

    
Joon 17.08.2009 19:56
quelle
0

Sie alle machen dasselbe, und wenn sie es nicht tun, haben sie Erweiterungspunkte, was bedeutet, dass Sie dasselbe erreichen können. Und in diesem Sinne können Sie sie anhand derselben Kriterien bewerten, die Sie bei der Auswahl eines Frameworks verwenden (z. B. Beliebtheit (NUnit), MS-Certified (MS-Test) usw.).

Wenn Sie jedoch einen Ratschlag zur Auswahl eines solchen erhalten möchten, schlage ich vor, dass Sie auf der XUnit "Warum haben Sie das gelesen? wir bauen eine xunit " Seite auf, die bestimmte Probleme rund um Unit Testing Frameworks aufzeigt.

Wenn Sie einige Ähnlichkeiten zwischen allen Frameworks sehen möchten, sehen Sie in der Tabelle hier

Natürlich ist die Auswahl eines BDD-Rahmens ein anderer Fischkessel.

    
mcintyre321 17.08.2009 17:05
quelle
0

Eine Sache, die ich in so ziemlich jedem Testing-Framework vermisse, sind uniform assertions , womit ich meine, dass Tests unabhängig von dem, was ich behaupte, gleich aussehen sollten. Ob ich zustandsbasierte Assertionen für einen Wert, verhaltensbasierte Assertions für einen Schein oder die Behauptung mache, dass eine Ausnahme ausgelöst werden sollte.

Ich werde Ruby als Beispiel verwenden, aber das gilt für jede Umgebung. (Und, BTW, Sie sind nicht beschränkt auf C # -Frameworks zum Testen von .NET-Anwendungen, Sie können beliebige .NET-Sprache verwenden, von denen Ruby natürlich eins ist, wie Python, Scheme, F #, ... )

Dies ist test/unit (ein Port einer frühen Version von JUnit) mit Mocha zum Mocking.

%Vor%

Beachten Sie, dass alle Assertionen anders aussehen und sich an einer anderen Stelle befinden. Der eigentliche Testcode befindet sich ebenfalls an drei verschiedenen Stellen.

Und das sind die Erwartungen, die AFAIK ist der einzige Rahmen, der es richtig macht. (Tatsächlich wurde es speziell für den Zweck von einheitlichen Behauptungen erstellt.) Leider wird es nicht länger beibehalten oder unterstützt, da der Autor keine Ruby-Arbeit mehr macht.

%Vor%

Beachten Sie, dass die Assertionen immer gleich aussehen und sowohl die Assertionen als auch der Testcode immer an der gleichen Stelle stehen.

Neuere Frameworks, wie xUnit.Net und Mockito, kommen jedoch definitiv näher.

    
Jörg W Mittag 17.08.2009 21:11
quelle
0

Developer-orientierte Unit-Tests (beachten Sie, dass ich nicht sprechen über Kunden konfrontiert Akzeptanztests!) sind wie Produktionscode: Sie sollten so geschrieben werden, dass es offensichtlich ist, was sie sind tun. In der Tat ist dies für Tests wichtiger als für Produktionscode, denn mit Produktionscode haben Sie die Tests, um Ihnen zu sagen, ob der Code funktioniert oder nicht, mit Tests ist alles, was Sie haben, sie zu lesen und zu sehen, ob sie Sinn machen oder nicht.

Daher sollten Entwickler-Unit-Tests keine Kommentare benötigen. Und Testnamen sind Kommentare, daher sollte Ihr Framework Sie nicht zwingen, Ihre Tests zu benennen.

Hier ist ein Beispiel (in RSpec, das natürlich auch in .NET verwendet werden kann):

%Vor%

Das ist nur dumm. Jeder Entwickler, der einen Testnamen benötigt, um zu verstehen, was dieser Test macht, sollte seine Berufswahl ernsthaft überdenken. Außerdem gelten dieselben Probleme mit Kommentaren: Was passiert, wenn jemand den Test ändert, aber vergisst, den Namen zu ändern? Jetzt ist der Name nicht nur nutzlos, sondern auch irreführend! Das ist viel besser:

%Vor%

RSpec hat einen weiteren raffinierten Trick im Ärmel: Es wird automatisch eine Instanz der Klasse erstellt, die Sie für Sie testen, so dass Sie ClassUnderTest.new.should nicht immer wieder sagen müssen, Sie können einfach sagen should :

%Vor%

Und, BTW, genau wie ein Entwickler herausfinden kann, was das testet, kann RSpec. Dies ist, was es in allen drei Fällen ausspuckt, wenn Sie es für eine kundenlesbare Zusammenfassung der Testsuite fragen:

%Vor%     
Jörg W Mittag 17.08.2009 21:47
quelle

Tags und Links