Ich stehe eher auf der Seite Ihrer Kollegen, aber nur bis zu einem gewissen Punkt.
Das Problem bei Unit-Tests ist, dass sie häufig und sinnlos in trivialen Fällen geschrieben sind, in denen eine flüchtige Untersuchung des Codes ergibt, dass es auf jeden Fall funktionieren wird. Zum Beispiel:
def add(x, y)
x + y
end
Zusammen mit einem Dutzend Tests, um sicherzustellen, dass die Addition tatsächlich für willkürlich ausgewählte Anwendungsfälle funktioniert. Duh ...
Die allgemeine Prämisse hinter Unit-Tests lautet: Wenn Ihr Code keine Fehler enthält, liegt das daran, dass Sie nicht genug getestet haben. Nun, wann schreibt man die richtigen Komponententests? Antworten:
- Wenn Sie testen
- Beim Debuggen
- Während du wirklich knifflige Dinge entwickelst
Lassen Sie uns jeden einzelnen Schritt durchgehen und davon ausgehen, dass Sie eine Art Web-App entwickeln.
Sie schreiben Code für neue Funktionen und dieser sollte inzwischen einigermaßen gut funktionieren. Sie greifen dann zu Ihrem Browser und überprüfen, ob er funktioniert, indem Sie ihn intensiver testen, oder? Bzzzt! ... Falsche Antwort. Sie schreiben einen Komponententest. Wenn Sie dies jetzt nicht tun, werden Sie es wahrscheinlich nie tun. Und dies ist einer der Orte, an denen Unit-Tests sehr gut funktionieren: um Funktionalität auf hohem Niveau zu testen.
Sie entdecken dann einen Bug (der nie einen übersieht?). Dies bringt uns zu Punkt zwei. Sie tauchen wieder in den Code ein und folgen den Schritten. Schreiben Sie dabei die Komponententests an wichtigen Unterbrechungspunkten, an denen es auf konsistente und korrekte Daten ankommt.
Letzter Punkt ist umgekehrt. Sie entwerfen einige haarige Funktionen, die eine Menge Metaprogrammierung beinhalten. Es führt schnell zu einem Entscheidungsbaum mit Tausenden von möglichen Szenarien, und Sie müssen sicherstellen, dass jedes einzelne von ihnen funktioniert. Wenn man solche Dinge schreibt, kann eine einfach aussehende Veränderung hier oder dort unvorstellbare Konsequenzen in der Nahrungskette haben. Angenommen, Sie entwerfen eine MPTT-Implementierung mit SQL-Triggern, sodass sie mit Anweisungen mit mehreren Zeilen funktionieren kann.
In dieser heiklen Umgebung sollten Sie Ihre Tests in der Regel stark automatisieren. Sie schreiben also Skripte, um die Generierung von Testdaten zu automatisieren, und führen eine Bootsladung von Komponententests mit diesen Testdaten durch. Eine wichtige Sache, die Sie dabei nicht aus den Augen verlieren sollten, ist, dass Sie auch Komponententests für Ihren Komponententestgenerator schreiben müssen.
Fazit: Unit-Tests, definitiv ja. Ersparen Sie sich jedoch die Grundfunktionen, bis Sie sie tatsächlich für das Debuggen benötigen oder sicherstellen, dass einige Funktionen ordnungsgemäß funktionieren (einschließlich der Tests selbst in letzterem Fall).