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.
Antworten:
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.
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.
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,
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.
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.
quelle
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.
quelle
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 :)
quelle
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.
quelle
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.
quelle
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.
quelle
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.
quelle