Ich verstehe die testgetriebene Entwicklung so weit, dass Sie nur dann produktiven Code schreiben dürfen, wenn Sie einen fehlerhaften (roten) Unit-Test haben.
Nein. Sie dürfen nur den einfachsten Code schreiben, um die Meldung des Tests zu ändern. Es sagt nichts über welche Art von Test.
In der Tat werden Sie wahrscheinlich damit beginnen, einen fehlerhaften (roten) Abnahmetest für ein Abnahmekriterium zu schreiben. Genauer gesagt, Sie schreiben den einfachsten Abnahmetest, der möglicherweise fehlschlagen könnte. Anschließend führen Sie den Test aus, beobachten, wie er fehlschlägt, und stellen sicher, dass er aus dem richtigen Grund fehlschlägt. Dann schreiben Sie einen fehlgeschlagenen Funktionstest für einen Teil der Funktionalität dieses Akzeptanzkriteriums. Wieder schreiben Sie den einfachsten Funktionstest, der möglicherweise fehlschlägt. Führen Sie ihn aus, beobachten Sie, wie er fehlschlägt, und überprüfen Sie, ob er aus dem richtigen Grund fehlschlägt. Dann schreiben Sie einen fehlgeschlagenen Komponententest, den einfachsten Komponententest, der möglicherweise fehlschlägt. Führen Sie ihn aus, und beobachten Sie, ob er aus dem richtigen Grund fehlschlägt.
Jetzt schreiben Sie den einfachsten Produktionscode, der möglicherweise die Fehlermeldung ändern könnte. Führen Sie den Test erneut aus, und stellen Sie sicher, dass sich die Fehlermeldung geändert hat, dass sich die Richtung geändert hat und dass der Code die Nachricht aus dem richtigen Grund geändert hat. (Im Idealfall sollte die Fehlermeldung inzwischen verschwunden sein und der Test sollte bestanden werden. Meistens ist es jedoch besser, kleine Schritte zu unternehmen, um die Meldung zu ändern, anstatt zu versuchen, den Test in einem Durchgang zu bestehen. Dies ist der Grund warum Entwickler von Test-Frameworks so viel Aufwand mit ihren Fehlermeldungen betreiben!)
Sobald Sie den Komponententest bestanden haben, überarbeiten Sie Ihren Produktionscode unter dem Schutz Ihrer Tests. (Beachten Sie, dass zu diesem Zeitpunkt der Abnahmetest und der Funktionstest immer noch fehlschlagen, aber das ist in Ordnung, da Sie nur einzelne Einheiten umgestalten, die durch Einheitentests abgedeckt werden.)
Jetzt erstellen Sie den nächsten Komponententest und wiederholen diesen, bis auch der Funktionstest bestanden ist. Unter dem Schutz des Funktionstests können Sie jetzt Refactorings über mehrere Einheiten hinweg durchführen.
Dieser mittlere Zyklus wird nun wiederholt, bis der Abnahmetest erfolgreich abgeschlossen wurde. Anschließend können Sie Refactorings im gesamten System durchführen.
Nun wählen Sie das nächste Akzeptanzkriterium und der äußere Zyklus beginnt erneut.
Kent Beck, der "Entdecker" von TDD (er mag den Begriff "Erfinder" nicht, er sagt, die Leute haben das die ganze Zeit gemacht, er hat ihm nur einen Namen gegeben und ein Buch darüber geschrieben), verwendet eine Analogie aus der Fotografie und nennt dies "Vergrößern und Verkleinern".
Hinweis: Sie benötigen nicht immer drei Teststufen. Vielleicht brauchst du manchmal mehr. Oft brauchen Sie weniger. Wenn Ihre Funktionen klein sind und Ihre Funktionstests schnell sind, können Sie ohne (oder mit weniger Komponententests) auskommen. Häufig benötigen Sie nur Abnahmetests und Unit-Tests. Oder Ihre Akzeptanzkriterien sind so feinkörnig, dass es sich bei Ihren Akzeptanztests um Funktionstests handelt.
Kent Beck sagt, wenn er einen schnellen, kleinen und gezielten Funktionstest hat, schreibt er zuerst die Komponententests, lässt die Komponententests den Code fahren und löscht dann (einige) die Komponententests erneut, die den Code abdecken, der auch ist abgedeckt durch den schnellen Funktionstest. Denken Sie daran: Testcode ist auch Code, der gewartet und überarbeitet werden muss. Je weniger es gibt, desto besser!
Ich frage mich jedoch, ob der testgetriebene Ansatz auch auf andere Testformen angewendet werden kann.
Sie wenden TDD nicht wirklich auf Tests an. Sie wenden es auf Ihren gesamten Entwicklungsprozess an. Das ist es, was der "getriebene" Teil von Test- Driven- Development bedeutet: Ihre gesamte Entwicklung wird von Tests getrieben. Die Tests nicht nur den Code fahren Sie schreiben, sie auch fahren , was Code zu schreiben, neben welchem Code zu schreiben. Sie bestimmen Ihr Design. Sie sagen dir, wann du fertig bist. Sie sagen dir, woran du als nächstes arbeiten sollst. Sie informieren Sie über Designfehler in Ihrem Code (wenn Tests schwer zu schreiben sind).
Keith Braithwaite hat eine Übung erstellt, die er TDD nennt, als ob Sie es gemeint hätten . Es besteht aus einer Reihe von Regeln (basierend auf den drei TDD-Regeln von Onkel Bob Martin , aber viel strenger), die Sie genau befolgen müssen und die Sie dazu bringen sollen, TDD strenger anzuwenden. Es funktioniert am besten mit der Paarprogrammierung (damit Ihr Paar sicherstellen kann, dass Sie nicht gegen die Regeln verstoßen) und einem Lehrer.
Die Regeln sind:
- Schreiben Sie genau einen neuen Test, den kleinsten Test, der in die Richtung einer Lösung weist
- Sieh es scheitern; Kompilierungsfehler gelten als Fehler
- Führen Sie den Test aus (1) durch, indem Sie den niedrigsten Implementierungscode schreiben, den Sie in der Testmethode haben können .
- Refaktor zum Entfernen von Duplikaten und ansonsten nach Bedarf zum Verbessern des Designs. Sei streng mit diesen Zügen:
- Sie möchten eine neue Methode - warten Sie bis zum Refactoring und… erstellen Sie neue (nicht testbezogene) Methoden, indem Sie eine der folgenden Aktionen ausführen, und auf keine andere Weise:
- bevorzugt: Extrahieren Sie die Methode anhand des gemäß (3) erstellten Implementierungscodes, um eine neue Methode in der Testklasse zu erstellen, oder
- wenn Sie müssen: Verschieben Sie den Implementierungscode gemäß (3) in eine vorhandene Implementierungsmethode
- Sie möchten eine neue Klasse - warten Sie bis zum Refactoring, und erstellen Sie dann Nicht-Test-Klassen, um ein Ziel für eine Verschiebungsmethode bereitzustellen, und ohne weiteren Grund
- Füllen Sie Implementierungsklassen mit Methoden, indem Sie Move Method ausführen, und auf keine andere Weise
Diese Regeln sind für die Ausübung von TDD gedacht. Sie sind nicht dafür gedacht, TDD tatsächlich in der Produktion auszuführen (obwohl nichts Sie davon abhält, es auszuprobieren). Sie können sich frustrierend fühlen, weil es manchmal so scheint, als ob Sie Tausende winziger kleiner Schritte machen, ohne wirklich Fortschritte zu machen.