Best Practices für Unit-Tests für einen Unit-Test-Neuling


29

In den letzten Jahren habe ich nur kleine Komponenten für Personen in größeren Projekten oder kleine Werkzeuge geschrieben. Ich habe noch nie einen Komponententest geschrieben und es scheint immer so, als ob ich lerne, wie man sie schreibt, und es dauert viel länger, einen zu machen, als das Programm einfach zu starten und für echt zu testen.

Ich bin gerade dabei, ein ziemlich umfangreiches Projekt zu starten, das einige Monate in Anspruch nehmen könnte, und während ich versuche, Elemente zu testen, während ich sie schreibe (wie immer), frage ich mich, ob ich durch Unit-Tests Zeit sparen kann.

Ich habe mich nur gefragt, ob jemand einen guten Rat geben könnte:

  1. Sollte ich mich zu Beginn des Projekts mit Unit-Tests befassen und möglicherweise einen TDD-Ansatz verfolgen?
  2. Soll ich nur Tests schreiben, nachdem jeder Abschnitt abgeschlossen ist?
  3. Soll ich das Projekt abschließen und dann am Ende Unit-Tests schreiben.



Antworten:


29

Einige werden etwas anderes sagen, aber ich würde vorschlagen, dass Sie TDD und Unit Testing trennen. TDD ist eine ziemliche mentale Verschiebung und Unit-Tests scheinen anfangs Zeit in Anspruch zu nehmen. Wenn Sie sie als einen Gegenstand betrachten, besteht die Gefahr, dass Sie nicht sofort genug Nutzen sehen, und es besteht die Versuchung, TDD und Unit Testing einfach damit fallen zu lassen.

Als erstes schreiben Sie einige Unit Tests. Sie müssen zunächst nicht perfekt sein. Lernen Sie einfach, wie Sie kleine Codeeinheiten testen und wie Sie Komponenten mithilfe von Verspottungen isolieren.

Dies ist der größte Zeitnehmer, hat aber bei weitem die größte Auszahlung. Sobald Sie bemerken, dass Sie nicht mehr durch 14 Webseiten blättern müssen, um zu der zu gelangen, die Sie testen möchten, wissen Sie, wovon ich spreche.

Für mich war der große Moment bei Eureka eine Windows-App, in der ich versuchte, einen regulären Ausdruck zu testen, für den ich zwei Formulare ausfüllen musste, bevor ich darauf zugreifen konnte. Ich habe NUnit installiert, einen Test für diese Methode geschrieben und festgestellt, wie schnell ich Stunden Testzeit gespart habe. Dann habe ich weitere Tests hinzugefügt, um die Randfälle zu behandeln. Und so weiter.

Dann lerne Unit Tests gut zu schreiben. Lernen Sie die Balance zwischen spröden Tests, die schnell zu schreiben sind, und vielen, vielen Einzeltests. Das ist ziemlich einfach. Im Idealfall testet jeder Test nur eine Sache, aber Sie lernen schnell, wie lange dies dauert, und beginnen, ein wenig über die Regel nachzudenken, bis Sie einen Test schreiben, der bei jeder Codeänderung abbricht. Dann kehren Sie zum richtigen Gleichgewicht zurück (die näher an der ersteren als der letzteren ist).

TDD ist, wie gesagt, eine große mentale Veränderung in Ihrer Arbeitsweise. Es wird jedoch nicht viel Zeit für Ihren Entwicklungsprozess bedeuten, wenn Sie ohnehin bereits Tests schreiben. Und ich verspreche, Sie werden sehen, wie sich Ihr Codierungsstil vor Ihren Augen verbessert. Oder besser gesagt, wenn Sie es nicht fallen lassen, ist es nichts für Sie.

Als letztes ist zu beachten, dass TDD nicht auf Unit-Tests beschränkt ist. Akzeptanztestgetriebenes Design ist Teil von TDD. Ein weiterer guter Grund, sie nicht durcheinander zu bringen.


+1 Danke - Ich lasse es für eine Weile offen, falls andere Antworten vorliegen, aber ich denke, dieses Projekt wird aus dem gleichen Grund mein Wendepunkt sein - mehrere Webseiten und es wird viel länger dauern, um es manuell zu testen.
Wilhil

@pdr Hast du einige Referenzen, die ich zum Thema "Unit Tests gut schreiben" lesen kann?
Gaston

9

Ich stimme den anderen zu (schreibe definitiv nicht deine Tests am Ende, TDD braucht Zeit zum Lernen, beginne mit dem Testen, wie du kannst, und strebe schließlich eine vollständige TDD an). Als Antwort auf Ihren Kommentar wollte ich jedoch eines hinzufügen: "Ich frage mich, ob ich durch Unit-Tests Zeit sparen kann."

Meine Antwort ist ein eindeutiges Ja. Ich habe den TDD-Ansatz vor ca. 10 Jahren nach einer ähnlichen Zeitspanne ohne Tests gelernt. Heutzutage, wenn ich etwas Kurzes (<250 loc) und Einfaches mache oder etwas Wegwerfbares, dann werde ich es nicht TDD. Ansonsten tue ich das und gerade weil es Zeit spart.

Es gibt drei Möglichkeiten, Zeit zu sparen: weniger WTF, weniger Debugging und weniger Angst. Das erste ist offensichtlich: Sie verbringen viel weniger Zeit damit, sich zu fragen, was zum Teufel das ist, was Sie gebaut haben. Wenn Sie ein Problem haben, ist das Debuggen viel einfacher, da a) Sie getestete Fehler sofort abfangen und b) nicht getestete Fehler weniger versteckte Stellen haben.

Je weniger Angst, desto subtiler. Bis Sie eine Weile in einer TDD-Codebasis verbracht haben, merken Sie nicht einmal, wie viel Zeit Sie damit verbringen, sich Gedanken über Änderungen zu machen, die Sie vornehmen. Funktioniert X? Wird es Y brechen? Gibt es einige Z, die betroffen sein könnten? Mit TDD geht das verloren, weil Sie Ihre Ängste in Tests verwandeln und der Computer dann die Sorgen automatisiert. Ein mutigerer Entwickler ist ein schnellerer Entwickler.


1
+1 für weniger Angst. Und ich habe diese Woche eine testlose Codebasis überarbeitet. . .
Wyatt Barnett

2
Tolles Zitat: "Sie verwandeln Ihre Ängste in Tests, und dann automatisiert der Computer das Sorgen"!
RichVel

5
  1. Sollte ich mir das Gerät zu Beginn ansehen und einen TDD-Ansatz wählen?

  2. Soll ich nur Tests schreiben, wenn ich nach Abschluss jedes Abschnitts vorbeigehe?

Beides, aber nicht die dritte Option .

Wie @pdr feststellte, dauert es einige Zeit, bis man die richtigen Komponententests erlernt hat. Sie möchten sich auf jeden Fall die Zeit nehmen, um zu Beginn des Projektlebenszyklus zu lernen, und nicht gegen Ende, wenn die Frist über Ihrem Kopf liegt. Auf diese Weise sind Sie bereits auf dem neuesten Stand und können sogar damit beginnen, die Vorteile zu nutzen, wenn die Frist näher rückt, da die meisten Fehler bereits zu einem früheren Zeitpunkt im Projektlebenszyklus aufgetreten sind.

Beachten Sie, dass der allererste Komponententest immer der schwierigste ist, insbesondere wenn Sie bereits geschriebenen Code testen. Solch ein Code ist möglicherweise nicht für den Komponententest geeignet, daher kann es schwierig sein, alle Objekte mit dem richtigen Status für den Test zu verkabeln. Wählen Sie daher für Ihre ersten Unit-Test-Versuche einen einfachen, ziemlich isolierten Low-Level-Test aus, und erhöhen Sie dann nach und nach das Herausforderungsniveau. Sobald Sie die erste Testvorrichtung fertig haben, ist der nächste Testfall viel einfacher, und bis zum vierten Testfall werden Sie Testfälle wie auf einem Förderband produzieren. Das ist der Moment, in dem Sie die Güte spüren, wiederholt nachweisen zu können , dass Ihr Code funktioniert ...

Ich persönlich bevorzuge den TDD-Ansatz, und ich glaube nicht, dass er so herausfordernd ist - er erfordert Ausdauer, aber ich glaube, je früher Sie mit TDD beginnen, desto eher werden Sie die Vorteile von Einheitentests insgesamt erkennen. Es kann jedoch sein, dass die ersten Unit-Tests für Code, den Sie bereits haben, besser zu schreiben sind. Sobald Sie den Dreh raus haben, können Sie mit TDD experimentieren.


Ich denke, ich werde mich für die zweite Option entscheiden, basierend auf Ihren und PDRs Ratschlägen - für Option drei meinte ich wirklich, ich würde manuelle Tests durchführen und am Ende nur einen Test schreiben, um sicherzustellen, dass alles so ist, wie es sein sollte und soll Testen Sie, ob in Zukunft Änderungen vorgenommen wurden.
Wilhil

2

Ich denke, das Beste, was ein Neuling tun kann, ist, einige Code-Katas in Angriff zu nehmen, die sich für Unit-Tests eignen. Beispielsweise; Überprüfung einer E-Mail-Adresse. TDD wird zum natürlichen Fluss, sobald Sie einige dieser Code Katas in Angriff genommen haben. Schauen Sie sich die folgende Code-Kata für den von mir erwähnten E-Mail -Adress-Validator an: E-Mail-Validator

Eine Erklärung, was Code Katas für diejenigen unter Ihnen ist, die es nicht wissen, finden Sie unter folgendem Link: Code Katas

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.