Sollte ich meine Komponententests überarbeiten, wenn ich eine Klasse aus dem getesteten System extrahiere?

13

Ich habe diese Klasse geschrieben, die einige Dinge tut (vielleicht ist dies ein Verstoß gegen das Prinzip der Einzelverantwortung). Mir ist jetzt klar, dass ein anderer Teil des Projekts ein Stück dieser Logik benötigt, und ich werde es aufzeigen, indem ich eine Klasse aus meinem ursprünglichen System im Test extrahiere.

Ich erwarte in der Lage , dies zu tun , ohne dass Testcode ändern zu müssen, aber wenn ich fertig, könnte man argumentieren , dass der Test nicht um eine Einheit mehr Test. Es wird die ursprüngliche Klasse und die Klasse testen, die ich extrahiert habe. Mit anderen Worten, ich habe einen Testfall, aber zwei Systeme im Test.

Soll ich meinen Testcode überarbeiten, nachdem ich fertig bin? IE: Erstellen Sie einen ExtractedClassTest und verschieben Sie alle relevanten Tests von OriginalClassTest hinein? Dies scheint ein wenig riskant zu sein: Ich verliere möglicherweise etwas Deckung, es ist möglicherweise nicht so einfach wie das Verschieben eines Tests, und ich würde am Ende einen Testcode umschreiben, von dem ich weiß, dass er funktioniert, aber möglicherweise nicht mehr. etc.

Wenn ich hingegen den OriginalClassTest unverändert lasse, kann ich sehen, dass dies ein Problem bei der Testwartung ist. Es wird etwas verwirrend sein, herauszufinden, wo sich die ExtractedClass-Tests befinden. Ihr erster Eindruck wird sein, dass es nicht existiert. Im Laufe der Zeit könnte dies bei vielen Refactorings von Seriencode zu einem ernsten Problem werden.

Ich bin neu bei TDD, daher hätte ich gerne einen Expertenrat. Vielen Dank!

Daniel Kaplan
quelle

Antworten:

7

Nachdem ich diesen erstaunlichen Vortrag "Ian Cooper: TDD, wo ist alles schief gelaufen" gesehen habe, werde ich @pdr widersprechen. Ich denke, Sie sollten nur die Originalprüfungen behalten. Ihre Fähigkeit, Ihr zu testendes System umzugestalten, ohne Tests zu unterbrechen, zu schreiben oder zu ändern, ist der Hauptzweck, Tests zu schreiben.

Wenn ich die extrahierte Klasse testen würde, würde ich eher die Implementierung als das Verhalten testen. Infolgedessen wäre mein Code in Zukunft schwieriger umzugestalten: Diese neuen Tests würden wahrscheinlich auch dann fehlschlagen, wenn das Verhalten immer noch funktioniert.

Daniel Kaplan
quelle
6

Für die Dauer der Entwicklung haben beide. Behalten Sie die alten Tests als Garantie dafür, dass Sie nichts kaputt gemacht haben. Schreiben Sie neue Tests (von Grund auf neu), um die Klassen so zu gestalten, wie sie sein sollten.

Führen Sie am Ende alles durch und entfernen Sie alles, was in den alten Tests nicht mehr funktioniert hat. Seien Sie bei dieser Analyse vorsichtig. Entfernen Sie nichts, weil Sie der Meinung sind, dass es nicht mehr funktioniert. Zeigen Sie sich selbst (oder jemand anderem oder einer Gummiente), warum sie nicht mehr benötigt wird. Brechen Sie den Test und stellen Sie sicher, dass ein anderer Test damit bricht.

Alles, was in den alten Tests noch übrig ist, sollte von Fall zu Fall entschieden werden, aber meistens sollten sie in die neue Struktur umgeschrieben werden.

Weil Sie Recht haben, möchten Sie nicht mit einem Wartungs-Albtraum zurückgelassen werden. Sie möchten jedoch nicht weniger Pfadabdeckung als zuvor.

pdr
quelle
1
Ich habe das einfach gemacht und ich muss sagen, dass es ziemlich demotivierend ist. Obwohl meine Änderungen unkompliziert waren, dauerte es ungefähr 2 Stunden, um sicherzustellen, dass ich meine Tests korrekt überarbeitet habe und immer noch die gleiche Abdeckung habe. Es wurde klar, dass ich dem neuen Test ein paar zusätzliche Tests hinzufügen sollte, um sicherzugehen, dass ich die Dinge überprüfe. Ich denke, es wäre effizienter gewesen, die Klasse zu extrahieren und zwei Systeme im Test zu belassen. Bedeutet diese Menge an Arbeit, dass ich die Tests schlecht geschrieben habe?
Daniel Kaplan
1
@tieTYT: Schwer zu beantworten, ohne dich dabei zu beobachten. Manchmal scheint TDD mehr Arbeit zu sein, als es wert ist. Ein anderes Mal wirst du daran erinnert, warum du dich darum gekümmert hast. Und manchmal sind es Sie, die es schwieriger machen. Das Erkennen des Unterschieds ist ein großer Teil der TDD-Kenntnisse.
pdr
Halten Sie es in diesem Fall für möglich, dass ich meine Tests nicht überarbeiten hätte sollen, oder halten Sie das für unwahrscheinlich?
Daniel Kaplan
1
@tieTYT: Unwahrscheinlich, ja. Unmöglich, nein.
pdr