- Ich spreche von Unit-Tests im TDD-Sinne. (Nicht automatisierte "Integration" oder wie Sie es nennen möchten Tests.)
- Legacy-Code wie in: (C ++) Code ohne Tests. (siehe: Michael Feathers ' Effektiv mit Legacy-Code arbeiten )
- Aber auch Legacy-Code wie in: Code, mit dem unser Team in den letzten 10-5 Jahren gearbeitet hat, sodass wir sehr oft eine gute Vorstellung davon haben, wo Dinge platziert werden müssen, um etwas zu ändern.
- Wir haben Unit-Tests für einige Module eingerichtet (über Boost.Test) , die später erschienen sind oder sich als " normal " für Unit-Tests erwiesen haben (allgemeine app-spezifische Container, Zeichenfolgen, Netzwerkhelfer usw.).
- Wir haben noch keine ordnungsgemäßen automatischen Abnahmetests.
Jetzt, vor kurzem, hatte ich das "Vergnügen", 3 neue benutzerbezogene Funktionen zu implementieren.
Ich brauchte jeweils 1-2 Stunden, um mich mit den zu ändernden Codeteilen vertraut zu machen, 1-2 Stunden, um den (kleinen) Code zu implementieren, den ich ändern musste, und weitere 1-2 Stunden, um sicherzustellen, dass die App funktioniert lief danach richtig und tat was es tun sollte.
Jetzt habe ich wirklich wenig Code hinzugefügt. (Ich denke, eine Methode und ein paar Anrufzeilen für jede Funktion.)
Factoring diesen Code aus (über eine der vorgeschlagenen Methoden in WEwLC ), so dass ein Unit - Test sinnvoll haben würde (und nicht um eine vollständige Tautologie gewesen) wäre leicht weiteren 2-4 Stunden in Anspruch genommen, wenn nicht mehr. Dies hätte zu jeder Funktion 50% -100% mehr Zeit ohne unmittelbaren Nutzen beigetragen
- Ich brauchte den Unit-Test nicht, um etwas über den Code zu verstehen
- Manuelles Testen ist derselbe Arbeitsaufwand, da ich noch testen muss, ob der Code richtig in den Rest der App integriert ist.
Zugegeben, wenn später "jemand" kam und diesen Code berührte, könnte er theoretisch einen gewissen Nutzen aus diesem Komponententest ziehen. (Nur theoretisch, da diese getestete Codeinsel in einem Ozean von ungetestetem Code leben würde.)
"Dieses Mal" habe ich mich also entschieden, die harte Arbeit des Hinzufügens eines Komponententests nicht zu übernehmen: Die Codeänderungen, um das zu testende Material zu erhalten, wären erheblich komplexer gewesen als die Codeänderungen, um die Funktion korrekt (und sauber) zu implementieren.
Ist dies typisch für stark gekoppelten Legacy-Code? Bin ich faul / setzen wir als Team die falschen Prioritäten? Oder bin ich umsichtig und teste nur Dinge, bei denen der Overhead nicht zu hoch ist?