Neues Projekt mit TDD starten

10

Ich studiere TDD und habe gelesen, dass es Ihnen auch hilft, das Design der App zu definieren, richtig?

Deshalb habe ich beschlossen, ein neues Projekt zu erstellen, um es besser zu verstehen.

Ich möchte ein einfaches Benutzerregistrierungssystem erstellen, das nach Name, E-Mail-Adresse, Land (wählt eines aus einer Liste aus) und Telefonnummer fragt.

Die Frage ist also ...

Ich habe in VS 2010 eine neue Lösung erstellt, ein neues Testprojekt hinzugefügt und weiß einfach nicht, welche Tests ich schreiben soll!

Welche Tests könnte ich hier schreiben, da dies mir bei der Definition des Designs hilft?

Vielen Dank für jede Hilfe!


quelle
1
Dies hilft Ihnen dabei, zunächst über die zu verwendenden Muster, die zu schreibenden Klassen usw. nachzudenken. - Definieren Sie zunächst eine Klasse, schreiben Sie Testfälle für Methoden und implementieren Sie dann die Methoden nach ihrem Testfall ..
Halfdan

Antworten:

6

Wenn Sie Komponententests schreiben, testen Sie das Verhalten Ihrer Anwendung. Die wichtige Frage ist also, was Ihre Anwendung tut . Hier ist ein Anfang:

[TestFixture]
public class RegistrationTests
{
    [Test]
    public void Should_save_new_user_info()
    {
    }

    [Test]
    public void Should_throw_validation_exception_when_email_already_exists()
    {
    }

    [Test]
    public void Should_format_phone_number_when_country_code_is_us()
    {
    }
}

quelle
Nun, all diese Tests bestehen bereits, was kommt als nächstes? :)
Scott Whitlock
2

Nur ein Testprojekt zu erstellen und einige Testmethoden zu schreiben, ist eine Art TDD, aber meiner Erfahrung nach ist es keine große Hilfe, wenn Sie nicht an einer Bibliothek arbeiten, in der es eine bekannte API gibt und Methodenaufrufe direkt dem entsprechen, was der Benutzer erwartet . Sie müssen die richtige Liste von Tests erstellen, und für eine nicht triviale Anwendung kann dies sehr schwierig sein.

Ich empfehle, SpecFlow auszuprobieren. Es definiert weiterhin Tests, die gut von der Implementierung getrennt sind, und die Struktur der Feature-Dateien zwingt Sie dazu, darüber nachzudenken, was Sie tatsächlich testen.

Wenn Sie ein Feature definieren, schreiben Sie einfach so etwas wie

When a user is saved
Then the user should exist

Da Sie sich zu diesem Zeitpunkt noch nicht in einer Codedatei befinden, sind Sie nicht versucht, über Implementierungsdetails nachzudenken, z. B. welche Methode zum Erstellen eines Benutzers aufgerufen wird oder in welcher Klasse sie implementiert wird. Sie können Tags verwenden, um verschiedene Implementierungen auszuwählen. Auf dieser Ebene spielt es also keine Rolle, ob "Benutzer gespeichert" einen Aufruf von CreateUser oder das Öffnen eines Browsers und das Senden eines Formulars bedeutet.

Sobald Sie die Funktionen definiert haben, werden alle Tests generiert und beginnen zu bestehen, wenn Sie die Schrittdefinitionen und den tatsächlich getesteten Anwendungscode implementieren.

Für eine einfache App können Sie nur die Feature-Dateien erstellen. Für komplexere Anwendungen ist es jedoch hilfreich, vorher eine vollständigere Spezifikation zusammenzustellen. Ich verwende dafür eine iPad-Mindmapping-App, aber Sie können jedes Tool verwenden, mit dem Sie am besten vertraut sind.

Beginnen Sie mit einer Liste von Funktionen auf hoher Ebene wie "Benutzerregistrierung". Diese sind in der Regel zu umfangreich, um Tests direkt zu schreiben. Teilen Sie sie daher in Unterfunktionen auf, die klar definiert werden können und im Allgemeinen einer bestimmten Benutzeraktion wie "Benutzer speichern" oder "Vorhandenen Benutzer anzeigen" zugeordnet werden können.

Für jede dieser Unterfunktionen ist eine Liste von Szenarien erforderlich, die zusammen vollständig definieren, ob die Funktion funktioniert oder nicht. Dazu gehören beispielsweise "Kann einen gültigen Benutzer speichern" und "Ein Benutzer kann nicht mit doppeltem Benutzernamen gespeichert werden".

Wenn Sie diese Liste erstellen, wird im Allgemeinen klar, wo die Struktur angepasst werden muss. Wenn Sie keine Szenariotests für ein Feature erstellen können oder zu viele in einem Feature haben, wird dieses Feature wahrscheinlich unter definiert das falsche Level und muss aufgeteilt oder geändert werden.

Tom Clarkson
quelle
2

Ich fand es gut, meine ersten Experimente mit TDD mit etwas Lesen und Schneiden von Code zu sichern. Der Wikipedia-Artikel zu diesem Thema ist sehr gut und führt Sie zu einer Vielzahl anderer Ressourcen. Achten Sie insbesondere auf Dinge von Kent Beck - eine Art Vater von TDD.

Eine andere Sache, die Ihnen helfen könnte, in Schwung zu kommen, ist das Ausführen einiger Katas - einfache, fast sinnlose Trainingsübungen. Roy Osherove hat einige gute.

Denken Sie darüber hinaus an die wichtigsten Ideen von TDD - schreiben Sie jeweils einen Test und fahren Sie erst fort, wenn alle vorherigen Tests bestanden sind. Schreiben Sie nur genug Code, um den aktuellen Test zu erfüllen. Vermeiden Sie die Versuchung, mehr zu schreiben. Halten Sie ab und zu an und überlegen Sie, ob Sie entweder den Code oder die Tests bereinigen können. Entwickeln Sie sich immer in einem roten (nicht bestandenen Test), grünen (bestandenen Test) Refaktorzyklus.

Und um Ihnen den Einstieg zu erleichtern, beginnen Sie vielleicht mit Ihrer Namensanforderung. Was wirst du brauchen?

Sie werden wahrscheinlich eine Klasse brauchen. Schreiben Sie einen Test dafür (einige Leute überspringen dies, aber wenn Sie anfangen, machen Sie es für die Übung) und schreiben Sie die Klasse.

Als nächstes muss Ihre Klasse einen Namen speichern. Schreiben Sie einen Test, der beweist, dass Ihre Klasse dies tatsächlich kann. Schreiben Sie dann erneut Code, um den Test zu bestehen.

Dann haben Sie vielleicht noch mehr Geschäftsregeln. Vielleicht möchten Sie, dass Ihr Name eine Mindestanzahl von Zeichen lang ist. Schreiben Sie den Test, sehen Sie, dass er fehlschlägt, schreiben Sie den Code.

Und so weiter...

David Hall
quelle
1

Ich denke, es ist nicht möglich, Ihnen die Idee von TDD in einer kurzen Antwort zu geben. Sie müssen jemanden "sehen", der es übt, um das Gefühl dafür zu bekommen. Die beste Ressource, die ich jemals zu diesem Thema gefunden habe, ist http://pragprog.com/titles/achbd/the-rspec-book . Bevor Sie mir sagen, dass Ruby nicht Ihre Sprache ist: Lesen Sie das Vorwort von Onkel Bob! ;-);

Achim
quelle
1
Das Rspec-Buch ist in Ordnung. Wenn das OP ein Buch über TDD lesen will, sollte es das sein: amazon.com/Test-Driven-Development-Kent-Beck/dp/0321146530
Julio
0

Möglicherweise möchten Sie einen Test einrichten, der versucht, dem E-Mail-Feld mehrere unterschiedliche Werte hinzuzufügen, von denen einige gültig sind und andere nicht. Hören Sie nicht auf, sich zu entwickeln, bis alle Tests den erwarteten Wert ergeben. Solche Sachen.

Kyle Sletten
quelle
0

Wie Sie das System beschrieben haben, gibt es auf Anwendungsebene nur einen Test:

[Test] public void Save_and_retrieve_user (Stringname, String-E-Mail, ...) {// Speichern // Abrufen // Überprüfen}

Fügen Sie beim Verfeinern der Anforderungen weitere Tests hinzu.

Kevin Cline
quelle