Ich habe Unit-Tests für Codebasen eingeführt, die es vorher nicht hatten. Bei dem letzten großen Projekt, an dem ich beteiligt war, war das Produkt bereits mit Null-Unit-Tests in Produktion, als ich im Team ankam. Als ich - 2 Jahre später - ging, hatten wir mehr als 4500 Tests, die eine Codeabdeckung von etwa 33% in einer Codebasis mit mehr als 230.000 Produktions-LOC (finanzielle Win-Forms-Echtzeitanwendung) ergaben. Das mag leise klingen, aber das Ergebnis war eine signifikante Verbesserung der Codequalität und der Fehlerrate - plus eine verbesserte Moral und Rentabilität.
Dies ist möglich, wenn Sie sowohl ein genaues Verständnis als auch ein Engagement der beteiligten Parteien haben.
Zuallererst ist es wichtig zu verstehen, dass Unit-Tests eine Fähigkeit für sich sind. Sie können nach "konventionellen" Maßstäben ein sehr produktiver Programmierer sein und dennoch Schwierigkeiten haben, Komponententests so zu schreiben, dass sie in einem größeren Projekt skaliert werden können.
Und speziell für Ihre Situation ist das Hinzufügen von Komponententests zu einer vorhandenen Codebasis ohne Tests ebenfalls eine spezielle Fähigkeit für sich. Sofern Sie oder jemand in Ihrem Team keine erfolgreichen Erfahrungen mit der Einführung von Komponententests in eine vorhandene Codebasis haben, würde ich sagen, dass das Lesen von Feathers Buch eine Voraussetzung ist (nicht optional oder dringend empfohlen).
Der Übergang zum Unit-Test Ihres Codes ist eine Investition in Mitarbeiter und Fähigkeiten ebenso wie in die Qualität der Codebasis. Dies zu verstehen ist sehr wichtig für die Denkweise und das Management der Erwartungen.
Nun zu Ihren Kommentaren und Fragen:
Ich mache mir jedoch Sorgen, dass mir am Ende das Gesamtbild und grundlegende Tests fehlen, die enthalten wären, wenn ich TDD von Anfang an verwendet hätte.
Kurze Antwort: Ja, Sie werden Tests verpassen und ja, sie sehen anfangs möglicherweise nicht so aus, wie sie es auf einer grünen Wiese hätten.
Eine tiefere Antwort lautet: Es spielt keine Rolle. Sie beginnen ohne Tests. Fügen Sie Tests hinzu und überarbeiten Sie sie, während Sie fortfahren. Wenn die Fähigkeiten besser werden, legen Sie die Messlatte für den gesamten neu geschriebenen Code, der Ihrem Projekt hinzugefügt wurde, höher. Verbessere dich weiter etc ...
Wenn ich jetzt zwischen den Zeilen hier lese, habe ich den Eindruck, dass dies aus der Denkweise von "Perfektion als Entschuldigung dafür, nicht gehandelt zu haben" stammt. Eine bessere Einstellung ist es, sich auf das Selbstvertrauen zu konzentrieren. Da Sie möglicherweise noch nicht wissen, wie es geht, werden Sie herausfinden, wie Sie die Lücken ausfüllen müssen. Daher gibt es keinen Grund zur Sorge.
Wieder ist es eine Fähigkeit. Sie können nicht in einem "Prozess" oder "Schritt für Schritt" Kochbuchansatz linear von Null-Tests zu TDD-Perfektion übergehen. Es wird ein Prozess sein. Ihre Erwartungen müssen darin bestehen, schrittweise und schrittweise Fortschritte und Verbesserungen zu erzielen. Es gibt keine magische Pille.
Die gute Nachricht ist, dass Ihr Code im Laufe der Monate (und sogar Jahre) allmählich zu "richtigem", gut faktorisiertem und gut getestetem Code wird.
Als Anmerkung. Sie werden feststellen, dass das Haupthindernis für die Einführung von Komponententests in einer alten Codebasis mangelnde Kohäsion und übermäßige Abhängigkeiten sind. Sie werden daher wahrscheinlich feststellen, dass die wichtigste Fähigkeit darin besteht, vorhandene Abhängigkeiten zu lösen und Code zu entkoppeln, anstatt die eigentlichen Komponententests selbst zu schreiben.
Gibt es Prozesse / Schritte, die eingehalten werden sollten, um sicherzustellen, dass vorhandene Lösungen ordnungsgemäß getestet und nicht nur eingebunden werden?
Richten Sie einen Build-Server und einen Build für die kontinuierliche Integration ein, der bei jedem Einchecken ausgeführt wird, einschließlich aller Komponententests mit Codeabdeckung.
Trainiere deine Leute.
Beginnen Sie irgendwo und fügen Sie Tests hinzu, während Sie aus Kundensicht Fortschritte machen (siehe unten).
Verwenden Sie die Codeabdeckung als Richtschnur dafür, wie viel von Ihrer Produktionscodebasis getestet wird.
Die Erstellungszeit sollte immer SCHNELL sein. Wenn Ihre Bauzeit langsam ist, bleiben Ihre Fähigkeiten beim Testen von Einheiten zurück. Finden Sie die langsamen Tests und verbessern Sie sie (entkoppeln Sie den Produktionscode und testen Sie isoliert). Gut geschrieben, sollten Sie problemlos in der Lage sein, mehrere Tausend Unit-Tests durchzuführen und dennoch einen Build in weniger als 10 Minuten abzuschließen (~ 1-ms / Test ist eine gute, aber sehr grobe Richtlinie, einige wenige Ausnahmen können wie Code mit Reflektion usw. zutreffen ).
Inspizieren und anpassen.
Wie kann ich sicherstellen, dass die Tests von guter Qualität sind und nicht nur ein Test ist, der besser ist als keine Tests?
Ihr eigenes Urteilsvermögen muss Ihre Hauptquelle der Realität sein. Es gibt keine Metrik, die Fähigkeiten ersetzen kann.
Wenn Sie diese Erfahrung oder dieses Urteilsvermögen nicht haben, sollten Sie jemanden beauftragen, der dies tut.
Zwei grobe sekundäre Indikatoren sind die vollständige Codeabdeckung und die Erstellungsgeschwindigkeit.
Lohnt sich der Aufwand für eine bestehende Lösung, die in Produktion ist?
Ja. Die überwiegende Mehrheit des Geldes, das für ein kundenspezifisches System oder eine kundenspezifische Lösung ausgegeben wird, wird ausgegeben, nachdem es in Produktion gegangen ist. Und Investitionen in Qualität, Menschen und Fähigkeiten sollten niemals aus der Mode kommen.
Wäre es besser, die Tests für dieses Projekt zu ignorieren und sie in einem möglichen zukünftigen Umschreiben hinzuzufügen?
Sie müssten nicht nur die Investition in Mitarbeiter und Fähigkeiten berücksichtigen, sondern vor allem die Gesamtbetriebskosten und die erwartete Lebensdauer des Systems.
Meine persönliche Antwort wäre in den meisten Fällen "Ja natürlich", weil ich weiß, dass es so viel besser ist, aber ich erkenne, dass es Ausnahmen geben könnte.
Was wird vorteilhafter sein; ein paar Wochen damit verbringen, Tests hinzuzufügen oder ein paar Wochen damit, Funktionen hinzuzufügen?
Weder. Ihr Ansatz sollte darin bestehen, Ihrer Codebasis Tests hinzuzufügen, während Sie Fortschritte in Bezug auf die Funktionalität erzielen.
Auch hier handelt es sich um eine Investition in Mitarbeiter, Fähigkeiten UND die Qualität der Codebasis, die Zeit benötigt. Teammitglieder müssen lernen, wie man Abhängigkeiten aufhebt, Komponententests schreibt, neue Gewohnheiten lernt, Disziplin und Qualitätsbewusstsein verbessert, Software besser entwirft usw. Es ist wichtig zu verstehen, dass Ihre Teammitglieder dies wahrscheinlich nicht tun, wenn Sie mit dem Hinzufügen von Tests beginnen Haben Sie diese Fähigkeiten noch auf dem Niveau, das sie benötigen, um erfolgreich zu sein, sodass es einfach nicht funktioniert, den Fortschritt zu stoppen, um die ganze Zeit damit zu verbringen, viele Tests hinzuzufügen.
Das Hinzufügen von Komponententests zu einer vorhandenen Codebasis mit einer beträchtlichen Projektgröße ist ein GROSSES Unterfangen, das Engagement und Beharrlichkeit erfordert. Sie können nichts Grundlegendes ändern, viel Lernen auf dem Weg erwarten und Ihren Sponsor bitten, keinen ROI zu erwarten, indem Sie den Fluss des Geschäftswerts stoppen. Das wird nicht fliegen, und ehrlich gesagt sollte es nicht.
Drittens möchten Sie Ihrem Team solide Geschäftsfokuswerte vermitteln. Qualität geht nie zu Lasten des Kunden und ohne Qualität kann man nicht schnell gehen. Außerdem lebt der Kunde in einer sich verändernden Welt, und Ihre Aufgabe ist es, ihm die Anpassung zu erleichtern. Kundenausrichtung erfordert sowohl Qualität als auch den Fluss des Geschäftswerts.
Was Sie tun, ist die Rückzahlung technischer Schulden. Und Sie tun dies, während Sie Ihren Kunden immer wieder wechselnde Bedürfnisse bedienen. Allmählich, wenn die Schulden getilgt werden, verbessert sich die Situation und es ist einfacher, den Kunden besser zu bedienen und mehr Wert zu liefern. Usw. Diese positive Dynamik sollten Sie anstreben, da sie die Grundsätze eines nachhaltigen Tempos unterstreicht und die Moral aufrechterhält und verbessert - sowohl für Ihr Entwicklungsteam, Ihren Kunden als auch für Ihre Stakeholder.
hoffentlich hilft das