43 Stimmen

Wie beginnt man mit Unit-Tests oder TDD?

Ich habe viele Beiträge gelesen, die mich davon überzeugt haben, dass ich anfangen sollte, Unit-Tests zu schreiben. Ich habe auch angefangen, Dependency Injection (Unity) zu verwenden, um das Mocking zu vereinfachen, aber ich bin mir immer noch nicht ganz sicher, auf welcher Stufe ich anfangen sollte, die Unit-Tests und Mocks zu schreiben, und wie oder wo ich anfangen soll.

Wäre es besser, die Unit-Tests vor den Methoden zu schreiben, wie in der TDD-Methodik beschrieben?

Gibt es eine andere Methodik oder Vorgehensweise für Unit-Tests?

2 Stimmen

Versuchen Sie, diesen Artikel zu lesen: blog.codeville.net/2009/08/24/

2 Stimmen

Wenn Sie in C# sind, dann geben Sie das Geld aus und holen Sie sich eine Kopie von Resharper. Es ändert die ganze Erfahrung.

0 Stimmen

@Kane Ich glaube, die URL ändert sich in blog.stevensanderson.com/2009/08/24/

33voto

Mark Simpson Punkte 22759

Erst testen / dann testen:

Es sollte beachtet werden, dass "Test first" als Teil von TDD genauso viel (wenn nicht mehr) mit Design zu tun hat wie mit Unit-Tests. Es ist eine eigenständige Softwareentwicklungstechnik - das Schreiben der Tests führt zu einer ständigen Verfeinerung des Designs.

Auf einer separaten Anmerkung: Wenn es einen bedeutenden Vorteil zu TDD aus einer reinen Unit-Testing-Perspektive gibt, ist es, dass es viel schwieriger (wenn auch nicht unmöglich) ist, einen Test zu schreiben, der falsch ist, wenn man TDD macht. Wenn Sie den Test im Voraus schreiben, sollte er immer fehlschlagen, weil die zum Bestehen des Tests erforderliche Logik noch nicht existiert. Wenn Sie den Test nachträglich schreiben, wird die Logik sollte vorhanden sein, aber wenn der Test fehlerhaft ist oder das Falsche testet, kann er trotzdem bestehen.

Wenn Sie also vorher einen schlechten Test schreiben, kann es sein, dass Sie ein grünes Licht bekommen, obwohl Sie ein rotes erwarten (Sie wissen also, dass der Test schlecht ist). Wenn Sie danach einen schlechten Test schreiben, erhalten Sie ein grünes Licht, obwohl Sie ein grünes erwartet haben (ohne zu wissen, dass der Test schlecht ist).

Bücher

Das pragmatische Unit-Testing-Buch ist einen Blick wert, ebenso wie Roy Osheroves "The Art of Unit Testing". Das pragmatische Buch ist enger auf die verschiedenen Arten von Testeingaben fokussiert, die Sie versuchen können, um Fehler zu finden, wohingegen TAOUT ein breiteres Spektrum an Themen abdeckt, wie z.B. Testdopplungen, Strategien, Wartbarkeit usw. Beide Bücher sind gut; es kommt darauf an, was Sie von ihnen erwarten.

Außerdem ist hier ein Link zu einem Vortrag von Roy Osherove über Einheitstests . Es lohnt sich, den Film anzuschauen (ebenso wie einige der von ihm aufgezeichneten Testvideos, in denen er auf verschiedene Probleme und Do's/Don'ts sowie auf die Gründe dafür hinweist).

Wie man beginnt

Es gibt nichts Besseres als Code zu schreiben. Suchen Sie sich eine recht einfache Klasse, die auf nicht viel anderes verweist. Beginnen Sie dann, einige Tests zu schreiben.

Fragen Sie sich immer: "Was will ich mit diesem Test versuchen und beweisen?", bevor Sie ihn schreiben, und geben Sie ihm dann einen vernünftigen Namen (der in der Regel die aufgerufene Methode, das Szenario und das erwartete Ergebnis beinhaltet, z. B. auf einem Stapel: "Pop WhenStackIsEmpty ThrowsException").

Denken Sie an alle Eingaben, die Sie machen können, an verschiedene Kombinationen von Methoden, die interessante Ergebnisse liefern können, und so weiter.

3 Stimmen

Ich habe versucht, "Die Kunst des Unit-Testens" zu lesen, aber irgendwann wurde mir klar, dass ich darüber lese, wie man einen Code für Unit-Tests schreibt. Aber nicht darüber, wie man versteht, was die Tests sein sollten, wie man versteht, was zu testen ist und wie man testet (aus der Perspektive des "Designs", nicht des Codes). Der gesamte Eindruck beim Lesen war so, als würde ich ein Buch von der Mitte her lesen, so wie: "Lass uns loslegen, hier sind die Mocks". Kein einziges Wort darüber, wie ich auswählen soll, was ich testen will. Ich war so überwältigt, dass ich das Buch frustriert beiseite gelegt habe. Jetzt habe ich das Gefühl, dass ich TDD lernen muss, aber ich weiß, dass ich "TAOUT" nicht mehr öffnen werde.

14voto

Ty. Punkte 3768

Wenn Sie neugierig auf Unit-Tests sind, lernen Sie sie am besten, indem Sie sie ausprobieren. Wahrscheinlich werden Sie zunächst Integrationstests schreiben, aber das ist in Ordnung. Wenn sie Ihnen zu schwierig oder zu arbeitsaufwändig erscheinen, lesen Sie mehr über die verschiedenen Arten von Tests (Unit-, Funktions- und Integrationstests) und versuchen Sie, den Unterschied zu erkennen.

Wenn Sie daran interessiert sind, mit TDD zu beginnen, ist Uncle Bob eine gute Quelle. Partikulär diese .

Mehr über Unit-Tests

Stellen Sie sicher, dass Sie konsistente Testergebnisse erhalten. Die wiederholte Durchführung desselben Tests sollte stets zu denselben Ergebnissen führen.

Die Tests sollten keine Konfiguration erfordern.

Die Reihenfolge der Tests sollte keine Rolle spielen. Das bedeutet, dass partielle Testläufe korrekt funktionieren können. Wenn Sie diese Entwurfsphilosophie im Hinterkopf behalten, wird sie Ihnen wahrscheinlich bei der Erstellung von Tests helfen.

Denken Sie daran, dass jede Prüfung besser ist als keine Prüfung. Die Schwierigkeit besteht darin, gute, saubere Einheitstests zu schreiben, die die Erstellung und Wartung erleichtern. Je schwieriger der Testrahmen ist, desto größer ist die Ablehnung, ihn einzusetzen. Testen ist Ihr Freund.

10voto

Theo Lenndorff Punkte 4438

In C# und mit Visual Studio finde ich folgende Vorgehensweise sehr hilfreich:

  1. Denken! Machen Sie einen kleinen Entwurf im Voraus. Sie müssen ein klares Bild davon haben, welche Klassen Sie brauchen und wie die Objekte zueinander in Beziehung stehen sollen. Konzentrieren Sie sich nur auf eine Klasse/ein Objekt (die Klasse/das Objekt, das Sie implementieren wollen) und eine Beziehung. Andernfalls entsteht ein zu schwerfälliger Entwurf. Ich habe oft mehrere Skizzen (nur ein paar Kästchen und Pfeile) auf einem freien Blatt Papier.

  2. Erstellen Sie die Klasse im Produktionscode und benennen Sie sie entsprechend.

  3. Wählen Sie eine Verhaltensweise der Klasse, die Sie implementieren möchten, und erstellen Sie einen Methoden-Stub für diese. Mit Visual Studio ist das Erstellen leerer Methoden-Stubs ein Kinderspiel.

  4. Schreiben Sie einen Test dafür. Dazu müssen Sie das Objekt initialisieren, die Methode aufrufen und eine Assert erstellen, um das Ergebnis zu überprüfen. Im einfachsten Fall erfordert die Behauptung einen weiteren Methoden-Stub oder eine Eigenschaft im Produktionscode.

  5. Kompilieren Sie und lassen Sie sich vom Test Runner den roten Balken zeigen!

  6. Codieren Sie das erforderliche Verhalten im Produktionscode, damit der grüne Balken erscheint.

  7. Gehen Sie zum nächsten Verhalten über.

Bei diesem Verfahren sind zwei Dinge sehr wichtig:

  • Sie brauchen eine klare Vorstellung davon, was Sie wollen und wie die Klasse/das Objekt aussehen soll. Verbringen Sie zumindest einige Zeit damit.
  • Denken Sie über die Verhaltensweisen der Klasse/des Objekts nach. Dadurch werden die Tests und der Produktionscode verhaltensorientiert, was ein sehr natürlicher Ansatz ist, um über Klassen/Objekte nachzudenken.

Erst testen oder nicht testen?

Ich finde es in der Regel schwieriger, Tests in bestehenden Produktionscode einzubauen. In den meisten Fällen ist dies auf verworrene Abhängigkeiten zu anderen Objekten zurückzuführen, wenn das zu testende Objekt initialisiert werden muss. TDD vermeidet dies in der Regel, da man das Objekt in den Testfällen mit möglichst wenig Aufwand initialisieren möchte. Dies führt zu einer sehr losen Kopplung.

Wenn ich Tests nachrüste, ist die mühsamste Aufgabe die Initialisierung des zu testenden Objekts. Auch die Assertions können aufgrund von verworrenen Abhängigkeiten viel Arbeit machen. Hierfür müssen Sie den Produktionscode ändern und Abhängigkeiten aufbrechen. Durch den richtigen Einsatz von Dependency Injection sollte dies kein Problem darstellen.

0 Stimmen

Hervorragend...sehr hilfreich...Danke.

0 Stimmen

Diese Antwort kann mit minimalem Aufwand auf alle Sprachen übertragen werden - machen Sie einfach kleine Anmerkungen zu Visual Studio / C# an den entsprechenden Stellen

7voto

Fredrik Mörk Punkte 151006

はい。 bevorzugt TDD besteht darin, den Test zuerst zu schreiben (wie der Name schon sagt). Testgetriebene Entwicklung ). Wenn man mit TDD anfängt, kann es schwierig sein zu wissen, wo man mit dem Schreiben der Tests beginnen soll, daher würde ich vorschlagen, pragmatisch vorzugehen. Schließlich besteht der wichtigste Teil unserer Arbeit darin, funktionierenden Code zu liefern, und nicht so sehr darin, wie der Code erstellt wurde.

Sie können also damit beginnen, Tests für vorhandenen Code zu schreiben. Wenn Sie erst einmal herausgefunden haben, wie die Unit-Tests strukturiert sind, welche Tests gut funktionieren und welche weniger gut, dann wird es Ihnen leichter fallen, sich mehr auf den Test-First-Ansatz einzulassen. Ich habe festgestellt, dass ich im Laufe der Zeit immer mehr Tests zuerst schreibe. Mit zunehmender Erfahrung wird es einfach natürlicher.

13 Stimmen

Eigentlich würde ich davon abraten, zuerst Tests für bestehenden Code zu schreiben, wenn man TDD lernen will. Das Schreiben von Tests für bestehenden Code (der keine Tests hat) ist oft viel schwieriger (da er nicht mit Blick auf Testbarkeit geschrieben wurde) als das Schreiben von Tests für komplett neuen Code. Sobald Sie TDD für neuen Code beherrschen, sind Sie gut darauf vorbereitet, alten Code ohne Tests zu übernehmen.

2 Stimmen

@Cellfish: Ich stimme zu, dass es schwieriger sein kann, gute Tests für bestehenden Code zu schreiben, aber es kann Ihnen einen klaren Ausgangspunkt geben, und Sie werden eine Menge Wissen darüber gewinnen, wie Sie Ihren zukünftigen Code und Unit-Tests strukturieren können. Es ist wie damals, als die Leute (vor dem digitalen Zeitalter) einem Fotografenanfänger rieten, welche Kamera er sich zulegen sollte: Einige rieten zu einer voll mechanischen Kamera und lernten alles über Verschlusszeit und Blendenwerte; dann hast du die volle Kontrolle", während andere sagten: Nimm eine vollautomatische Kamera und konzentriere dich auf die Bilder". Beide Ratschläge haben funktioniert, aber für unterschiedliche Menschen.

0 Stimmen

Ich lerne gerade TDD und versuche es deshalb mit einem laufenden Projekt. Ich überarbeite den Code, um Unit-Tests zu unterstützen und schreibe sie nach und nach. Für die neuen Funktionen der Projekte erstelle ich Tests und schreibe dann die Logik.

5voto

TJB Punkte 13149

Steve Sanderson hat einen großartigen Bericht über TDD Best Practices.

http://feeds.codeville.net/~r/SteveCodeville/~3/DWmOM3O0M2s/

Auch gibt es eine große Reihe von Tutorials für die Durchführung eines ASP.net MVC-Projekt, dass eine Menge TDD Prinzipien diskutiert (wenn Sie nichts dagegen haben, lernen ASP.net MVC auf dem Weg) http://www.asp.net/learn/mvc-videos/ Achten Sie auf die Serie "Schaufenster" am Ende der Seite.

MOQ scheint in letzter Zeit das angesagte Mocking-Framework zu sein, das sollten Sie vielleicht auch in Betracht ziehen

Zusammenfassend lässt sich sagen, dass Sie versuchen sollten, einen Test zu schreiben, um etwas zu validieren, das Sie zu archivieren versuchen, und dann den Code zu implementieren, damit es funktioniert.

Das Muster ist bekannt als Rot - Grün - Refactor. Bemühen Sie sich auch, Abhängigkeiten zu minimieren, damit sich Ihre Tests auf eine Komponente konzentrieren können.

Ich persönlich verwende Visual Studio Unit Tests. Ich bin kein Hardcore-TDD-Entwickler, aber was ich gerne tue, ist dies:

  1. Erstellen Sie ein neues Projekt und definieren Sie einige der grundlegenden Klassen auf der Grundlage des Systementwurfs (auf diese Weise kann ich zumindest etwas Intellisense erhalten)
  2. ein Unit-Tests-Projekt erstellen und mit dem Schreiben von Unit-Tests beginnen, um die Funktionalität zu erfüllen, die ich zu implementieren versuche.
  3. Lass sie scheitern
  4. Lassen Sie sie passieren (umsetzen)
  5. Refactor
  6. Ich wiederhole, versuche, den Test strenger zu gestalten oder weitere Tests zu erstellen, bis ich das Gefühl habe, dass er solide ist.

Ich denke auch, dass es sehr nützlich ist, Funktionen zu einer bestehenden Codebasis hinzuzufügen. Wenn Sie eine neue Funktion hinzufügen möchten, erstellen Sie zunächst den Unit-Test für das, was Sie hinzufügen möchten, gehen Sie den Code durch, um zu sehen, was Sie ändern müssen, und führen Sie dann den TDD-Prozess durch.

0 Stimmen

Danke @TJB, ich bin ziemlich vertraut mit ASP.NET MVC, ich habe das Oxite-Projekt heruntergeladen, das ein bisschen kompliziert zu sein scheint und Injektionsabhängigkeit und Unit-Tests verwendet. Ist das ein gutes Beispiel für das Lernen?

0 Stimmen

Ich habe die Oxite-Quelle nicht überprüft, aber es ist nur so, dass MVC sich für TDD eignet und dass die "Storefront"-Videoserie einen Entwickler beinhaltet, der durch ein komplettes Projekt mit einer TDD-Perspektive geht. Rob Conery behauptet, dass er so ziemlich lernt, wie man TDD wirklich anwendet, also lehnt er sich an die besten Praktiken an, was praktisch ist und wann man Kompromisse eingehen kann. Für mich, ich benutze nur Visual Studio Testprojekte als meine Plattform. Ich empfehle die Sanderson Artikel, prägnant und große Punkte.

0 Stimmen

Witzig, dass Sie Rob erwähnen. Oxite wurde/wird als völliger Fehlschlag betrachtet, was Musteranwendungen angeht. Rob wurde in das Projekt geholt, um zu versuchen, die Dinge zu verbessern. Ich glaube nicht, dass er seine Aufgabe erfüllt hat, aber lesen Sie selbst seine Gedanken dazu. blog.wekeroad.com/blog/some-thoughts-on-oxite

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