Wer macht testgetriebene Entwicklung?

23

Ich habe in den letzten 4 ½ Jahren im Unternehmensbereich gearbeitet und festgestellt, dass Unternehmen im Allgemeinen keine geeigneten Umgebungen für den Test-First-Entwicklungsstil sind. Projekte sind in der Regel kosten-, zeit- und wasserfallbasiert. Alle Unit-Tests werden, falls überhaupt, in der Regel nach der Entwicklung in der QS-Phase von einem anderen Team durchgeführt.

Bevor ich für ein Unternehmen gearbeitet habe, habe ich viele kleine und mittlere Unternehmen beraten, und keines von ihnen war bereit, für ein Entwicklungsprojekt im Test-First-Stil zu bezahlen. Normalerweise wollten sie, dass die Entwicklung sofort oder nach einer kurzen Designphase gestartet wird, dh etwas, das eher agil ist, obwohl einige Kunden wollten, dass alles wie ein Wasserfall dargestellt wird.

Mit welchen Arten von Shops, Unternehmen und Kunden funktioniert die testgetriebene Entwicklung am besten? Welche Arten von Projekten sind für TDD in der Regel förderlich?

Edward J. Stembler
quelle
5
"Keiner von ihnen war bereit, für ein Test-First-Style-Entwicklungsprojekt zu bezahlen" - sagen Sie was? Die Gesamtzeit, die meiner Erfahrung nach für die Implementierung einer Methode in einer Klasse benötigt wird, ist viel geringer, wenn Sie zuerst den "Test" schreiben. Heutzutage wird es jedoch nicht mehr als Test-First-Entwicklung oder Test-Driven-Entwicklung bezeichnet, da dies eine ziemlich vorgefertigte Sichtweise ist. Sie können sich Unit-Tests in TDD als programmatische Beschreibungen Ihres Codes vorstellen, die dann bei der "Festlegung des Tests" erfüllt werden. Sicherlich ist es besser, eine Vorstellung davon zu haben, was Sie tun möchten, bevor Sie es tun? :)
bzlm
2
@bzlm zwei Situationen, in denen der Test "Bezahlen für" zuerst gültig ist. Wo die Benutzer viele Prototypen mit massiven Nacharbeiten bei jedem Schritt erwarten, weil sie nicht sicher sind, was das beste Ergebnis ist, und wo der Aufwand, die Entwickler dazu zu bringen, das externe Verhalten korrekt genug zu simulieren, um gültige Tests durchzuführen, unerschwinglich ist. Beides ist nicht unbedingt ein schöner Ort, aber beides kann in Unternehmen üblich sein.
Bill
6
Zwei fehlerhafte Annahmen: Erstens, dass TDD teurer ist. Agile ist weniger teuer als Wasserfall , weil Sie keine Zeit bauen die falsche Sache verbringen und TDD ist weniger teuer als Test zuletzt , weil Sie verbringen nicht Zeit , die Dinge bauen , die nicht arbeiten. Zweitens bedeutet dieses TDD nicht, dass Sie "sofort mit der Entwicklung beginnen können". Mit TDD beginnen Sie sofort mit der Entwicklung. TDD bedeutet nicht, dass Sie alle Ihre Tests zuerst schreiben. Es bedeutet, dass Sie zuerst einen einzelnen Test schreiben. Niemand, einschließlich der TDD-Benutzer, möchte TDD so ausführen, wie Sie es zu verstehen scheinen.
Rein Henrichs
@Rein: Amen, Bruder !!
IAbstrakter
Ermutigt diese Frage nicht zu Antworten im Listenstil, bei denen es keine echten Kriterien dafür gibt, wann sie "richtig" beantwortet wurden? Werden solche Fragen nicht für das Q & A-Format von StackExchange als ungeeignet angesehen, weil wir am Ende mehr als 16 Antworten haben, von denen jede die Frage beantwortet, von denen jedoch keine das nicht vorhandene Exit-Kriterium für "richtig" erfüllt?
Nathan C. Tresch

Antworten:

33

Jede Codezeile, die ich schreibe, verwendet eine testgetriebene Entwicklung. Wenn das Management mit dem Schreiben von Tests nicht an Bord ist, erzähle ich es dem Management nicht. Ich bin der festen Überzeugung, dass testgetriebene Entwicklung ein besserer Prozess ist.

mpenrow
quelle
19
Ich habe Sie nicht speziell deshalb beleidigt, weil Sie TDD machen, sondern weil Sie das tun, was Sie für richtig halten, ohne um Erlaubnis zu bitten. Das machen Profis.
Sergio Acosta
24
@ Sergio - das ist eine schreckliche Definition dessen, was ein Profi tut. Zu denken, dass etwas richtig ist, macht es nicht unbedingt so, insbesondere in technischen Angelegenheiten. Es gibt eine Zeit und einen Ort, um manchmal die Regeln zu brechen, um etwas zu erledigen, aber zu sagen, dass das Zeichen des Profis darin besteht, das zu tun, was man für richtig hält, ohne um Erlaubnis zu bitten (insbesondere, wenn man dafür bezahlt wird, einen bestimmten Prozess durchzuführen). Das ist eine grobe Vereinfachung eines komplexen Themas.
Luis.espinal
6
Nehmen Sie nicht, was ich gesagt habe, als Definition dessen, was ein Fachmann ist. Und erwarten Sie nicht, dass ein Kommentar mit zwei Sätzen eine eingehende Behandlung eines komplexen Themas darstellt. Es tut uns leid.
Sergio Acosta
22
Wie wäre es damit: "Ein Profi macht das Richtige, ohne dass man ihn dazu auffordert". Besser? Das habe ich gemeint.
Sergio Acosta
3
@CraigTp - Es gibt ein ganzes Kapitel im Buch Peopleware: Productive Projects and Teams, das gegen die "Methodology" protestiert und besagt, dass sie die Motivation tötet und die innere Flamme löscht, die man haben kann, wenn die "Methodology" zu eng ist, weil sie die "Methodology" entfernt Individuelle Freiheit, vorausgesetzt, sie treffen systematisch schlechte Entscheidungen. In einem guten Arbeitsumfeld kann der Einzelne die Entscheidung treffen, die er für das "Wohl" am besten hält. Wenn dies fehlschlägt, passen Sie es an. Andernfalls sollte der Einzelne im Mittelpunkt der Entscheidung stehen, nicht die "Methodik"
JF Dion
17

Mein Chef hat mir heute einen guten Tipp gegeben. Ich glaube, ich werde ihn stehlen, als würde er ihn jemand anderem stehlen.

"Würden Sie erwarten, dass ein Tischler das Brett misst, bevor er es schneidet?"

Ich habe in der High School einen Holzladen besucht und während der gesamten Schulzeit am Bau gearbeitet. Unser Mantra lautete immer "zweimal messen, einmal schneiden", woraufhin der sarkastische Satz "Ich habe es geschnitten und wieder geschnitten und es war immer noch zu kurz!"

MIA
quelle
Ich kann nicht sagen, dass ich dieser Analogie zustimme. Es kommt den Komplexitäten in der Entwicklung nicht wirklich nahe. Andererseits glaube ich nicht ganz an TDD.
xil3
@ xil3 Ja, die Analogie ist nicht gut. Es würde mehr "ungefähr messen, nicht nachprüfen und dann schneiden". Aber die Antwort ist immer noch sehr gut
BЈовић
12

Wenn Sie danach testen, erstellen Sie eine Überarbeitung, da der Code, den Sie geschrieben haben, nur schwer zu testen ist. Wenn Sie zuerst testen oder sogar ein wenig in der Mitte testen, aber bevor Sie die Software festschreiben, ist es einfacher, die von Ihnen erstellte Software zu testen. Ein Unternehmen, das Komponententests erstellt, nachdem Produktionscode geschrieben wurde, um eine Checkliste zu erfüllen, verschwendet Aufwand.

Die Integration in vorhandene, schwer zu testende Software verursacht zusätzlichen Aufwand, da Sie Testnähte erstellen müssen, um die Abhängigkeiten zu kontrollieren, die Ihr glänzender neuer, testgetriebener Code verbraucht. In einigen Fällen, wie zum Beispiel bei Frameworks, die stark von globalen Staats- und Gottobjekten Gebrauch machen, kann dies sehr schwierig zu erreichen sein. Die wahrgenommene Schwierigkeit einer testgetriebenen Entwicklung beruht häufig auf einer Kombination aus Unerfahrenheit beim Schreiben guter Tests und dem Versuch, eng gekoppelten Code zu testen.

Sie können den Drive Code auch in einem Wasserfallprojekt testen. Dies ist eine technische Disziplin und keine Projektmanagement-Technik.

Ich bin keineswegs ein TDD-Fan, aber es bringt Ihnen viel über Software-Design bei.

Ryan Roberts
quelle
1
"Wenn Sie danach testen, erstellen Sie eine Überarbeitung, da der Code, den Sie geschrieben haben, schwer zu testen sein wird." Das ist eigentlich nicht wahr. Es wird nur wahr sein, wenn Sie keinen lose gekoppelten Code erstellen. Sind Sie sicher, dass Sie keinen testbaren Code schreiben können , ohne ihn zuerst zu testen?
Verschlungenes Elysium
@devoured elysium: Ich stimme zu: Das Schreiben von Tests ist nicht die einzige Möglichkeit, testbaren Code zu schreiben.
Giorgio
6

Nehmen Sie mich mit, da dies einen unverwechselbaren .Net-Geschmack haben wird: p

In Bezug auf Arten von Projekten, die für den Test-First-Ansatz geeignet sind, möchte ich Folgendes beachten:

  • haben Sie es mit einer vorhandenen Codebasis zu tun? Das Nachrüsten einer Testsuite ist oft unerschwinglich teuer. Machen Sie sich ein Bild davon, wie viel technische Schulden es gibt
  • Bestimmte Plattformen und Frameworks sind von Natur aus testunfreundlich. Jüngste Erfahrungen, die mir in den Sinn kommen - SharePoint zum Beispiel ist für TDD sehr schwierig (aber nicht unmöglich). Für solche Dinge müssen Sie möglicherweise auf ein kommerzielles Isolatorprodukt zurückgreifen, wie TypeMock.
  • Bestimmte Implementierungsansätze eignen sich besser für TDD als andere. Zum Beispiel ASP.Net mit Code-Behinds - nicht so testbar. ASP.Net MVC - testbar. Silverlight mit Code-Behinds - nicht so testbar. Silverlight mit MVVM - testbar.

Letztendlich kann "die Organisation" zwar viel dazu beitragen, die Umstellung auf Test-First zu unterstützen, aber der entscheidende Wandel, der stattfinden muss, liegt in den Köpfen der Entwickler. Ich habe den Ansatz "Du sollst zuerst deine Tests schreiben" aufgegeben und suche stattdessen nach lehrbaren Momenten.

+1 zu mpenrows Kommentar, dass sie mgmt nicht mitteilen sollen, wenn sie ein Problem damit haben: p

HY
quelle
1
Gut gesagt. Ein großes Problem entsteht, wenn eine große Menge an technischen Schulden vorliegt, da Sie zu diesem Zeitpunkt noch nicht einmal mit der Implementierung von Tests beginnen können und die Anwendung nicht neu schreiben können, um die technischen Schulden zu beseitigen Es müssen so viele zusätzliche Funktionen abgeschlossen werden.
Wayne Molina
6

Ihre Situation wird sich nicht schnell ändern, und der Schlüssel, um es zu schaffen, besteht darin, es zu einem Teil Ihrer persönlichen Disziplin zu machen und darin gut zu sein, bevor Sie versuchen, es anderen aufzuzwingen. Wenn Sie als Beispiel dienen können, sollten Ihre Manager objektive Vorteile sehen.

Sie können auch gute Business Cases erstellen:

  • TDD kann einfach als "Spezifikation, anhand derer sich das System automatisch verifizieren kann" zusammengefasst werden. Es wird nicht anders programmiert, es wird kein anderes Produkt erstellt.

  • Unit Testing ist eigentlich nur eine Form des automatisierten Testens. Das heißt, Sie lassen den Computer für sich selbst tun, wofür das Unternehmen wahrscheinlich Fleischraumingenieure manuell bezahlt. Automatisierte Tests werden schneller, konsistenter ausgeführt und liefern - wenn sie gut geschrieben sind - schnelles, präzises und genaues Feedback sowie Beschreibungen und Anweisungen für das Problem

  • Wenn TDD von jemandem ausgeführt wird, der weiß, was er tut, führt dies genauso schnell zu Ergebnissen wie Code-First. Es wird eine Lern- / Schulungskurve geben (und wenn Ihre Ingenieure aus dem unteren Bereich des Talentpools stammen, kann dies Ihre Chancen, TDD voranzutreiben, völlig zunichte machen. In diesem Fall ist es das Beste, das Sie tun können, um es weiter zu fördern und das Management fragen sie eher als TDD)

  • Bei TDD geht es vor allem darum, die anstehende Aufgabe zu überdenken, bevor sie gestartet wird. Es entspricht dem Motto "zweimal messen, einmal schneiden" - die zusätzliche Messung verlängert die Aufgabe geringfügig, vermeidet jedoch, Ihre wertvollste Ressource - die Entwicklungsstunden - wegzuwerfen.

... und erinnere dich einfach; Das Wichtigste, was Sie tun können, ist, mit gutem Beispiel voranzugehen. Wenn Sie sich mit TDD nicht so gut auskennen, investieren Sie ein paar zusätzliche Stunden, um besser zu werden. Sobald Sie sich auskennen, fangen Sie einfach bei der Arbeit an (würden sich Ihre Manager wirklich darüber beschweren, dass Sie Tests schreiben?). Kämpfe einen Kampf nach dem anderen und mache Schritte darauf zu - wenn du den ganzen Schebang spielst, wirst du wahrscheinlich scheitern und die Schuld liegt bei dir, wenn du hart dafür drängst.

STW
quelle
2

Ich mache. Es ist meine bevorzugte Art der Entwicklung, und ich arbeite für ein großes Finanzunternehmen, das sich freut, dass ich so arbeite, wie ich es für richtig halte, solange ich die Fristen einhalte und Qualitätscode produziere. Bei korrekter Ausführung muss die Entwicklung des ersten Tests nicht länger dauern als die Entwicklung nach dem Test. Vergessen wir auch nicht, dass die anderen Tests weniger Fehler aufwiesen, die später beim Testen des Systems anfielen.

Chris Knight
quelle
2

Der Schlüssel zum Ausführen von TDD besteht darin, es einfach als Teil des Schreibens Ihres Codes zu tun, und falls erforderlich, sagen Sie niemandem, dass Sie es tun. Es ist nicht notwendig, alles zu erklären, was Sie tun. Ihr Endergebnis ist Arbeitscode.

Wenn du erklärst "Ich schreibe Tests", dann können die Mächte sagen "Oh, wir können das beseitigen!" Aber wenn Sie niemandem davon erzählen, dann haben Sie immer noch die Tests als Rest des Codierungsprozesses.

Programmieren ist mehr als das Eintippen von Arbeitsanweisungen in einen Editor. Wenn die Leute damit nicht umgehen können, dann schütze sie vor dieser Wahrheit, bis sie bereit sind, damit umzugehen. "Bereit, damit umzugehen" bedeutet in diesem Fall, dass Sie ein oder zwei abgeschlossene Projekte pünktlich mit soliden, zuverlässigen Codes abgeschlossen haben und dass Sie auch Unit-Tests dafür haben.

Andy Lester
quelle
Angenommen, Sie haben ein bestimmtes Modul implementiert und nach dem Schreiben von Komponententests und dem Implementieren der entsprechenden Klassen und Methoden sehen Sie, dass Ihr Design fehlerhaft ist und Sie einige Klassen (und die entsprechenden Komponententests) wegwerfen müssen? Wäre es nicht zeitsparend, mit dem Schreiben der Komponententests zu beginnen, wenn sich das Design etwas stabilisiert hat, dh wenn Sie genug Klassen für dieses Modul implementiert haben, damit die Gesamtstruktur klar genug wird?
Giorgio
2

Leider habe ich selbst keine Chance bekommen, es im wahrsten Sinne des Wortes zu benutzen, also kann ich nicht "Ich! Ich! Ich mache es!" Sagen. Ich gehe davon aus, dass sich die Frage stellt, "welche Branchen / Unternehmen TDD auf breiter Front einsetzen" und nicht "ob jemand TDD in ihr tägliches Leben einschleichen kann". Ich bin damit einverstanden, dass ein einzelner Entwickler TDD vollständig ausführen kann, ohne dass die gesamte Gruppe dazu gezwungen wird. Ich denke nur, das war nicht der springende Punkt.

Mein Eindruck von der Branche ist, dass Sie TDD mit größerer Wahrscheinlichkeit in den meisten Entwicklungsgruppen eines Unternehmens in Situationen sehen, in denen:

  • Vor der Einführung von TDD war keine große Codebasis vorhanden

  • Das Unternehmen ist nicht riesig und hat daher nicht viele Pushbacks "Wir haben es immer in die andere Richtung gemacht".

  • Das Unternehmen hat keinen enormen Buy-In für den formalisierten Prozess. Das heißt nicht, dass Sie TDD nicht beispielsweise in einem CMMI-zertifizierten Unternehmen implementieren konnten. Wenn Sie jedoch einen Nicht-TDD-Prozess hatten, kann es eine große Investition sein, alle Prozesse, die Sie mit CMMI überwachen, zu aktualisieren.

  • Tests können mit Skripten erstellt werden - dies ist eine äußerst komplexe Codebasis, da Sie auch dann einige der internen Skripten erstellen können, wenn Sie die dem Benutzer am nächsten liegende Ebene nicht einfach skripten können. Aber ich sehe Situationen mit gut entwickelten Optionen für die Testautomatisierung als die besten Punkte für TDD an, da es darauf beruht, eine ganze Reihe von Tests erneut auszuführen und nicht zu unterbrechen, bei denen Sie sehr schnell Feedback zum Testen benötigen. Meiner Meinung nach ist eine eigenständige Web-App ein gutes TDD-Ziel. Ein System mit umfassender COTS-Integration oder Eingaben, die nicht auf der Benutzeroberfläche basieren, kann schwierig sein.

  • Systeme in einem nicht prototypisierten Zustand. Idealerweise die nächste große Version nach dem Prototyp - wo der Proof of Concept abgeschlossen ist und das Projekt finanziert wird, aber jeder weiß, dass der nächste Versuch einen Qualitätssprung bedeuten muss.

  • Stakeholder, die in den Prozess investiert sind.

bethlakshmi
quelle
2
+1 für den ersten Punkt allein; Um TDD richtig durchzuführen, können Sie keine große, investierte Codebasis ohne TDD (oder Tests im Allgemeinen) erstellen. Wenn Sie dies tun, werden Sie es wahrscheinlich nie hinzufügen können, da Sie entweder A) die gesamte Anwendung nachrüsten müssten, um das Testen zu unterstützen, da es höchstwahrscheinlich nicht mit den richtigen Abstraktionen zum Komponententest geschrieben wurde, oder B) die das Ganze von Grund auf neu und nutzen Sie TDD von Anfang an.
Wayne Molina
2

Ich habe es versucht, wo es möglich ist - aber ich denke, es hängt wirklich von der Unternehmensumgebung ab, in der Sie sich befinden. Ich habe viele Jahre in der Spieleindustrie gearbeitet (übrigens als Künstler), und es gab kein Konzept für TDD - nur einen Brute-Force-QA-Ansatz. Ich bin in die Webentwicklung eingestiegen und habe noch nicht in einer Agentur mit einer formalen Anerkennung (oder Kenntnissen von ...) von Unit Testing / TDD gearbeitet. Gleiches gilt für die meisten meiner Kollegen in der Branche, die in einem breiten Spektrum von Disziplinen arbeiten.

In einer vertriebsorientierten Agentur bietet TDD dem Kunden nur einen sehr geringen kurzfristigen ROI. Daher ist es schwierig, ihn bei der Planung eines Projekts an die Vorgesetzten zu verkaufen. Je größer ein Projekt wird, desto überzeugender wird es.

Angesichts der Tatsache, dass Bücher wie der Todesmarsch auf ein weit verbreitetes Phänomen hinweisen, dh auf eine Branche, die von "Crunch" - und "Milestone" -getriebenen Entwicklungen geplagt wird - wette ich, dass TDD außerhalb gut finanzierter Startups oder monolithischer Unternehmensshops wahrscheinlich selten ist. Es ist nicht so, dass die Menschen dort nicht an den Wert von TDD glauben - aber es ist zu abstrakt, um es an ihre Kunden zu verkaufen.

sunwukung
quelle
2

Ich versuche, selbst in TDD einzusteigen. Ich denke, solange du Routen folgst, die du bereits kennst (die tägliche Arbeit), ist es ziemlich einfach. Aber ich kann mich einfach nicht mit Tests für die Benutzeroberflächenteile beschäftigen oder wenn Sie eine neue Lösung für ein Problem finden müssen, auf das Sie noch nie gestoßen sind. Oder mit einem Framework, das Sie nicht kennen.

Ich denke, Sie müssen eine Art von Lerntests durchführen, separate Proof-of-Concept-Tests durchführen und diese anschließend umschreiben, usw., oder irre ich mich?

Und (ich weiß, dass es eine alte ist, aber ich habe noch keine gute Antwort gesehen): Wie codieren Sie Algorithmen mit TDD (wenn die Ergebnisse zu komplex sein könnten, um sie wirklich mit Leichtigkeit zu "behaupten")?

Ich kann die positiven Seiten von TDD und ich auf dem Boot wirklich sehen, aber es ist sehr schwierig für Anfänger, wenn der Code, den Sie schreiben, Sie fast doppelt so lange braucht (und Sie haben Kollegen, die die Profis überhaupt nicht sehen und Sie verspotten mit RAD)

Carsten
quelle
1

Ich habe es ein paar Mal versucht und es hat super funktioniert. Leider verschiebe ich die meiste Zeit, wenn ich meine App manuell testen kann, Unit-Tests, bis ich mich zu gelangweilt fühle, um etwas anderes zu implementieren, oder es gibt einen Fehler, den ich nicht einfach beheben kann.

Alexandru
quelle
Der Vorteil kommt später, weil Sie das Verhalten im Grunde genommen als Code dokumentieren. Jede Codeänderung muss die Tests bestehen oder das Verhalten hat sich geändert.
1

Ich tue es. Der Fortschritt unserer User Stories wird auf einem Kanban-Board mit der Aufschrift "Has a Test?" Spalte links (stromaufwärts) von Development.

Dieses etwas ungewöhnliche Layout macht eine Richtlinie explizit: Es muss ein fehlgeschlagener automatischer Abnahmetest (in der Regel einige davon) vorhanden sein. Es muss auf eine Kundenanforderung rückführbar sein. Die Abnahmetests ergeben sich aus Zufriedenheitsbedingungen , die aus Gesprächen resultieren , die mit einer Story Card beginnen . Ich führe regelmäßige Workshops durch, in denen wir Brainstorming-Anforderungen durchführen, Lücken identifizieren und die wichtigsten Akzeptanztests herausfinden, mit denen sichergestellt wird, dass der Benutzerwert erreicht wird, wenn sie bestanden werden (die Definition von erledigt ). Es ist eine gemeinschaftliche Aktivität, an der Programmierer, Geschäftsanalysten und manchmal Tester beteiligt sind.

Die Feedbackschleife zum Akzeptanztest ist ziemlich lang: Es kann mehrere Tage dauern, bis die Story fertig ist. Die Entwicklung hat ihre eigenen, kürzeren TDD-Rückkopplungsschleifen.

"[... kein Test-First-Style ...] ähnlicher wie Agile ...."

Dies ist eine vollständige Falschdarstellung von Agile. Die Definition von erledigt ist eine Schlüsselkomponente von Agile und eine der Säulen, auf denen es beruht, ist das automatisierte Akzeptanztesten (was ich oben beschrieben habe, ist eine Möglichkeit, dies zu tun.) Wenn extreme Programmierung (XP) als agile Implementierungsmethode verwendet wird, dann ATDD / BDD und TDD sind vorgeschrieben.

Azheglov
quelle
1

Das tue ich, aber im Allgemeinen nur für Nicht-UI-Komponenten, und wenn ich weiß, dass ich nicht den gesamten Algorithmus für ein Modul auf einmal im Kopf behalten kann, oder wenn das Modul ein neuer Teil des Systems ist, an dem ich arbeite, Daher kann ich mich nicht darauf verlassen, dass die meisten Bibliotheken, die ich verwende, stark getestet wurden.

Im Grunde tue ich das, wenn die Komplexität der Anforderungen bedeutet, dass ich mich sonst im Code verlieren könnte.

Es ist eine schwierige Angewohnheit, mit dem Management-Buy-In zu beginnen, aber wenn Ihre Tests nach der Hälfte der Entwicklungszeit abbrechen, kann dies lebensrettend sein!

Johnc
quelle
1

Ich wollte genau diese Frage stellen, um zu sehen, wie viele Unternehmen tatsächlich TDD praktizieren.

In den elf Jahren, in denen ich beruflich programmiert habe, waren sich nur die letzten beiden Organisationen überhaupt der Verbreitung von TDD bewusst (dies erstreckt sich über fast fünf Jahre, bevor TDD nicht mehr so ​​populär war wie heute). Ich komme auf den Punkt und beantworte Ihre Frage, bevor ich mich mit meinem Verkaufsargument für TDD beschäftige :)

Bei der letzten Firma, für die ich gearbeitet habe (akademischer Online-Verlag für geistes- und naturwissenschaftliche Sammlungen), wussten wir, dass wir TDD praktizieren mussten, aber wir sind nie ganz dort angekommen. Zu unserer Verteidigung hatten wir eine 250-KB-Codebasis, sodass das Hinzufügen von Tests zu einer nicht testbaren Codebasis dieser Größe als unüberwindlich empfunden wurde (ich habe das Gefühl, dass ich das jetzt schreibe!). Auch die Besten von uns machen Fehler .

Wer auch nur eine kleine Menge von TDD weiß , wie schmerzhaft Nachrüsten Tests braun Feld untestable Code getan werden kann ... Die Hauptursachen sind implizite Abhängigkeiten (Sie alle Hebel assert Ergebnisse aus dem Code nicht ziehen kann - nicht Mock können Szenarien) und Verletzung des Einzelverantwortungsprinzips (Tests sind kompliziert, erfunden, erfordern zu viel Setup und sind schwer zu verstehen ).

Wir haben unser QA-Team vorübergehend erweitert (von einem, vielleicht zwei Personen auf ein halbes Dutzend oder mehr), um die Plattform vor jeder Veröffentlichung zu testen . Es war sehr zeitaufwändig und finanziell gesehen, einige Veröffentlichungen würden drei Monate dauern, um das Testen abzuschließen. Schon damals wussten wir, dass wir Probleme hatten, sie waren einfach keine „Blocker“ oder „Kritisch“, sondern nur „Hochpriorität“.

Wenn Sie über jahrelange Erfahrung im kaufmännischen Bereich verfügen, werden Sie zu schätzen wissen, dass jedes Unternehmen kritische Aufgaben wahrnimmt und dann eine höhere und höchstwahrscheinlich auch eine höhere Prioritätsstufe einführt - insbesondere, wenn jemand von oben ein Feature / eine Fehlerbehebung vorantreibt. Ich schweife ab ...

Ich freue mich, Ihnen mitteilen zu können, dass ich in meinem derzeitigen Unternehmen (Entwicklungshaus für Telekommunikation, Web und mobile Apps) TDD praktiziere, zusammen mit Jenkins CI, um andere statische Analyseberichte zu erstellen (die Codeabdeckung ist am nützlichsten, nachdem die Testsuite bestanden wurde). . Die Projekte, für die ich TDD verwendet habe, sind ein Zahlungssystem und ein Grid-Computing-System.

Das Verkaufsgespräch ...

Es kann oft ein harter Kampf sein, der automatisierte Tests für nichttechnische Teammitglieder rechtfertigt. Das Schreiben von Tests erhöht zwar den Entwicklungsaufwand, aber ... die Zeit, die Sie jetzt in das Testen investieren, spart Ihnen später Wartungsaufwand. Sie leihen sich wirklich nur Zeit . Je länger das Produkt in Gebrauch ist, desto mehr sparen Sie - und desto weniger müssen Sie umschreiben .

Zuerst testen bedeutet, dass Sie zuerst Ihre Absicht codieren und dann bestätigen, dass Ihr Code diese Absicht erfüllt. Dies bietet Fokus und destilliert Ihren Code, um nur das zu tun, was beabsichtigt ist und nicht mehr (read no bloat). Es ist gleichzeitig eine ausführbare Spezifikation und Dokumentation (wenn Ihr Test gut geschrieben ist und die Tests so lesbar / sauber sein sollten wie Ihr Systemcode, wenn nicht mehr!).

Nicht-Programmierer werden (oft) nicht über diese Einsicht verfügen und daher ist TDD für sie nicht besonders wertvoll und wird als Wegwerfverknüpfung zu einem früheren Veröffentlichungsdatum angesehen.

Das Programmieren ist unsere Domäne, und aus meiner Sicht liegt es in unserer Verantwortung , als Profis Empfehlungen für bewährte Verfahren wie TDD abzugeben. Die Projektmanager müssen nicht entscheiden, ob dies zur Verkürzung der Entwicklungszeit erfolgt, da dies außerhalb ihrer Zuständigkeit liegt . Ebenso wenig teilen sie Ihnen mit, welches Framework, welche Caching-Lösung oder welcher Suchalgorithmus verwendet werden soll, und sie sollten Ihnen nicht mitteilen, ob Sie automatisierte Tests durchführen sollen.

In meiner Meinung nach ist die Software - Entwicklung der Industrie (im Großen und Ganzen) derzeit unterbrochen, die Tatsache , dass Tests für Ihre Software zu haben ist nicht die Norm.

Stellen Sie sich das in anderen Branchen vor: Medizin, Luftfahrt, Automobil, Kosmetik, Plüschtiere, alkoholische Getränke usw. Ich habe meine Verlobte gebeten, eine Branche zu nennen, in der das Produkt nicht getestet wird und sie es nicht konnte!

Vielleicht ist es unfair zu sagen, dass keine Tests stattfinden, weil dies der Fall ist ... aber in Unternehmen ohne automatisierte Tests ist dies ein sehr manueller / menschlicher Prozess (Lesen klobig und oft fehleranfällig).

Einen Punkt möchte ich in Ihrer Frage ansprechen ...

Sie wollten normalerweise, dass die Entwicklung sofort oder nach einer kurzen Designpause beginnt. Mehr wie bei Agile.

Da "Agile" keine Vorgehensweise ohne Tests vorschreibt, ist Kent Beck , der Schöpfer von XP und TDD , das erste auf agilemanifesto.org aufgeführte Mitglied !

Zwei Bücher, die ich wärmstens empfehlen kann, wenn Sie an TDD interessiert sind oder sie einfach nicht gelesen haben und ein begeisterter Programmierer sind (lesen das alle richtig?;)

Wachsende objektorientierte Software, die von Tests geleitet wird

Sauberer Code - Serie von Robert C Martin ("Onkel Bob")

Diese beiden Bücher ergänzen sich und verdichten viel Sinn auf wenige Seiten.

Danke, dass du diese Frage gestellt hast :)

Greg K
quelle
0

Diejenigen, die Klone implementieren. Ich kann mir keinen besseren Prozess vorstellen, wenn Sie etwas entwickeln, das genau wie ein bestehendes Programm funktioniert.

P Shved
quelle
Gleiches gilt für das Prototyping / Exploration. Anstatt es zu hacken, bis es richtig aussieht, definieren Sie, was "richtig aussieht" bedeutet. (Dies gilt nicht, wenn Sie einen Menschen brauchen, der sagt, dass er richtig aussieht.) Und dann hacken Sie, bis Sie den grünen Balken erhalten.
Frank Shearar
0

Offensichtlich ist dies ein ziemlich ungewöhnlicher Fall, aber die Entwickler von SQLite verwenden Tests ausgiebig. (Ich gehe davon aus, dass der Entwicklungsprozess zuerst getestet wird, obwohl ich mir nicht sicher bin.)

  • 73.000 Codezeilen
  • 91.378.600 Zeilen Testcode

Siehe http://www.sqlite.org/testing.html

Paul D. Waite
quelle