Bedeutet TDDs "Offensichtliche Implementierung" zuerst Code, danach testen?

11

Mein Freund und ich sind relativ neue TDD und haben einen Streit über die "Offensichtliche Implementierung" -Technik (aus "TDD By Example" von Kent Beck). Mein Freund sagt, wenn die Implementierung offensichtlich ist, sollten Sie sie schreiben - vor jedem Test für dieses neue Verhalten. Und tatsächlich sagt das Buch:

Wie implementieren Sie einfache Operationen? Implementieren Sie sie einfach.

Ebenfalls:

Manchmal sind Sie sicher, dass Sie wissen, wie eine Operation implementiert wird. Gehen Sie geradeaus.

Ich denke, der Autor meint, Sie sollten es zuerst testen und dann "nur implementieren" - im Gegensatz zu "Fake It ('Bis Sie es schaffen)" und anderen Techniken, die kleinere Schritte in der Implementierungsphase erfordern. Auch nach diesen Zitaten spricht der Autor davon, "rote Balken" (fehlgeschlagene Tests) zu erhalten, wenn "Offensichtliche Implementierung" durchgeführt wird - wie kann man einen roten Balken ohne Test erhalten?.

Dennoch konnte ich kein Zitat aus dem Buch finden, das besagt, dass "offensichtlich" immer noch Test zuerst bedeutet.

Was denkst du? Sollten wir zuerst oder danach testen, wenn die Implementierung "offensichtlich" ist (laut TDD natürlich)? Kennen Sie ein Buch oder einen Blog-Beitrag, der genau das sagt?

Natasky
quelle
3
Ich stimme Ihrer Interpretation zu. Testen Sie zuerst und "implementieren Sie einfach", wenn das Problem ohne Iterationen leicht zu lösen ist. Aber auf jeden Fall zuerst testen.
Carl Manaster
1
Es ist offensichtlich, dass jeder Code nur getestet werden kann, nachdem er geschrieben wurde ...
ThomasX

Antworten:

11

Ich stimme Ihrer Interpretation zu - es ist immer noch Rot-Grün-Refaktor, nur wenn das Refaktor-Bit weggelassen wird;)

Schreiben Sie also zuerst einen fehlgeschlagenen Test und implementieren Sie dann die offensichtliche Lösung, anstatt langsam ein Design mit dem "einfachsten" zu erstellen.

Oded
quelle
6

Kennen Sie ein Buch oder einen Blog-Beitrag, der genau das sagt?

Ich würde argumentieren, dass Becks Buch genau das sagt.

Er fährt fort zu sagen

Wenn Sie jedoch nur die offensichtliche Implementierung verwenden, fordern Sie Perfektion von sich. Psychologisch kann dies ein verheerender Schritt sein. Was ist, wenn das, was Sie schreiben, nicht wirklich die einfachste Änderung ist, die den Test bestehen könnte? Was ist, wenn Ihr Partner Ihnen einen noch einfacheren zeigt? Du bist ein Versager! Deine Welt bröckelt um dich herum! Du stirbst. Du frierst ein.

Wie können Sie den Test bestehen, indem Sie den Code schreiben, wenn er vor dem Code nicht vorhanden ist?

pdr
quelle
1

Offensichtlich gibt es hier keine festen Regeln, wir waren doch agil, damit wir uns anpassen können und sollten, wenn wir iterieren :)

Teilweise hängt es von der einfachen Bedienung ab, und wenn Sie immer mehr TDD üben, werden Sie regelmäßig Dinge finden, die Sie schlecht oder gar nicht getestet haben. Dies ist alles Teil der Lernkurve.

Vergessen Sie auch nicht, dass Sie mit TDD die Schnittstelle und die Implementierung testen können, bevor Sie sie in Live-Code übertragen.

Sie wissen vielleicht, wie man etwas implementiert, aber wie oft schreiben Sie zum ersten Mal eine perfekte Klasse / Methode usw., ohne dabei einige Änderungen vorzunehmen oder ein- oder zweimal und sechs Monate später den Code durchzugehen, wenn Sie etwas ändern, mit dem Sie dies tun können mehr Vertrauen und wieder in den Sandkasten der Tests.

Tests bedeuten natürlich nicht, dass Sie den Code beim ersten Mal korrekter schreiben, aber Ihre Änderungen werden durch den Test gesteuert und Tests werden zum ersten Client des Codes. Da Tests sehr kostengünstig und vor allem risikofrei sind Sie haben mehr Selbstvertrauen und Freiheit bei der Entwicklung.

Wenn Sie wirklich versuchen, eine gute Abdeckung und eine höhere Qualität zu erzielen, sollten Sie zunächst mehr Tests durchführen. Wenn Sie TDD mehr und mehr üben, entwickeln Sie ein eigenes Gefühl für den Grad der Abdeckung, den Sie benötigen.

Chris Lee
quelle
1

Ich habe gelernt, dass es für trivialen Code überhaupt keine Unittest geben sollte.

Beispiel: Wenn Sie eine Java-Getter / Setter-Methode haben, die eine Methode einer lokalen Variablen zuordnet, wäre ein Unittest dafür ein Overkill.

Vielleicht meint das der Autor damit

> "How do you implement simple operations? Just implement them."
> "Sometimes you are sure you know how to implement an operation. Go ahead."
k3b
quelle