Meine Erfahrung mit dem Übergang
Viele Jahre lang hatte ich das Missverständnis, dass ich nicht genug Zeit hatte, Komponententests für meinen Code zu schreiben. Wenn ich Tests schrieb, waren sie aufgebläht, schwere Dinge, die mich nur ermutigten zu glauben, dass ich Komponententests nur schreiben sollte, wenn ich wusste, dass sie gebraucht wurden.
Vor kurzem wurde ich ermutigt, Test Driven Development zu verwenden, und ich fand es eine vollständige Offenbarung. Ich bin jetzt fest davon überzeugt, dass ich nicht die Zeit habe, Unit-Tests nicht zu schreiben .
Wenn Sie mit Blick auf das Testen entwickeln, erhalten Sie meiner Erfahrung nach sauberere Schnittstellen, fokussiertere Klassen und Module und im Allgemeinen mehr SOLIDEN , testbaren Code.
Jedes Mal, wenn ich mit Legacy-Code arbeite, der keine Komponententests hat und manuell etwas testen muss, denke ich, "das wäre viel schneller, wenn dieser Code bereits Komponententests hätte". Jedes Mal, wenn ich versuchen muss, dem Code mit hoher Kopplung Unit-Test-Funktionen hinzuzufügen, denke ich, dass dies so viel einfacher wäre, wenn er entkoppelt geschrieben worden wäre.
Vergleich und Gegenüberstellung der beiden von mir unterstützten Versuchsstationen. Einer ist schon eine Weile da und hat eine Menge alten Code, während der andere relativ neu ist.
Wenn Sie dem alten Labor Funktionen hinzufügen, müssen Sie oft mehrere Stunden damit verbringen, sich mit den Auswirkungen der von Ihnen benötigten Funktionen und der Art und Weise, wie ich diese Funktionen hinzufügen kann, ohne die anderen Funktionen zu beeinträchtigen, auseinanderzusetzen. Der Code ist einfach nicht für Offline-Tests eingerichtet, daher muss so ziemlich alles online entwickelt werden. Wenn ich versuchen würde, offline zu entwickeln, würde ich am Ende mehr Scheinobjekte haben, als vernünftig wären.
Im neueren Labor kann ich normalerweise Funktionen hinzufügen, indem ich sie offline an meinem Schreibtisch entwickle, nur die Dinge verspotte, die sofort benötigt werden, und dann nur eine kurze Zeit im Labor verbringe, um alle verbleibenden Probleme auszubügeln, die nicht behoben wurden -Linie.
Mein Rat
Es scheint, als hätten Sie gut angefangen. Jedes Mal, wenn Sie große Änderungen an Ihrem Entwicklungsworkflow vornehmen, müssen Sie sicherstellen, dass alle an dieser Entscheidung beteiligt sind, und im Idealfall, dass sich die meisten Leute darauf eingelassen haben. Aus Ihrer Frage geht hervor, dass Sie das richtig verstanden haben. Wenn die Leute von der Idee nicht begeistert sind, ist sie zum Scheitern verurteilt oder erzeugt einen schlechten Willen.
Sofern Sie keinen überzeugenden Business Case vorlegen können, würde ich keine grundsätzliche Implementierung von Komponententests und Spezifikationen für Ihr gesamtes System empfehlen. Wie ich oben erwähnt, wenn ein System nicht entworfen mit dem Testen im Auge, kann es sehr schwierig sein, automatisierte Tests für sie zu schreiben.
Stattdessen würde ich empfehlen, klein anzufangen und die Pfadfinderregel anzuwenden :
Verlassen Sie den Campingplatz immer sauberer als Sie ihn vorgefunden haben.
Wenn Sie während der Implementierung eines Elements auf dieser Codebasis die spezifischen Tests identifizieren können, die zum Testen des vorhandenen Verhaltens und zum Übergang vom alten zum neuen Verhalten erforderlich sind, haben Sie die Änderung der Spezifikation dokumentiert und mit der Implementierung von Komponententests für begonnen dein System.
Module, die Sie nicht berühren, erhalten keine Komponententests. Wenn Sie sie jedoch nicht berühren, liegt dies wahrscheinlich daran, dass sie bereits gründlich getestet wurden und keine Änderungen erfordern, oder dass sie nie verwendet werden.
Was Sie vermeiden möchten, ist die Verschwendung einer ganzen Menge Entwicklerarbeit beim Schreiben von Tests, die niemals benötigt werden ( YAGNI funktioniert für Testcode genauso gut wie für Produktionscode * 8 ') zu denken, dass Tests schließlich nutzlos sind.
Zusammenfassung
Fangen Sie klein an, vertrauen Sie den Tests inkrementell und steigern Sie den geschäftlichen Nutzen durch die Entwicklung von Tests, wenn und wo sie Ihrem Team am meisten nützen.