Woher weiß ich, ob ich über eine ausreichende Abdeckung für Komponententests verfüge, um einen Integrationstest zu entfernen?

15

Ich arbeite an einem Legacy-System (damit meine ich, dass es ohne Tests geschrieben wurde). Wir haben versucht, einen Teil des Systems zu testen, indem wir Integrationstests geschrieben haben, die die Funktionalität von außen testen.

Dies gibt mir ein gewisses Vertrauen, Teile des Codes umzugestalten, ohne dass ich mir Sorgen machen muss, dass er kaputt geht. Das Problem ist jedoch, dass diese Integrationstests eine Bereitstellung (mehr als 2 Minuten) und viele Minuten benötigen, um ausgeführt zu werden. Sie sind auch ein Schmerz zu pflegen. Sie decken jeweils Tausende von Codezeilen ab, und wenn eine von ihnen unterbrochen wird, kann das Debuggen des Grunds Stunden dauern.

Ich habe viele Komponententests für diese Funktionsänderungen geschrieben, die ich in letzter Zeit vorgenommen habe, aber bevor ich mich dazu entscheide, führe ich immer eine neue Bereitstellung durch und führe alle Integrationstests aus, um sicherzustellen, dass ich nichts verpasst habe. Zu diesem Zeitpunkt kenne ich meine Komponententests und einige der Integrationstests überlappen sich mit dem, was sie testen.

Woher weiß ich, dass meine guten Komponententests einen schlechten Integrationstest ausreichend abdecken, damit ich diesen Integrationstest löschen kann?

Daniel Kaplan
quelle

Antworten:

18

Die einfachste Kennzahl ist die Frage, wann dieser Integrationstest das letzte Mal zu Recht fehlgeschlagen ist. Wenn der Integrationstest lange nicht bestanden hat (es wurden viele Änderungen vorgenommen), sind die Komponententests wahrscheinlich gut genug. Wenn der Integrationstest kürzlich fehlgeschlagen ist, ist ein Fehler aufgetreten, der von den Komponententests nicht erfasst wurde.

Generell würde ich es vorziehen, die Robustheit der Integrationstests so weit zu erhöhen, dass sie unbeaufsichtigt zuverlässig ausgeführt werden können. Wenn es lange dauert, bis sie ausgeführt werden, führen Sie sie über Nacht aus. Sie sind immer noch wertvoll, auch wenn sie nur gelegentlich ausgeführt werden. Wenn diese Tests zu anfällig sind oder manuelle Eingriffe erfordern, lohnt es sich möglicherweise nicht, sie am Laufen zu halten, und Sie können in Betracht ziehen, diejenigen zu verwerfen, die am häufigsten erfolgreich sind.

Greg Hewgill
quelle
3
+1 für die Empfehlung, die Tests zu automatisieren, da dies zu der offensichtlichen Frage führt: "Warum einen automatisierten Test abbrechen?"
1
Ja, dem stimme ich zu. Selbstverständlich beißt Sie auch das noch, wenn Sie nicht über eine ausreichende Abdeckung durch Komponententests verfügen. Zum Beispiel haben wir derzeit eine Integrationstestsuite, deren Ausführung ungefähr 6 Stunden dauert ... aber ich glaube, ein Test wurde NIE gelöscht, weil sich mein Unternehmen auf Kompatibilität konzentriert
Earlz
2
Vielleicht sollte ich eine neue Frage dazu stellen, aber schlagen Sie vor, dass ich, wenn ein Integrationstest legitimerweise fehlschlägt, herausfinden sollte, wie man einen Komponententest schreibt, der ebenfalls fehlschlägt, und beide zum Bestehen bringt?
Daniel Kaplan
2
@tieTYT: Ja, das klingt absolut nach einer guten Idee. Unit-Tests sind gut; Unit-Tests für Dinge, von denen Sie wissen, dass sie bereits kaputt sind, sind noch besser.
Greg Hewgill
7

Unit-Tests sind nicht das Allerheiligste, sondern nur ein Werkzeug von vielen, das zum Testen einer Codebasis verwendet werden sollte. Aus diesem Grund sollte keine Anzahl von Komponententests als sicher angesehen werden, um andere Tests zu ersetzen. Wenn Sie einen schlechten Integrationstest haben, sollten Sie daran arbeiten, ihn zu einem guten Integrationstest zu machen. Ersetzen Sie ihn nicht durch etwas anderes, sondern ersetzen Sie Ihre Haustür durch einen Begrenzungszaun und ein Tor.

Ryathal
quelle
Wenn dieses Projekt von vorne anfangen würde, wäre das für mich sinnvoller. Aber mein erster Integrationstest war "Überprüfen Sie, ob Sie sich anmelden können", und schließlich habe ich viele Komponententests durchgeführt, die "Überprüfen Sie, ob Sie sich anmelden können". Der Integrationstest stürzt ständig ab, wenn Sie den HTML-Code ändern. Dieses Beispiel ist vollständig konstruiert, aber ist es nicht ein guter Fall, um den Integrationstest zu entfernen?
Daniel Kaplan
3
@tieTYT: Wenn Sie etwas über die Benutzeroberfläche testen, führt dies häufig zu einer sehr instabilen Lösung. Trotzdem ist das Testen über die Benutzeroberfläche wichtig. In einigen Fällen sind manuelle Tests weniger aufwändig als der Versuch, diesen Test zu automatisieren und stabil zu halten. Wenn Sie glauben, dass dies hier der Fall ist, können Sie diesen "Integrationstest" aus der Liste der automatisierten Tests entfernen und ihn Ihrem Testplan für manuelle Tests hinzufügen.
Doc Brown
@DanielKaplan wäre es möglich, den Integrationstest stabiler zu aktualisieren? Wenn dies fehlschlägt, weil sich der HTML-Code manchmal ändert, testen Sie möglicherweise etwas wie "Benutzername wird auf der Seite nach der Anmeldung angezeigt" und nicht etwas Spezifischeres wie "Benutzername wird in diesem Div nach der Anmeldung
Jen,