Załóżmy, że piszesz grę TDD w stylu Yahtzee. Chcesz przetestować tę część kodu, która określa, czy zestaw pięciu rzutów matryc jest fularem, czy nie. O ile mi wiadomo, wykonując TDD, przestrzegasz następujących zasad:
- Najpierw napisz testy
- Napisz najprostszą możliwą rzecz, która działa
- Udoskonal i refaktoryzuj
Tak więc początkowy test może wyglądać mniej więcej tak:
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);
}
Postępując zgodnie z „Napisz najprostszą możliwą rzeczą, która działa”, powinieneś teraz napisać następującą IsFullHouse
metodę:
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;
}
Powoduje to zielony test, ale wdrożenie jest niekompletne.
Czy powinieneś przetestować każdą możliwą prawidłową kombinację (zarówno wartości, jak i pozycji) dla fula? Wygląda to na jedyny sposób, aby mieć absolutną pewność, że Twój IsFullHouse
kod został całkowicie przetestowany i poprawny, ale wydaje się to szalone.
Jak byś przetestował coś takiego?
Aktualizacja
Erik i Kilian podkreślają, że użycie literałów w początkowej implementacji w celu uzyskania zielonego testu może nie być najlepszym pomysłem. Chciałbym wyjaśnić, dlaczego to zrobiłem, a to wyjaśnienie nie pasuje do komentarza.
Moje praktyczne doświadczenie w testowaniu jednostkowym (szczególnie przy zastosowaniu metody TDD) jest bardzo ograniczone. Pamiętam, jak oglądałem nagranie TDD Masterclass Roy'a Osherove na Tekpub. W jednym z odcinków buduje styl TDD Kalkulatora Ciągów. Pełną specyfikację kalkulatora ciągów można znaleźć tutaj: http://osherove.com/tdd-kata-1/
Zaczyna od takiego testu:
public void Add_with_empty_string_should_return_zero()
{
StringCalculator sut = new StringCalculator();
int result = sut.Add("");
Assert.AreEqual(0, result);
}
Powoduje to pierwszą implementację Add
metody:
public int Add(string input)
{
return 0;
}
Następnie dodaje się ten test:
public void Add_with_one_number_string_should_return_number()
{
StringCalculator sut = new StringCalculator();
int result = sut.Add("1");
Assert.AreEqual(1, result);
}
A Add
metoda jest refactored:
public int Add(string input)
{
if (input.Length == 0)
{
return 0;
}
return 1;
}
Po każdym kroku Roy mówi „Napisz najprostszą rzecz, która zadziała”.
Pomyślałem więc, że spróbuję tego podejścia, próbując zrobić grę Yahtzee w stylu TDD.
if (roll1 == 1 && roll2 == 1 && roll3 == 1 && roll4 == 2 && roll5 == 2)