Angenommen, Sie schreiben einen TDD-Stil für ein Yahtzee-Spiel. Sie möchten den Teil des Codes testen, der bestimmt, ob ein Satz mit fünf Würfeln ein volles Haus ist oder nicht. Soweit ich weiß, befolgen Sie bei TDD folgende Grundsätze:
- Schreiben Sie zuerst die Tests
- Schreiben Sie das Einfachste, was funktioniert
- Verfeinern und umgestalten
Ein erster Test könnte also so aussehen:
public void Returns_true_when_roll_is_full_house()
{
FullHouseTester sut = new FullHouseTester();
var actual = sut.IsFullHouse(1, 1, 1, 2, 2);
Assert.IsTrue(actual);
}
Wenn Sie dem Befehl "Schreiben Sie so einfach IsFullHouse
wie möglich" folgen, sollten Sie die Methode folgendermaßen schreiben :
public bool IsFullHouse(int roll1, int roll2, int roll3, int roll4, int roll5)
{
if (roll1 == 1 && roll2 == 1 && roll3 == 1 && roll4 == 2 && roll5 == 2)
{
return true;
}
return false;
}
Dies führt zu einem grünen Test, aber die Implementierung ist unvollständig.
Sollten Sie jede mögliche gültige Kombination (sowohl von Werten als auch von Positionen) für ein volles Haus testen? Das scheint die einzige Möglichkeit zu sein, absolut sicher zu sein, dass Ihr IsFullHouse
Code vollständig getestet und korrekt ist, aber es klingt auch ziemlich verrückt, dies zu tun.
Wie würden Sie so etwas testen?
Aktualisieren
Erik und Kilian weisen darauf hin, dass die Verwendung von Literalen in der ersten Implementierung für einen Grüntest möglicherweise nicht die beste Idee ist. Ich möchte erklären, warum ich das getan habe und diese Erklärung passt nicht in einen Kommentar.
Meine praktischen Erfahrungen mit Unit-Tests (insbesondere mit einem TDD-Ansatz) sind sehr begrenzt. Ich erinnere mich, eine Aufnahme von Roy Osheroves TDD Masterclass auf Tekpub gesehen zu haben. In einer der Folgen baut er einen String Calculator TDD-Stil auf. Die vollständige Spezifikation des String-Rechners finden Sie hier: http://osherove.com/tdd-kata-1/
Er beginnt mit einem Test wie diesem:
public void Add_with_empty_string_should_return_zero()
{
StringCalculator sut = new StringCalculator();
int result = sut.Add("");
Assert.AreEqual(0, result);
}
Dies führt zu dieser ersten Implementierung der Add
Methode:
public int Add(string input)
{
return 0;
}
Dann wird dieser Test hinzugefügt:
public void Add_with_one_number_string_should_return_number()
{
StringCalculator sut = new StringCalculator();
int result = sut.Add("1");
Assert.AreEqual(1, result);
}
Und die Add
Methode wurde überarbeitet:
public int Add(string input)
{
if (input.Length == 0)
{
return 0;
}
return 1;
}
Nach jedem Schritt sagt Roy "Schreibe das Einfachste, was funktionieren wird".
Daher dachte ich, ich würde diesen Ansatz ausprobieren, wenn ich ein Yahtzee-Spiel im TDD-Stil spielen wollte.
if (roll1 == 1 && roll2 == 1 && roll3 == 1 && roll4 == 2 && roll5 == 2)