2010-02-10 6 views
6

Ich beginne (zumindest versuche), Codierung mit TDD-Prinzipien zu tun, und ich habe diese Frage: Wieviele Tests muss ich schreiben, bevor ich tatsächlich mit der Codierung beginne? B. eine hypothetisch Math Klasse und eine Methode Divide(int a, int b).Wie viel Unit-Testing vor dem Codieren einer Methode/Klasse?

a) Muss ich, um alle Methoden der Math Klasse zu testen (Sum, Average, ...) starten, bevor Math Codierung?

b) Muss ich die Methode Divide vollständig testen, zum Beispiel für die Division durch Null, bevor Sie die Methode programmieren?

c) Oder ich kann eine einfache Testbestätigung erstellen und überprüfen, dass sie fehlschlägt, den Code schreiben und prüfen, ob alles in Ordnung ist, den Prozess für jede der Assertionen einer Methode wiederholen?

Ich denke, die Option c) ist die richtige, aber ich konnte keine Antwort finden (Ich habe einige Suchen, konnte aber keine definitive Antwort finden).

+0

Test-Driven Development ist sehr viel über Design, also wenn Sie fragen müssen, würde ich vorschlagen, dass Sie mehr über Design-Prinzipien wissen müssen. Sie können den ganzen Tag rot-grün-umgestalten, aber ohne eine gute Grundlage im Design, werden Sie sich schließlich in eine Ecke einordnen. –

+1

TDD-Puristen würden sicherlich nicht befürworten, zuerst das gesamte Verhalten der Methode zu kodieren. Ein fehlgeschlagener Test nach dem anderen. –

+0

TDD geht auch nicht darum, "eine Assertion" zu machen (was * c) * explizit erwähnt). –

Antwort

8

Ihre Option c repräsentiert vollständig durch das Buch TDD.

Sie schreiben einen fehlerhaften Test, der ein Feature der Klasse ausübt, an der Sie gerade arbeiten, und schreiben dann nur genug Code, um diesen Test bestanden zu haben. Dann machst du das nochmal, für den nächsten Test.

Durch es auf diese Weise tun Sie dann jedes neue Stück Code sehen, sollten Sie sehr auf einen bestimmten Anwendungsfall/Test fokussiert Schreib werden und auch feststellen, dass Ihre Tests getrennt bleiben, was sie abdecken.

Sie möchten am Ende in einer Rot-Grün-Refactor-Mode arbeiten, so dass Sie periodisch sowohl Ihren Code als auch Ihre Tests für Orte zurückverfolgen, an denen Sie Dinge in ein besseres Design umwandeln können.

Natürlich können Sie am Ende schreiben viele rote Tests, oder schreiben mehr Code als ein bestimmter Test erfordert, oder sogar Code ohne Tests schreiben, aber das ist weg von TDD und sollte nur mit getan werden Vorsicht.

Der Wikipedia-Artikel dazu ist eigentlich ziemlich gut. http://en.wikipedia.org/wiki/Test-driven_development

+0

Ich bin ein wenig beschämt, dass ich diesen Link vorher nicht gefunden habe. Ich lehnte mich an c), wie in meinem Text angegeben, aber ich wollte sicher sein. Manchmal ist es schwierig, die Tests vor dem Programmieren durchzuführen, aber ich denke, ich werde mich daran gewöhnen. Vielen Dank :) –

0

Nun können Sie wahrscheinlich

@Test 
public void testDivide() { 
    Math math = new Math(); 
    int result = math.divide(20,2); 
    Assert.assertNotNull(result); 
} 

schreiben, dass es ist, jetzt, wenn Sie dies Ihren Test fehl laufen so Methode Sie reparieren Ihre Math.divide. und fügen Sie Fälle im nächsten Schritt

dies ist ein sehr idealer Weg, aber jeder weiß, es ist nicht immer so.

+1

Vielleicht möchten Sie einen Test hinzufügen, um zu bestätigen, dass 20/2 = 10. –

2

Das erste, was Sie tun möchten, ist eine Spezifikation für jede Methode, die Sie implementieren möchten schreiben. In Ihrer Spezifikation müssen Sie so viele Eckfälle ansprechen, wie Sie möchten, und das Verhalten definieren, mit dem Ihre Methode beim Ausführen dieser Fälle arbeiten soll.

Sobald Ihre Spezifikation abgeschlossen ist, entwerfen Sie Tests für jeden Teil Ihrer Spezifikation sicherzustellen, dass jeder Test nicht vorbei ist oder aufgrund Ecke Fall Bedingungen versagen. An diesem Punkt sind Sie bereit, Ihre Funktionsimplementierung und Tests zu kodieren. Sobald dies abgeschlossen ist, verfeinern Sie Ihre Spezifikation/Tests/Implementierung nach Bedarf, bis die Ergebnisse genau das sind, was Sie von Ihrer Implementierung erwarten.

Dann dokumentieren Sie alles (vor allem Ihre Argumentation für Eckfällen Handling).

+0

+1: Dies ist etwas, was ich verbessern muss: Schreiben Sie eine Spezifikation für eine Klasse (was es tun wird), bevor Sie mit dem Codieren beginnen. –

+0

+1 für das Schreiben einer Spezifikation, oder zumindest wissen, wie die Form Ihrer Klasse aussehen wird, bevor Sie Tests schreiben. Ich weiß nicht, warum mehr TDD'ers nicht darüber reden. –

1

Wie andere bereits erwähnt haben, wäre Ihre Option c die reine TDD-Methode. Die Idee besteht darin, Ihren Code in kleinen Rot-Grün-Refaktor-Schritten aufzubauen. Ein gutes einfaches Beispiel dafür ist Robert Martins Bowling Kata.

0

Die Definition von "Einheit" ist not universal, manchmal ist die Einheit die Klasse, manchmal kann es eine Methode sein. Es gibt also keine wirklich universelle Antwort.

In diesem speziellen Fall würde ich die Einheit als eine Methode betrachten, so würde nicht alle Methoden vor dem Codieren beginnen. Stattdessen würde ich Dinge inkrementell machen, Methoden nach Methoden. Dies beseitigt a).

Wenn ich jedoch einen Test für eine Methode schreibe, würde ich einen strengen Test schreiben, dh ich würde die Passing- und Non-Passing-Fälle testen, an den Grenzwerten testen, die speziellen Werte testen usw. Wenn Sie einen Test schreiben definieren einen Vertrag, und dieser Vertrag sollte Ausnahmesituationen enthalten. Von Anfang an an sie zu denken hilft. Und für mich ist der Punkt, an dem ein grünes Licht zu haben ist, so dass ich möchte, dass mein Test erschöpfend ist. Und ich denke, das ist b).

Wenn Ihr Test nicht erschöpfend ist, dann sind Sie mit Ihrem Gerät nicht fertig, auch wenn der Test vorüber ist, und ich sehe den Punkt nicht wirklich. Ich denke, das ist c).

Also meine Wahl wäre b).

0

Wenn Sie auf Vollständigkeit achten, sollten Sie Ihre Komponententests vor der Entwicklung entwerfen und codieren und dann die Primärfunktionalität für die erstellten Komponententests entwickeln. Je gründlicher Sie sind, desto klarer ist der Umfang und desto besser die endgültige Qualität. Wenn es Zeit und Funktionalität erlauben, würde ich Tests für jede Methode/Funktion erstellen.

Verwandte Themen