Ich habe eine relevante Anekdote von etwas, das gerade für mich los ist . Ich arbeite an einem Projekt, das TDD nicht verwendet. Unsere QA-Leute bewegen uns in diese Richtung, aber wir sind ein kleines Outfit und es war ein langer, langwieriger Prozess.
Wie auch immer , ich habe kürzlich eine Drittanbieter-Bibliothek verwendet, um eine bestimmte Aufgabe zu erledigen. Es gab ein Problem bezüglich der Verwendung dieser Bibliothek, daher wurde es mir übertragen, im Wesentlichen eine eigene Version derselben Bibliothek zu schreiben. Insgesamt waren es ungefähr 5.000 Zeilen ausführbaren Code und ungefähr 2 Monate meiner Zeit. Ich weiß, dass Codezeilen eine schlechte Metrik sind, aber für diese Antwort halte ich sie für einen anständigen Größenindikator.
Es gab eine bestimmte Datenstruktur, die es mir ermöglichte, eine beliebige Anzahl von Bits zu verfolgen. Da das Projekt in Java ist, habe ich Java gewählt BitSet
und ein wenig modifiziert (ich brauchte die Fähigkeit, auch die führenden 0
s zu verfolgen , was Java aus irgendeinem Grund nicht macht ...). Nachdem ich eine Abdeckung von ~ 93% erreicht hatte, begann ich, einige Tests zu schreiben, die das von mir geschriebene System tatsächlich belasten würden. Ich musste bestimmte Aspekte der Funktionalität vergleichen, um sicherzustellen, dass sie schnell genug für meine Endanforderungen sind. Es überrascht nicht, dass eine der Funktionen, die ich von der BitSet
Schnittstelle aus überschrieben hatte , bei großen Bitmengen (in diesem Fall Hunderte von Millionen von Bits) absurd langsam war. Andere überschriebene Funktionen beruhten auf dieser einen Funktion, sodass es sich um einen riesigen Flaschenhals handelte.
Was ich am Ende tun mit dem Zeichenbrett würde und einen Weg herauszufinden , die zugrunde liegende Struktur zu manipulieren BitSet
, das eine ist long[]
. Ich entwarf den Algorithmus, fragte Kollegen nach ihren Eingaben und machte mich dann daran, den Code zu schreiben. Dann habe ich die Unit-Tests durchgeführt. Einige von ihnen sind kaputt gegangen und diejenigen, die mich genau dorthin geführt haben, wo ich in meinem Algorithmus nachsehen musste, um das Problem zu beheben. Nachdem ich alle Fehler aus den Unit-Tests behoben hatte, konnte ich sagen, dass die Funktion so funktioniert, wie sie sollte. Zumindest könnte ich so sicher sein, dass dieser neue Algorithmus genauso gut funktioniert wie der vorherige.
Dies ist natürlich nicht kugelsicher. Wenn mein Code einen Fehler enthält, auf den die Komponententests nicht prüfen, weiß ich es nicht. Aber natürlich hätte genau dieser Fehler auch in meinem langsameren Algorithmus vorkommen können. Ich kann jedoch mit größter Sicherheit sagen, dass ich mir keine Sorgen über die falsche Ausgabe dieser bestimmten Funktion machen muss. Bereits vorhandene Komponententests ersparten mir Stunden, vielleicht Tage, um den neuen Algorithmus auf seine Richtigkeit zu testen.
Das ist der Punkt, an dem Unit-Tests unabhängig von TDD durchgeführt werden müssen - das heißt, Unit-Tests erledigen dies für Sie in TDD und auch außerhalb von TDD, wenn Sie am Ende den Code umgestalten / pflegen. Dies sollte natürlich mit regelmäßigen Regressionstests, Rauchtests, Fuzzy-Tests usw. kombiniert werden, aber Unit- Tests testen, wie der Name schon sagt, die Dinge auf der kleinstmöglichen atomaren Ebene, die Ihnen Aufschluss darüber gibt, wo Fehler aufgetreten sind.
In meinem Fall müsste ich ohne die vorhandenen Komponententests irgendwie eine Methode finden, um sicherzustellen, dass der Algorithmus die ganze Zeit funktioniert. Was am Ende ... sehr nach Unit Testing klingt, nicht wahr?