3 Stimmen

Unit-Tests für große Anwendungen - Bewährte Methoden?

Ich habe in Windows Forms-Anwendungen und ASP.Net-Anwendungen in den letzten 10 Monaten gearbeitet. Ich habe mich immer gefragt, wie man richtige Unit-Tests auf die gesamte Anwendung in einer robusten Art und Weise für alle Szenarien durchführen. Ich habe die folgenden Fragen zu ihnen -

  • Was sind die Standardmechanismen in Durchführung von Unit-Tests und dem Schreiben von Testfällen?
  • Ändern sich die Methoden aufgrund je nach Art der Anwendung, z. B. Windows Forms, Webanwendungen usw.?
  • Was ist der beste Ansatz, um die um sicherzustellen, dass wir alle Szenarien abdecken? Gibt es beliebte Bücher zu diesem Thema?
  • Beliebte Tools für die Durchführung der Einheit Tests?

3voto

Péter Török Punkte 111735

Ich empfehle ein sehr gutes Buch zu diesem Thema: Effizientes Arbeiten mit altem Code von Michael Feathers. Ich fand es sehr nützlich für ähnliche Altprojekte.

Das Hauptproblem bei Legacy-Code ist, dass es keine "Standard"-Methode für Unit-Tests gibt :-( Der "Standard" Test Driven Development wurde für neue Projekte erfunden, bei denen man mit dem Schreiben von Code - und Unit-Tests - von Grund auf anfängt, so dass man seine Unit-Test-Suite vom ersten Tag an zusammen mit dem Code wachsen lassen kann und alle (oder die meisten) Teile des Codes immer abgedeckt bleiben.

Die Realität sieht jedoch so aus, dass die meisten Projekte im wirklichen Leben Legacy-Code ohne einen einzigen Unit-Test beinhalten (Feathers' Definition von Legacy-Code ist "Code ohne Unit-Tests"). Dieses Buch ist voll von nützlichen Ratschlägen, was zu tun ist, wenn Sie Code anfassen müssen, den Sie kaum verstehen, oder eine Monstermethode von 1000 Zeilen ändern und sicherstellen müssen, dass zumindest Ihre Änderung ordnungsgemäß unitgetestet wird. In solchen Fällen ist es in der Regel sehr schwierig, Unit-Tests zu schreiben, weil der Code nicht für das Testen konzipiert wurde. Also muss man ihn oft umstrukturieren, um ihn testbar zu machen, aber ohne Unit-Tests ist das natürlich riskant... Dennoch gibt es Wege aus solchen Fallen, und dieses Buch zeigt sie.

Im Allgemeinen sollten Sie nicht mit dem Ziel beginnen, die gesamte Codebasis abzudecken (es sei denn, Sie haben einen Projektleiter, der bereit ist, zu akzeptieren, dass Sie in den nächsten Monaten - oder Jahren ;-) keine neuen Funktionen entwickeln werden. Sie haben nur eine begrenzte Zeit, um den größtmöglichen Nutzen aus Ihren Unit-Tests zu ziehen. Daher müssen Sie sich zuerst auf die kritischsten Teile des Codes konzentrieren. Dies sind in der Regel die Teile, die am häufigsten geändert werden und/oder in denen die meisten Fehler gefunden werden (natürlich gibt es da einen Zusammenhang). Vielleicht wissen Sie auch schon im Voraus, dass eine bevorstehende Funktion die Erweiterung eines bestimmten Teils des Codes erfordert, so dass Sie den Weg dafür bereiten können, indem Sie Unit-Tests dafür erstellen. Auf diese Weise entstehen mit der Zeit kleine "Sicherheitsinseln" innerhalb des Codes, die immer besser mit Unit-Tests abgedeckt werden. Wartung und Refactoring sind an diesen Stellen einfacher, und je mehr Unit-Tests Sie hinzufügen, desto größer werden die Inseln...

Beachten Sie, dass diese "sicheren Inseln" anfangs kein sehr "systematisches" Muster des Auftretens aufweisen. Die kritischsten, am häufigsten geänderten Teile des Codes sind in der Regel ziemlich zufällig verteilt. Erst in einem viel späteren Stadium, wenn die unitgetesteten Inseln zu wachsen beginnen und zusammenwachsen, lohnt es sich, ein bestimmtes Modul systematischer abzudecken. Wenn Sie z. B. sehen, dass in diesem bestimmten Modul die Codeabdeckung durch Unit-Tests auf über 60 % angewachsen ist, können Sie beschließen, es durchzugehen und auch für die übrigen Codeteile Tests hinzuzufügen.

1voto

Chris Punkte 25589

Sie müssen Unit-Tests schreiben, die Objekte und Funktionen innerhalb Ihres Programms testen. Das heißt, Sie müssen jede Funktion innerhalb einer Klasse testen, dann die Klassenfunktionalität als Ganzes und dann die Funktionalität innerhalb von Bibliotheken. Im Wesentlichen schreiben Sie Tests für jede Ebene der Anwendung, von den Bibliotheken der obersten Ebene bis zu den Funktionen. Dadurch wird sichergestellt, dass bei Änderungen an JEDEM Code die Anwendung wie erwartet funktioniert.

NUnit ist ein beliebtes Unit-Testing-Framework, aber VS bietet Ihnen standardmäßig eingebaute Unit-Tests (möglicherweise nur VS2008, aber ziemlich sicher VS2005 tut auch)

Man kann nicht JEDES Szenario abdecken, aber man kann die wichtigsten Szenarien abdecken, die normalerweise in Ordnung sind, da man weiß, welche Ausgabe erwartet wird, und gegen diese testen kann.

1voto

Ty. Punkte 3768

Was sind die Standardmechanismen bei der Durchführung von Unit-Tests und der Erstellung von Testfällen? Es gibt viele .NET-Test-Frameworks. Ich würde Ihnen empfehlen, NUnit oder MbUnit zu verwenden.

http://www.nunit.org/

http://www.mbunit.com/

MbUnit wird mit einem Test-Runner kommen, so dass die Dinge einfacher machen könnte. Ich bevorzuge einen integrierten Ansatz, bei dem ich alle meine Tests direkt von Visual Studio aus ausführen kann, aber das erfordert einige umfangreiche Einstellungen. Wenn Sie einen Test-Runner verwenden (wie Gallio, das mit MbUnit geliefert wird), werden Sie Ihre Unit-Tests außerhalb Ihres Visual Studio-Projekts ausführen. Die Unit-Tests selbst sollten sich in einem eigenen Projekt befinden, im Allgemeinen in der Form Fixture. Die darin enthaltenen Tests können in verschiedenen Stilen benannt werden, aber der Schlüssel ist, so beschreibend wie möglich zu sein. Zum Beispiel:

void when_my_class_is_sent_a_user_it_should_save_it()

Auch beliebt

[MethodName_StateUnderTest_ExpectedBehavior]

Ändern sich die Methoden je nach Art der Anwendung, z. B. Windows Forms, Webanwendungen usw.? Die Methodik ändert sich je nach Art der Anwendung. Glücklicherweise sind Webformulare und Winformulare sehr ähnlich. Leider wurden sie beide ohne Berücksichtigung von Tests entwickelt und neigen zu Code, der schwer zu testen ist.

Wie können wir am besten sicherstellen, dass wir alle Szenarien abdecken? Testgetriebenes Design (Sie schreiben die Tests und dann den Code, damit sie funktionieren). Auch die Codeabdeckung kann eine hilfreiche Metrik sein.

Gibt es populäre Bücher zu diesem Thema? Die Kunst des Unit-Testens: Mit Beispielen in .Net von Roy Osherove Pragmatische Unit-Tests in C# mit NUnit

Beliebte Tools für die Durchführung von Unit-Tests? Wie bereits erwähnt, sind NUnit und MbUnit. Es gibt auch MSTest (kommt gebündelt mit VS2008), xUnit und einige andere. Stongly empfehlen Sie gehen mit NUnit oder MbUnit aber.

0voto

Mark Seemann Punkte 216836

Wenn Sie bereits seit 10 Monaten eine Anwendung entwickeln, ist es sehr unwahrscheinlich, dass Sie überhaupt in der Lage sind, Unit-Tests durchzuführen, da Unit-Tests per Definition immer nur eine Einheit (Klasse oder sogar Methode) auf einmal testen.

Zu diesem Zeitpunkt wäre es besser, automatisierte Abnahmeprüfungen unter Verwendung von Werkzeugen wie FitNesse o Geschichtenerzähler .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X