TDD: Was passiert vor dem ersten Unit Test?

17

Ich verstehe meistens die Theorie der TDD, aber ich kann nicht herausfinden, wie ich anfangen soll. Ich setze mich hin, um einen Unit Test für ein persönliches Projekt zu schreiben und umzusetzen. . . Ich habe keine Ahnung, was ich teste. Welche Objekte, welche Funktionen usw.

Nehmen wir zum Beispiel an, ich möchte eine App schreiben, die unserer Familie dabei hilft, Hausarbeiten zu erledigen. Ich habe folgende Fragen: Wie komme ich von dieser Idee zu meinem ersten Test? Wie viel sollte entschieden werden, bevor ich anfange, und wie viel muss ich herausfinden, nachdem ich angefangen habe, Tests zu schreiben? Wann entscheide ich mich für das Speichern von Daten in einer Textdatei oder einer Datenbank? Sollte ich Benutzerakzeptanztests durchführen lassen, bevor ich anfange? Soll ich die Benutzeroberfläche gestalten lassen? Soll ich eine Spezifikation haben? (Mir ist zumindest klar, dass sich einige dieser Beispielfragen wahrscheinlich in einer "Grauzone" befinden.)

Können Sie neben der Titelfrage zum ersten Komponententest auch ein Beispiel geben, wie der erste Komponententest für ein Projekt wie das Beispielprojekt aussehen könnte?

Ethel Evans
quelle
5
Ich empfehle dringend, das GOOS-Buch von Nat Pryce und Steve Freeman zu lesen. Es gibt einige großartige Informationen darüber, wie man einen End-to-End-Test mit einem „dünnen Stück“ Funktionalität bestehen kann.
leer

Antworten:

6

Ich beginne gerne mit einer Liste von Features und schreibe für jedes Feature die User Stories, dann schreibe ich für jede Story Testbeschreibungen.

Denken Sie ein wenig über das Design nach, wählen Sie dann eine Testbeschreibung und beginnen Sie mit der Codierung: Rot-Grün-Refaktor.

Wiederholen, bis alle Tests bestanden sind.

Ja, Akzeptanztests sollten als Teil davon betrachtet werden und der entsprechenden Geschichte beigefügt werden.

Steven A. Lowe
quelle
Ich mag das. Es ist ein sehr klarer Prozess, dem ich folgen kann: Auflisten von Features, Erstellen einer Unterliste von User Storys für jedes Feature, Erstellen einer Unterliste von Tests für jede User Story. Ich werde diesen Prozess versuchen.
Ethel Evans
Ich akzeptiere dies, weil es das anspricht, was ich persönlich wissen wollte, aber ich empfehle, dass die Leute auch die (positivere) Antwort von Carl lesen.
Ethel Evans
18

Sie haben von Anfang an herausgefunden, wie es bei TDD um Design geht . Bevor Sie Ihren ersten Test schreiben, müssen Sie sich überlegen, wie Ihre erste Funktionalität aussehen wird und wie Ihr Programm aussehen würde, wenn diese Funktionalität funktionieren würde.

Entwickler, die TDD nicht verwenden, müssen auch darüber nachdenken - aber sie können "einfach eintauchen" und anfangen, irgendetwas zu schreiben. Aber "irgendetwas, irgendetwas" ist nicht immer auf dem Weg, das Programm zu liefern, von dem Sie dachten, Sie wollten es schreiben. Was ist? Wie würde Ihr Programm aussehen, wenn es funktionieren würde? Welche Tests würde es bestehen?

Ich möchte eine App schreiben, die unserer Familie dabei hilft, Hausarbeiten zu erledigen.

Cool. Wenn diese App funktionieren würde, was würde sie tun? Nun, ein Job könnte wahrscheinlich einer Person zugewiesen werden, oder?

Person fred = new Person("fred")
Chore mow = new Chore("mow the lawn");
mow.assignTo(fred);
assertEquals(fred, mow.whoIsAssigned());

Es gibt einen Anfang. Nicht der Ort, an dem man anfangen muss, nicht unbedingt der beste Ort, an dem man anfangen muss - aber es ist ein Ort. Es ist etwas, das Ihr Code unterstützen soll (obwohl ich mir sicher bin, dass Sie sich bessere Namen einfallen lassen können). Fangen Sie dort an und beobachten Sie, wie es versagt. Lass es passieren. Mach es sauber. Aufschäumen, ausspülen, wiederholen.

Carl Manaster
quelle
Ich mag das Beispiel nicht, aber ich stimme der Prämisse zu; Test-First-Methoden sind nur sinnvoll, wenn Sie in der Lage und gewillt sind, zumindest einiges im Voraus zu entwerfen. Tatsächlich benötigen Sie in der Regel ein Modell für eine Skelettdomäne oder zumindest einen beträchtlichen Teil davon.
Aaronaught
5
Hier gibt es kein Design von vorne. Keine der Klassen im Test muss noch existieren. Das Design findet im Test statt, DANN werden sie erstellt, um den Test zu bestehen.
Torbjørn,
Könnten Sie näher erläutern: "Bevor Sie Ihren ersten Test schreiben, müssen Sie sich überlegen, wie Ihre erste Funktionalität aussehen wird und wie Ihr Programm aussehen würde, wenn diese Funktionalität funktionieren würde." Wie viel sollte ich trainieren, bevor ich anfange? Ab wann überarbeite ich mein Design und verliere den Vorteil, dass meine Komponententests mein Design bestimmen? Ich nehme an, ich möchte keine Klassendiagramme, die durch Refactoring gesteuert werden sollten, oder? Aber dieses Beispiel klingt wie "Haben Sie eine Idee, investieren Sie 15 Sekunden in Gedanken und schreiben Sie dann einen Test." Ist das wirklich alles, was ich tun möchte?
Ethel Evans
2
@Ethel Ja, das ist ungefähr so ​​viel überlegt, wie ich empfehlen würde (sowohl im Beispiel hier als auch im Allgemeinen). Finden Sie etwas Testbares heraus, das Sie zu dem gewünschten Produkt führt, und schreiben Sie dann einen Test dafür.
Carl Manaster
1
Wie es in einem Team funktioniert, ist eine größere und andere Frage. Und TDD selbst hat nicht viel zu sagen, um die Teamarbeit zu koordinieren. Pair Programming und das Planspiel können dabei helfen. Im Rahmen Ihrer Planung gilt TDD weiterhin. Auch Scrum hat etwas darüber zu sagen, wie man die Arbeit eines Teams plant.
Carl Manaster
5

Ja, TDD hat dieses Problem. Deshalb empfehle ich jetzt Behavior Driven Development.

Starten Sie manuell. Schreiben Sie etwas Ähnliches wie eine User Story auf:

  • Als Benutzer
  • Wenn ich In den Warenkorb wähle, soll das Produkt transparent im Hintergrund hinzugefügt werden
  • Damit ich mein Einkaufserlebnis ungestört fortsetzen kann

Was sind nun die Merkmale, die dieses Ziel unterstützen (der Teil "So das")?

  • Wenn ein Artikel in den Warenkorb gelegt wird
    • Der Warenkorb für den Benutzer enthält den neuen Artikel
    • Die Gesamtzahl der Artikel im Warenkorb erhöht sich um eins
    • Der Benutzer sollte nicht weitergeleitet werden
    • Eine Option zum Auschecken ist verfügbar
  • Wenn sich zwei Artikel im Warenkorb befinden und der Benutzer das Auschecken wählt
    • Der Benutzer wird zur Checkout-Seite weitergeleitet
    • Beide Elemente sind sichtbar

Dies sind alles Dinge, die Sie manuell überprüfen können und sollten.

Mach das für eine Weile. Suchen Sie dann wie ein guter Entwickler nach Möglichkeiten, redundante Teile zu automatisieren. Dies hängt von Ihrer Plattform ab, die meisten bieten jedoch angemessene Frameworks an.

.Net hat WatiN für die Automatisierung von Webseiten oder, wenn Sie eine API testen möchten, würde ich den Zusatz Subspec zu xUnit oder MSpec empfehlen das unterstützt diesen Denkstil).

Ruby hat Gurke für das Testen der Automatisierung und rspec für das Testen der API auf niedrigerer Ebene

Javascript hat Jasmin und qUnit.

Punkt Punkt Punkt

George Mauer
quelle
Es gibt auch
Gurkenklone
@ Carson63000 Ja, aber ich persönlich sehe keinen großen Punkt. Ruby ist eine .Net-Sprache in IronRuby. Erstellen Sie einfach ein IronRuby-Projekt und verwenden Sie die tatsächliche Gurke.
George Mauer
Ich liebe BDD und benutze StoryQ. Vergessen Sie nicht zu erwähnen, dass die Geschichte mit Given / When / Then zu Senarios erweitert werden kann. Da ist einiges passiert Wenn ich das mache Und das Dann erwarte ich das und das. Sehen Sie sich David Starrs Vortrag dazu unter TechEd channel9.msdn.com/Events/TechEd/NorthAmerica/2010/DPR302 an und schauen Sie sich auch StoryQ an, wenn Sie .net storyq.codeplex.com
Bronumski 15.06.11
3

Wie komme ich von dieser Idee zu meinem ersten Test? Wie viel sollte entschieden werden, bevor ich anfange, und wie viel muss ich herausfinden, nachdem ich angefangen habe, Tests zu schreiben?

Teilen Sie Ihre Anwendung in mundgerechte Geschichten auf. ("Als Benutzer möchte ich auf ein Symbol doppelklicken und das Programm starten." Oder "Als Benutzer möchte ich meinen Browser öffnen und zum Programm gehen." Wie auch immer.)

Teilen Sie die Geschichte dann in einige Aufgaben auf. (z. B. ein Projekt in Eclipse erstellen, ein Code-Repository einrichten) Wenn Sie zu einer Codierungsaufgabe gelangen, schreiben Sie Ihren ersten Test.

Wann entscheide ich mich für das Speichern von Daten in einer Textdatei oder einer Datenbank?

Wenn Sie sich nicht sicher sind, wählen Sie diejenige aus, die einfacher zu sein scheint, und tun Sie dies. (wahrscheinlich die Textdatei) Wenn Sie feststellen, dass Sie einen Fehler gemacht haben, überarbeiten Sie. Wenn Ihre Tests gut strukturiert sind, sollten Sie in der Lage sein, das Back-End zu ändern und unbeabsichtigte Nebenwirkungen zu erkennen, die auftreten.

Christopher Bibbs
quelle
3

Ich bin überrascht , dass keine der Antworten einen Hinweis auf der tatsächlichen enthält Sache , dass Sie tun , direkt vor Ihrem ersten Test zu schreiben, das ist eine Testliste zu erstellen . Eine Testliste wird durch die in den anderen Antworten genannten Phasen zum Schreiben und Entwerfen von Storys informiert und ist der direkte Vorläufer für das Schreiben eines Tests, nach dem Sie scheinbar suchen.

Für weitere Informationen zu TDD würde ich Test Driven Development By Example von Kent Beck empfehlen . Er hat auch einen TDD-Screencast , der die Entwicklung einer nicht-trivialen Bibliothek in einem reinen TDD-Stil mit Erklärungen von Kent zu jedem Schritt des Prozesses verfolgt. Ich denke, es ist ein großartiges Beispiel für TDD in der Praxis, auch wenn es (notwendigerweise) in einer künstlichen Umgebung durchgeführt wird.

Rein Henrichs
quelle
0

Vor dem ersten Unit-Test überlegen Sie, was passieren soll und wie Sie das testen würden. Schreiben Sie dann diesen Test, stellen Sie fest, dass er fehlschlägt, und implementieren Sie Code, damit er erfolgreich ist.

Spülen, wiederholen usw.

Für mich ist es wichtig, darüber nachzudenken, wie Sie es testen würden, und es ist das, was Ihr Design antreiben kann.

leer
quelle