TDD mit begrenzten Ressourcen

13

Ich arbeite in einem großen Unternehmen, aber in einem Team von nur zwei Mitarbeitern, das Desktop-LOB-Anwendungen entwickelt. Ich beschäftige mich bereits seit einiger Zeit mit TDD, und obwohl es leicht ist, die Vorteile für größere Anwendungen zu erkennen, fällt es mir schwer, die Zeit zu rechtfertigen, in der wir TDD in der Größenordnung unserer Anwendungen einsetzen können.

Ich verstehe seine Vorteile bei der Automatisierung von Tests, der Verbesserung der Wartbarkeit usw., aber auf unserer Skala könnte das Schreiben selbst grundlegender Komponententests leicht die Entwicklungszeit verdoppeln. Da wir mit extremen Fristen bereits unterbesetzt sind, bin ich mir nicht sicher, in welche Richtung wir gehen sollen. Während andere Praktiken wie die agile iterative Entwicklung seitdem perfekt sind, bin ich über die Produktivitätskompromisse von TDD in einem kleinen Team hin- und hergerissen.

Sind die Vorteile von TDD die zusätzliche Entwicklungszeit für kleine Teams mit sehr engen Zeitplänen wert?

Mistkerl
quelle
Wofür steht LOB? Sparte?
gnat

Antworten:

14

Die hässliche Wahrheit ist, dass es Sie zunächst verlangsamen wird . Es dauert einige Zeit, bis ein neuer Prozess oder eine neue Übung abgeschlossen ist. Nach meiner Erfahrung zahlt sich TDD bei der ersten Implementierung weniger aus als bei der Wartung, Fehlerbehebung und Erweiterung. Ich weiß, dass es für andere eine sofortige Auszahlung gibt, daher hängt dies vom aktuellen Codierungsstil jeder Person ab.

Obwohl ich ein großer Befürworter von TDD bin (ich habe es zu meinem derzeitigen Job gemacht), denke ich, dass Sie ein wenig Atempause (Fristen / Fristen) benötigen, um die Praxis zu erforschen und zu verstehen.

Je kleiner Ihr Team ist, desto schneller können Sie von TDD profitieren. Ich habe diese Auszahlung in Teamgröße von 6 bis 3 gesehen.

dietbuddha
quelle
2
+1: Es geht nicht darum, Entwicklungszeit zu sparen, es spart (viel!) Debug- und Wartungszeit.
Javier
4
"Wenn Sie der Meinung sind, dass Test-First teuer ist, versuchen Sie Debug-Later"
Ryan Bigg,
@ Ryan Bigg: Ich stimme zu, dass Unit-Tests eine großartige Unterstützung für das Debuggen darstellen, aber gut geschriebener Code ist mit einem herkömmlichen Debugger nicht schwer zu debuggen.
Giorgio
@Giorgio: Code kann so gut wie möglich geschrieben werden. Wenn Sie ihn nicht isoliert testen können, weil die Infrastruktur für diesen Code fehlt, benötigt der Zyklus test / debug / change / test again nur mehr Zeit. Dies gilt insbesondere dann, wenn Sie nach einem Fehler suchen, bei dem Sie die Ursache nicht kennen und nicht wissen, wo in Ihren 100.000 Zeilen gut geschriebenen Codes der Fehler möglicherweise liegt.
Doc Brown
10

Die zusätzliche Entwicklungszeit, von der Sie sprechen, kann eine Illusion sein .

Was TDD von Standard-Unit-Tests unterscheidet, ist, dass es nicht nur zur Durchführung von Tests verwendet wird.

TDD is a new way of developing software. Es ist einer der besten Wege, den ich kenne.

Daher hängt es nicht mit der Größe Ihres Projekts zusammen. Sie werden die Vorteile aus der ersten Codezeile extrahieren .

  • Dadurch müssen Sie Ihren Code so strukturieren, dass er einfacher zu warten und wiederzuverwenden ist. Es bestimmt das Design Ihrer Software.
  • Dadurch wird das Refactoring schnell, sicher und unterhaltsam.
  • Es hilft Ihnen dabei, kleinere Funktionsblöcke zu schreiben, was die Implementierung von Aufgaben erheblich erleichtert.
  • Dadurch werden Debugging-Aufgaben normalerweise weniger häufig ausgeführt.

quelle
Ich wollte antworten, aber Pierre sagt es gut. Fangen Sie klein an, auf etwas, das Sie sowieso bauen müssen, und Sie sollten die Vorteile gleich am ersten Tag nutzen.
Marcie
2
Es kann auch keine Illusion sein. Es kann eine Weile dauern, bis eine neue Praxis in Gang kommt. Vor allem, wenn niemand in der Nähe ist, der es getan hat. Ich würde sagen, es kann in beide Richtungen gehen.
Dietbuddha
@dietbuddha: Ich stimme dem zu, ich habe gezögert, einen Haftungsausschluss zu geben, aber ich wollte die tatsächlichen Vorteile von TDD hervorheben, wenn es richtig angewendet wird.
1
@Pierre - TDD scheint einen besonders schlechten ersten Schritt zu haben (und ich spreche von meinen wiederholten Schwierigkeiten, anzufangen), unter dem gleichen Problem gelitten zu haben, dh zu viel zu tun und zu wenig Zeit. Ich muss mich nicht von den Vorteilen überzeugen lassen - aber das Bootstrappen von mir und meinen Kollegen ist mir derzeit ein Rätsel (Sie müssen darauf vertrauen, dass es mir nicht an Fähigkeiten mangelt ...) - auch aufgrund des Drucks von Zeit und teilweise dafür, nicht ganz zu wissen, wie.
Murph
1
@Murph: Arbeiten Sie an UI-intensiven Anwendungen? Ich neige dazu, es nicht mehr zu verwenden, wenn ich an solchen Anwendungen arbeite.
8

häufiges Missverständnis, lassen Sie mich es ausrufen:

TESTS IN TDD SIND FÜR FUNKTIONEN

EOM.

Edit: Lassen Sie mich erarbeiten: „Schreiben ... Unit - Tests für alle oder unserer Komponenten“ ist Unit - Tests , nicht TDD. Ich setze TDD routinemäßig in Ein-Mann-Teams mit großem Erfolg ein. Die Auszahlung ist außergewöhnlich.

Steven A. Lowe
quelle
1
häufige Missverständnisse, TDD generieren Projekttests. Die Realität ist, dass TDD Projektspezifikationen generiert.
Anzeigename
3

Es gibt ein großartiges Buch über TDD, The Art of Unit Testing ( offizielle Seite ), das Beispiele in .net mit einer Java-Version enthält. Der gute Teil ist, dass es ganze Kapitel gibt, die sich mit Themen wie "Integrieren von Unit-Tests in die Organisation" - Kapitel 8 und "Arbeiten mit Legacy-Code" - Kapitel 9 befassen. Obwohl ich (noch) kein Experte auf diesem Gebiet bin :-) Nach meiner Erfahrung ist dies ein guter Ausgangspunkt.

Die Kunst des Unit-Testens umfasst

Dimitrios Mistriotis
quelle
1

Es gibt ein paar Fragen, auf die Sie Antworten benötigen:

  1. Wie viel Zeit verbringst du nach dem Beheben des Fehlers im Code? Wenn Sie dies quantifizieren können, stellen Sie möglicherweise fest, dass es der "zusätzlichen" Zeit entspricht oder diese sogar überschreitet, die Sie benötigen würden, um den Test zu schreiben, der dazu beitragen würde, das Auftreten dieser Fehler zu verhindern.

  2. Wie oft hat eine scheinbar unkomplizierte Bearbeitung, um den Code umzugestalten oder neue Funktionen hinzuzufügen, etwas gebrochen, das scheinbar nichts damit zu tun hat? Auch diese können bei guter Testabdeckung reduziert werden.

Auch wenn Sie keine genauen Zahlen angeben können, sollten Sie in der Lage sein, zu demonstrieren, dass Sie diese Zeit sowieso verbringen. Sie können sie also auch "im Voraus" ausgeben und (hoffentlich) ein viel stabileres Produkt erhalten.

ChrisF
quelle
1

Wenn Leute mit mir über den Beginn der Einführung von Tests in ihrem Team sprechen, überprüfe ich immer zuerst, wie die Tests ausgeführt werden. Oft haben Teams keinen kontinuierlichen Aufbau. Wenn Sie nur über begrenzte Ressourcen verfügen, ist das Einrichten eines CI-Servers eine Grundvoraussetzung für ernsthafte Testversuche.

Sobald Sie dieses Setup haben, beginnen Sie einfach mit dem Üben von TDD. Bedenken Sie, dass es schwierig sein kann, vorhandenen Code testbar zu machen, wenn das System nicht mit Blick auf Tests entwickelt wurde. Die Umstrukturierung wird teuer.

Beginnen Sie mit der Suche nach einfachen Einstiegsmöglichkeiten für TDD - neuen Klassen oder Modulen mit wenigen Abhängigkeiten. Dienstprogrammklassen und Datenstrukturen sind oft gute Voraussetzungen.

Machen Sie sich ein Bild davon, wie sich die Art und Weise ändert, wie Sie über Ihren Code denken, wie viel besser der von Ihnen erstellte Code ist und wie viel sicherer Sie mit diesem Code sind.

Ich weiß, dass ich die Frage nicht wirklich beantwortet habe, aber ich denke, mein Punkt ist, dass Sie in der Lage sein sollten, all dies ohne massive zusätzliche Kosten zu tun. Wenn Sie Ihre ersten Beispiele durcharbeiten, werden Sie die Vorteile für Ihr Projekt besser verstehen.

Fazit: Langsameres Entwickeln, aber wenige Fehler, viel weniger Zeit für die Behebung von Fehlern.

Gavin Clarke
quelle
1
Ein Zusatz: Suchen Sie zunächst nach Tests mit dem höchsten Wert. Tests, die Sie frühzeitig darüber informieren, dass Sie Ihre Codebasis beschädigt haben. Dies sind in der Regel hohe, umfassende Tests, die Ihnen nicht sagen, was Sie gebrochen haben, sondern dass Sie es gebrochen haben. Sie werden sehr schnell den Wert eines CI mit Testumgebung erkennen. Verwenden Sie Tests zum Debuggen von Brüchen. Wenn ein System vorhanden ist, werden die Kosten für das Hinzufügen neuer Tests immer einfacher / billiger, und Sie können sich auf mehr Tests konzentrieren, die besser beweisen, dass es funktioniert, und zeigen, wo es nicht funktioniert.
Jim Rush
0

Ich denke, hier zeigt die verhaltensgesteuerte Entwicklung unmittelbare Vorteile, aber ich bin nicht sicher, ob dies bei der testgesteuerten Entwicklung der Fall ist.

In der verhaltensorientierten Entwicklung nähern Sie sich Ihren Tickets auf eine andere Weise: Sie setzen sich mit der Geschäftsperson zusammen und definieren mit ihr das Verhalten, das dieser Funktionsblock haben soll. Ich beschreibe dies in einem Eintrag in meinem Blog (der Beitragstitel: Writing Behaviors ).

Setzen Sie sich mit der Geschäftsperson oder mit wem auch immer zusammen, um besser zu verstehen, was das System tun muss, damit alle mit dieser Funktionalität zufrieden sind. Was es tun muss, um von dem von Ihnen eingeführten QS-Prozess akzeptiert zu werden.

Das Definieren von Testkriterien und das anschließende Schreiben dieser Testkriterien in Ihre automatisierte Testsuite sollte den Umfang des Hin- und Herbewegens verringern: Jemand, der behauptet, die Funktionalität zu haben, ist kaputt, weil Sie etwas verpasst haben (entweder weil Sie etwas zu Recht verpasst haben oder weil er es nie gesagt hat) Sie darüber).

Es kann auch die Wahrnehmung Ihres Teams durch andere verbessern: Wenn Sie sich hinsetzen und definieren, was im System getan werden muss, können Sie von "Idioten, die alles überdenken und Zeit für Dinge aufwenden, die wir nicht gewünscht haben" zu: "Schlaue Leute, die sich nützliche Features einfallen lassen".

TL; DR: Behavior Driven Development zeigt möglicherweise schnell Verbesserungen, da es auf Kunden ausgerichtet ist. Test Driven Development scheint für mich das Testen von Interna der Codebasis zu sein, die "niemanden" interessieren und weniger offensichtliche Geschäftsvorteile bieten. (Behaviour Driven Development hat die unmittelbare Veränderung in Ihrem Gesicht: Die Ingenieure haben plötzlich viel mehr Zeit mit dem "Kunden" oder dem Business Analyst, um zu versuchen, dies richtig zu machen - was als eine gute Sache angesehen werden sollte. "Oh , sie haben eine Besprechung über Feature X, was bedeutet, dass es Fortschritte in dieser Hinsicht gibt! ")

RyanWilcox
quelle