TDD / Testet zu viel Aufwand / Wartungsaufwand?

24

So haben Sie es oft von denen gehört, die die Werte des Testens nicht wirklich verstehen. Um es vorwegzunehmen, ich bin ein Anhänger von Agile and Testing ...

Ich hatte kürzlich eine Diskussion über die Durchführung von TDD bei einem Produkt-Re-Write, bei dem das aktuelle Team auf keiner Ebene Unit-Tests übt und wahrscheinlich noch nie von der Abhängigkeitsinjektionstechnik oder Testmustern / -design usw. gehört hat (wir werden es nicht einmal verstehen) um den Code zu bereinigen).

Jetzt bin ich voll und ganz für das Umschreiben dieses Produkts verantwortlich, und es wird mir gesagt, dass ein Versuch in der Art von TDD es nur zu einem Wartungs-Albtraum macht und für das Team unmöglich ist, es zu warten. Da es sich um eine Front-End-Anwendung handelt (nicht webbasiert), ist das Hinzufügen von Tests sinnlos. Da sich die Geschäftsabläufe ändern (Änderungen bedeuten natürlich Verbesserungen), werden die Tests veraltet sein, andere Entwickler werden dazu übergehen Das Projekt in der Zukunft wird sie nicht mehr unterhalten und für sie zu einer größeren Belastung für die Behebung usw. werden.

Ich kann verstehen, dass TDD in einem Team, das derzeit keine Testerfahrung hat, nicht gut klingt, aber mein Argument in diesem Fall ist, dass ich meine Praxis denjenigen um mich herum beibringen kann, aber darüber hinaus weiß ich, dass TDD BESSER macht Software. Selbst wenn ich die Software mit TDD erstellen und alle Tests wegwerfen würde, um sie an ein Wartungsteam zu übergeben, wäre es sicherlich ein besserer Ansatz, als TDD von Anfang an überhaupt nicht zu verwenden?

Ich wurde abgeschossen, weil ich erwähnt habe, dass ich bei den meisten Projekten für ein Team TDD mache, das noch nie davon gehört hat. Der Gedanke an "Interfaces" und seltsam aussehende DI-Konstruktoren schreckt sie ab ...

Kann mir jemand helfen, was normalerweise ein sehr kurzes Gespräch über den Versuch ist, TDD zu verkaufen, und meine Herangehensweise an Menschen? Normalerweise habe ich ein sehr kurzes Zeitfenster für Auseinandersetzungen, bevor ich der Firma / dem Team in die Knie gehe.

Martin Blore
quelle
3
LAUF! FLIEHEN! Wer nicht begreifen kann, warum automatisierte Tests sein Leben auf lange Sicht einfacher machen, muss den Kopf (die Köpfe) von Ihnen-wissen-wo entfernen.
MattC
6
@MattC TDD! = Automatisierte Tests
Nemanja Trifunovic
@Nemanja Trifunovic: Uhh ... wer übt TDD mit manuellen Tests? "Ich habe die App gestartet, aber es gibt keinen Knopf zum Anklicken !?" "Ja, das ist das Rot in Rot, Grün, Refaktor!"
Steven Evers
2
@ SnOrfus: Es gibt automatisierte Tests ohne TDD. Einige Beispiele: automatisierte Integrationstests, Regressionstests, Stresstests.
Nemanja Trifunovic
2
@Martin, ich wäre an einem Folgekommentar (oder Blogpost) interessiert, in dem besprochen wird, was Sie getan haben und wie gut (oder nicht) es auf lange Sicht für Sie funktioniert hat.
StevenV

Antworten:

36

Wenn Sie es in der Art von TDD versuchen, wird es lediglich zu einem Alptraum für die Instandhaltung und für das Team unmöglich.

Sie können dieses Argument nicht gewinnen. Sie erfinden das. Leider haben Sie auch keine wirklichen Fakten. Jedes von Ihnen angegebene Beispiel kann bestritten werden.

Die einzige Möglichkeit, dies zu erreichen, besteht darin, Code zu haben, dessen Wartung mit geringeren Kosten verbunden ist.

Da es sich um eine Front-End-Anwendung handelt (nicht webbasiert), ist das Hinzufügen von Tests außerdem sinnlos.

Jeder sagt das. Es kann auch teilweise wahr sein. Wenn die Anwendung einigermaßen gut gestaltet ist, hat das Front-End sehr wenig zu tun.

Wenn die Anwendung jedoch schlecht gestaltet ist, leistet das Front-End zu viel und ist schwer zu testen. Dies ist ein Entwurfsproblem, kein Testproblem.

Da sich die Geschäftsabläufe ändern (Änderungen bedeuten natürlich Verbesserungen), werden die Tests veraltet sein. Andere Entwickler, die in Zukunft in das Projekt einsteigen, werden sie nicht mehr warten und eine größere Belastung für sie darstellen, um sie zu reparieren usw.

Dies ist das gleiche Argument wie oben.


Sie können das Argument nicht gewinnen. Also nicht streiten.

"Ich bin voll verantwortlich für die Neufassung dieses Produkts."

In diesem Fall,

  1. Fügen Sie trotzdem Tests hinzu. Fügen Sie Tests jedoch schrittweise hinzu. Verbringen Sie nicht viel Zeit damit, zuerst Tests schreiben zu lassen. Konvertieren Sie ein wenig. Teste ein wenig. Konvertieren Sie ein wenig mehr. Teste ein bisschen mehr.

  2. Verwenden Sie diese Tests, bis jemand herausfindet, dass das Testen funktioniert, und fragt, warum die Dinge so gut laufen.

Ich hatte das gleiche Argument bei einem Umschreiben (von C ++ auf Java) und habe einfach die Tests verwendet, obwohl sie mir gesagt haben, dass ich das nicht tun soll.

Ich habe mich sehr schnell entwickelt. Ich habe nach konkreten Beispielen für korrekte Ergebnisse gefragt, die sie in Tabellen geschickt haben. Ich habe die Tabellenkalkulationen in unittest.TestCase umgewandelt (ohne es ihnen mitzuteilen) und benutze diese zum Testen.

Bei den Benutzerakzeptanztests - und es wurden Fehler gefunden - habe ich nur darum gebeten, die Tabellen mit den Beispielen zu überprüfen, zu korrigieren und zu erweitern, um die beim Akzeptanztest festgestellten Probleme abzudecken. Ich habe die korrigierten Arbeitsblätter in unittest.TestCase umgewandelt (ohne es ihnen mitzuteilen) und benutze diese zum Testen.

Niemand muss im Detail wissen, warum Sie erfolgreich sind.

Sei einfach erfolgreich.

S.Lott
quelle
Sehr anregende Resonanz gibt es bei S.Lott :). Es war für mich einschüchternd, von einem Unternehmensarchitekten zu erfahren, dass ich "unnötigen Overhead schaffen" würde. Es war nicht zu sehen, dass ich das Projekt mit Unbekannten verzögerte, sodass sie letztendlich, wenn das Projekt zu spät kam, einfach mit dem Finger auf die von mir durchgeführten Tests zeigen und den Vertrag beenden konnten. Wie Sie sagen, ist es wahrscheinlich der richtige Weg, sie in einem späteren Test dahinter zu bringen, wie es geholfen hat. Sie haben absolut Recht in Bezug auf Argumente, ich habe keinen Grund und sie auch nicht.
Martin Blore
Warum macht das Frontend zu viele Designprobleme? Heutzutage leisten viele Technologien wie AJAX im Frontend viel.
卢 声 远 Shengyuan Lu
@ 卢 卢 远 Shengyuan Lu: Es ist schwer, GUI "Look" zu testen. Sie können Schriftarten und Farben testen. Browser-Macken machen es jedoch sehr schwierig, die exakte Platzierung und Größe mit automatisierten Tests zu testen.
S.Lott
@ Martin Blore: "Sie auch nicht." Genau. Jeder, der sagt, das Testen würde das Risiko auf magische Weise erhöhen, ist verrückt. Sie müssen es trotzdem testen - es ist unvermeidlich. Sie können gut testen (mit TDD) oder Sie können schlecht und willkürlich testen. Die Planung für schlechte, willkürliche Tests scheint mir riskanter. Aber es gibt keine Basisdiskussion, bis die "Neinsager" praktische Erfahrung haben.
S.Lott
5

Sie können solche Menschen (wenn überhaupt) nur aus praktischer Sicht überzeugen und den Wert von TDD im wirklichen Leben demonstrieren. ZB am Beispiel eines kürzlich aufgetretenen Fehlers, der zeigt, wie ein Komponententest erstellt wird, der zu 100% sicherstellt, dass dieser Fehler möglicherweise nie wieder auftritt. Und dann schreiben Sie natürlich noch ein Dutzend Unit-Tests, um zu verhindern, dass die ganze Klasse ähnlicher Bugs auftaucht (und wer weiß, vielleicht auf dem Weg, noch ein paar weitere inaktive Bugs im Code aufzudecken).

Wenn dies kurzfristig nicht funktioniert, müssen Sie länger daran arbeiten, indem Sie einfach TDD durchführen und Unit-Tests sorgfältig für Ihre eigenen Aufgaben schreiben. Erstellen Sie dann nach etwa einem halben Jahr einige einfache Statistiken (sofern dies in Ihrer Umgebung möglich ist), um die Fehlerraten in Code / Aufgaben zu vergleichen, die von verschiedenen Entwicklern ausgeführt wurden (anonymisiert, um eine Entfremdung Ihrer Teamkollegen zu verhindern). Wenn Sie darauf hinweisen können, dass in Ihrem Code deutlich weniger Fehler gefunden wurden als in anderen, haben Sie möglicherweise eine starke Position, die Sie sowohl an das Management als auch an andere Entwickler verkaufen können.

Péter Török
quelle
Das ist eine großartige Idee, Peter, danke dafür. Mein aktuelles Projekt hat ein Testteam, daher bin ich mir sicher, dass es ziemlich einfach ist, Fehler aus Meilensteinveröffentlichungen usw. zu erfassen
Martin Blore,
3

In diesen Dingen muss man praktisch sein, TDD ist in der Theorie eine nette Sache, aber es macht wenig Sinn, wenn Sie Ihre Tests nicht für alles aktualisieren, was hinzugefügt wird - niemand möchte einen Test ausführen, der als fehlerhaft gemeldet wird Code, wenn der Test nicht aktualisiert wurde! Infolgedessen kann es leicht zu kostspielig sein, sie auszuführen - Sie sind nicht der einzige Entwickler, der an diesem Code arbeitet.

Der Kunde hat ein Testteam. Nun, es ist kein Problem, die Testlast vom Entwickler auf die Tester zu verlagern - dafür sind sie schließlich da, und wenn sie durch ihre Tests Fehler finden (vielleicht haben sie viele) automatisierte Testwerkzeuge), dann hat es wenig Sinn, Unit-Tests auf Ihrem Niveau zu schreiben. Es wird etwas länger dauern, bis die Bugs gefunden sind, aber sie werden die lästigen "Integrations" -Bugs finden, die Ihre Tests nicht ausgeführt hätten.

Wahrscheinlich interessieren sie sich deshalb nicht für Unit-Tests.

Schließlich ist TDD eine neue Sache, als ich ein Junge war, hatten wir noch nie Tests und wir haben Code geschrieben, der funktionierte. Durch Unit-Tests fühlen sich manche Menschen warm und verschwommen, aber es ist absolut keine Voraussetzung für korrekten Code.

PS. Ich sehe eine andere Ihrer Fragen, bei der Sie Abstraktionsebenen kritisieren, und hier kritisieren Sie das Fehlen von DI-Konstruktoren! Entscheide dich :)

gbjbaanb
quelle
2

Da sich alles so schnell ändert, wie Sie es formulieren, erklären Sie ihnen, dass es für Regressionstests verwendet wird. Dies erspart viele Kopfschmerzen, wenn neue Fehler eingeführt werden, weil jemand eine Codezeile gebrochen hat, die vor 10 Jahren geschrieben wurde, um ein Problem zu beheben, das 1 von 10.000.000 Ausführungen einer bestimmten Funktion auftritt, die nur aufgerufen wird, wenn die Systemuhr eingeschaltet ist Der Client unterscheidet sich mehr als 3 Minuten von der Systemuhr des Servers. Fragen Sie sie einfach, wie viele Kunden sie sich leisten können, wegen fehlerhafter Software zu verlieren.

Woot4Moo
quelle
2

Weisen Sie darauf hin, dass das Auffinden eines Fehlers während der Entwicklung X, beim Testen 10X und nach der Bereitstellung 100X kostet. Sehen Sie nach, ob Sie damit mindestens einen Pilottest durchführen können, bei dem Sie TDD in einem bestimmten Modul implementieren, und vergleichen Sie diese anschließend mit anderen Modulen, wenn diese entwickelt, getestet, bereitgestellt und unterstützt werden. Bei ausreichenden Daten sollten Sie nachweisen können, wie wenig Aufwand für die Codeerstellung im TDD-Modul erforderlich war. Viel Glück.

SnoopDougieDoug
quelle
2

Ja, die Aufrechterhaltung von Tests ist eine Belastung. Aktualisieren Sie sie, aktualisieren Sie Ihre Testdaten: all dies kostet Ihre Zeit.

Die Alternative - manuelles Testen von Dingen, erneutes Beheben von Fehlern, die nicht in der Lage sind, in Sekunden zu erkennen, dass Ihr Code funktioniert - kostet viel mehr.

Frank Shearar
quelle
2
Ich denke, dies ist einer der wichtigsten Punkte, die man Neinsagern gegenüber machen sollte, die behaupten, TDD sei Zeitverschwendung und unnötiger Overhead. Es ist nicht so, dass TDD keine Zeit kostet. Es ist die Tatsache, dass es sich um eine Investition handelt, die zukünftige Kosten verhindert, die um Größenordnungen höher sind
sara
2

Ein Test ist eine Last, aber es ist eine gute Last, ihn zu tragen. Es ist besser, im Voraus zu arbeiten, um bei Produktionsproblemen oder während der Migration viel Zeit zu sparen. Ich werde immer einen Test haben wollen, auch wenn es wenig Belastung ist, aber ich möchte diese Belastung tragen.

Rachel
quelle