2009-02-26 6 views
8

Ich sehe den Nutzen von TDD, und ich versuche zu lernen, wie man meinen Kopf darum wickelt. Ich lese auch mehr über DDD und möchte beide auf meine Software-Projekte anwenden.Wie weit sollten Sie TDD anwenden?

Ich habe ein paar "Hands on" Programmierbücher gekauft (von "hands on" meine ich diejenigen, die eine echte Weltanwendung mit echten Lösungen im Gegensatz zu kleinen Schnipsel diskutieren) und ich habe bemerkt, dass sie typischerweise anfangen zu definieren die "Infrastruktur" -Schicht der Anwendung in traditioneller Code-First-Mode, im Gegensatz zur Verwendung von TDD; Beide Bücher geben sich alle Mühe, um zu diskutieren, wie gut TDD ist und wie die Fallstudie es nutzen wird.

Zum Beispiel in einem der Bücher, ASP.NET 3.5 Social Networking entwickelt das gesamte zweite Kapitel enthält eine Logging-Wrapper-Klasse, E-Mail-Wrapper-Klasse, Cache und Session-Wrapper-Klassen (und die dazugehörigen Schnittstellen) alle ohne Berührung nach einem Einzeltest. Ein anderes Buch, .NET Domain Driven Design mit C#: Problem, Design, Lösung tut ähnlich, und erstellt eine Basisklasse und Repository-Framework Code-zuerst vor sogar auf den "echten" Code zu berühren.

Ich verstehe, dass Sie die tatsächliche Logik und Funktionalität Ihrer Domain-Klassen testen sollten. Ich hatte gedacht, dass der "do not plumbing" Code nur auf Code angewendet wird, den Sie nicht geschrieben haben (zB integrierte .NET Klassen), aber was ich lese scheint darauf hinzuweisen, dass Sie nur den Code testen sollten Das hat tatsächlich mit Ihrer Anwendung zu tun und nicht mit den Klempnerarbeiten, die Sie schreiben, um eine Grundlage zu schaffen.

Ist dies eine akzeptable Art der Anwendung von TDD?

Antwort

2

Es hängt wahrscheinlich von anderen Faktoren ab, wie Sie Ihr Projekt aufbauen möchten.

Wenn Sie andere Agile-Praktiken wie kleine Iterationen und Auslieferungen befolgen, haben Sie am Anfang nicht viel von einer Architektur oder Infrastruktur, weil Sie währenddessen keine Zeit haben, sich viel zu entwickeln Implementierung und Bereitstellung der ersten paar Funktionen. Wie auch immer, warum sollten Sie Zeit mit Big Design Up Front verbringen, wenn Sie nicht wirklich wissen, was der Code benötigt?

So erstellen Sie Ihren Code-Test zuerst und über eine Reihe von Iterationen. Testabdeckung bedeutet, dass Sie Ihren Entwurf umgestalten können, was (theoretisch) genau die richtige Infrastruktur für die Anwendung ermöglicht, so wie sie zu jedem Zeitpunkt existiert. Ron Jeffries explains it well here. Ohne die Tests werden Sie wahrscheinlich einen Punkt erreichen, an dem Sie aufhören und herausfinden müssen, wie die Struktur aussehen soll. Das wird Zeit brauchen, die Sie besser für den Aufbau nützlicher Funktionen aufwenden können und die Sie benötigen Am Ende trotzdem testen.

Wenn Sie zu 100% sicher sind, dass Sie das Design richtig entwerfen können, bevor Sie einen Code geschrieben haben, dann haben Sie die Wahl. Stellen Sie sicher, dass Sie viel Zeit für das Testen in dem Projekt lassen. Ich denke, jeder sollte mindestens eine bedeutende Arbeit sowohl durch den "traditionellen" Wasserfall-Prozess als auch durch einfaches Eintauchen und Kodieren aufbauen, um etwas Erfahrung zu sammeln, die die agilen Praktiken in einen Kontext bringt. Sonst besteht die Gefahr, "was" zu kennen, ohne "warum" zu wissen, und das macht den Unterricht schwieriger zu lernen.

1

Ich bin kein Experte hier.

Aber wenn Sie Sanitärkomponenten entwickeln, sollte es getestet werden.
Wenn ich richtig verstehe, mit TDD, Code gegen Schnittstelle & in Abwesenheit von Sanitär-Komponenten geschrieben, verwenden Menschen Mock Objekte.

0

Ich ging in einiger Länge in another question. Im Grunde ist der Sinn der Verwendung von TDD und Mocks und all dem Zeug, mehr Vertrauen zu entwickeln.

+0

Das wäre der Punkt der Komponententests, ja. Der Sinn von TDD liegt jedoch darin, Ihre Tests das Design vorantreiben zu lassen. Der Entwurf verbessert sich tatsächlich, wenn Sie Ihre Tests zuerst schreiben, weil Sie dadurch testbaren Code entwickeln und Sie müssen über das Design auf systematische Weise nachdenken, bevor Sie mit dem Schreiben beginnen. – tvanfosson

+0

Und stell dir vor, wenn du dem Link gefolgt wärst, hättest du gesehen, dass ich es sehr ausführlich gesagt habe und genau das gesagt habe. –

+0

Obwohl ich tatsächlich TDD als eine strengere Spezifikation Methode sehe. –

6

Beim Lernen von TDD, wenden Sie alles an. Danach bewerben, was Sie brauchen.

5

Wenn Sie die Rohrleitungen von Grund auf neu schreiben, sollten Sie Tests haben. Wenn Sie nur ein paar Interfaces und Klassen verwenden, um Ihre linq2sql-Aufrufe wegzuspulen, dann würde nein, ich würde nicht unbedingt Unit-Tests darum herum setzen.

Um jemand klüger als ich zitiere:

ich über TDD bin nicht religiös. I halte es für eine Disziplin im Wert von folgenden. Ich schreibe nicht alle meine Tests zuerst . Einige kleine Anzahl von ihnen sind einfach bequemer nach den Code zu schreiben. Es gibt sogar einige Code I schreibe keine Tests für überhaupt, weil es einfach nicht wert ist. Aber das sind Ausnahmen von der Regel. Die große Mehrheit des Codes schreibe ich zuerst Test.

-uncle Bob Martin über: http://www.infoq.com/news/2009/02/spolsky-vs-uncle-bob

0

TDD sollte jedem Code angewendet werden, die Sie entwickeln. Wenn Sie TDD verwenden, müssen Sie nicht alles testen - d. H. Das Ziel ist keine 100% ige Abdeckung - aber die Abdeckung sollte über den von Ihnen entwickelten Code ziemlich hoch sein. Zum Beispiel müssen Sie in C# keine automatischen gettor/settors testen - Sie können darauf vertrauen, dass die Sprache dort ihre Aufgabe erfüllt. Im Zweifelsfall schreiben Sie zuerst den Test.

0

Schreiben Sie Code zuerst, um Erfahrung mit einer Plattform zu sammeln - seien Sie einfach mutig und werfen Sie sie weg, sobald Sie sicher sind, dass Sie die meisten Aufgaben auf dieser Plattform bewältigen können. Ich habe das gerade mit einem kleinen Java-Programm getan, das ich gestartet habe.
Jetzt, da ich einige Erfahrung gesammelt habe, kann ich sehen, was ich tun muss, um eine sehr hohe Leitungsabdeckung zu bekommen, jetzt, wo ich anfange, es zuerst zu schreiben, sogar die meisten Rohrleitungen.

2

Wenn Sie etwas Code testen und anderen Code nicht testen, welcher Code wird die Fehler haben?

Hinweis: es ist der ungeprüfte Code.