Mache ich es richtig? Wenn nicht was genau muss ich ändern
Es ist schwer zu sagen, nur aus dieser kurzen Beschreibung, aber ich vermute, dass Sie es nicht richtig machen. Hinweis: Ich sage nicht, dass das, was Sie tun, nicht funktioniert oder in irgendeiner Weise schlecht ist, aber Sie tun kein TDD. Das mittlere "D" bedeutet "Driven", die Tests steuern alles, den Entwicklungsprozess, den Code, das Design, die Architektur, alles .
In den Tests erfahren Sie, was Sie schreiben müssen, wann Sie es schreiben müssen, was Sie als Nächstes schreiben müssen und wann Sie mit dem Schreiben aufhören müssen. Sie erzählen Ihnen das Design und die Architektur. (Design und Architektur ergeben sich aus dem Code durch Refactoring.) Bei TDD geht es nicht um Tests. Es geht nicht einmal darum, zuerst Tests zu schreiben: Bei TDD geht es darum, dass die Tests Sie fahren lassen. Das Schreiben zuerst ist nur eine notwendige Voraussetzung dafür.
Es spielt keine Rolle, ob Sie den Code tatsächlich aufschreiben oder vollständig ausarbeiten: Sie schreiben (Skelette von) Code in Ihren Kopf und schreiben dann Tests für diesen Code. Das ist kein TDD.
Diese Angewohnheit loszulassen ist schwer . Wirklich sehr, sehr schwer. Für erfahrene Programmierer scheint es besonders schwierig zu sein.
Keith Braithwaite hat eine Übung erstellt, die er TDD nennt, als ob Sie es beabsichtigen . 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 Instruktor.
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
In der Regel führt dies zu sehr unterschiedlichen Designs als die häufig praktizierte "Pseudo-TDD-Methode", bei der Sie sich vorstellen, wie das Design aussehen soll. Schreiben Sie dann Tests, um dieses Design zu erzwingen, und implementieren Sie das Design, das Sie sich bereits vorgestellt haben, bevor Sie Ihr Design schreiben Tests ".
Wenn eine Gruppe von Leuten so etwas wie ein Tic Tac Toe-Spiel mit Pseudo-TDD implementiert, erhalten sie normalerweise sehr ähnliche Designs, die eine Art Board
Klasse mit einem 3 × 3-Array von Integer
s beinhalten. Und zumindest ein Teil der Programmierer wird diese Klasse tatsächlich ohne Tests dafür geschrieben haben, weil sie "wissen, dass sie es brauchen werden" oder "etwas brauchen, gegen das sie ihre Tests schreiben können". Wenn Sie jedoch dieselbe Gruppe dazu zwingen, TDD anzuwenden, als ob Sie es beabsichtigen, ergeben sich häufig eine große Vielfalt sehr unterschiedlicher Entwürfe, die häufig nichts verwenden, was auch nur annähernd a ähnelt Board
.
Können Sie feststellen, ob der von Ihnen geschriebene Test ausreicht?
Wenn sie alle geschäftlichen Anforderungen abdecken. Tests sind eine Kodierung der Systemanforderungen.
Ist es empfehlenswert, Tests für sehr einfache Funktionen zu schreiben, die 1 + 1 = 2 entsprechen könnten, oder handelt es sich nur um ein Übermaß?
Wieder haben Sie es rückwärts: Sie schreiben keine Tests für die Funktionalität. Sie schreiben Funktionen für Tests. Wenn sich herausstellt, dass die Funktionalität, um den Test zu bestehen, trivial ist, ist das großartig! Sie haben gerade eine Systemanforderung erfüllt und mussten nicht einmal hart dafür arbeiten!
Ist es gut, die Funktionalität zu ändern und entsprechend zu testen, ob sich die Anforderung ändert?
Nein, anders herum. Wenn sich eine Anforderung ändert, ändern Sie den Test, der dieser Anforderung entspricht. Beobachten Sie, wie er fehlschlägt, und ändern Sie dann den Code, damit er erfolgreich ist. Die Tests stehen immer an erster Stelle.
Das ist schwer zu machen. Sie brauchen Dutzende, vielleicht Hunderte von Stunden absichtlichen Übens , um eine Art "Muskelgedächtnis" aufzubauen, um zu einem Punkt zu gelangen, an dem Sie, wenn die Frist abläuft und Sie unter Druck stehen, nicht einmal mehr darüber nachdenken müssen und dies zu tun wird die schnellste und natürlichste Art zu arbeiten.