Katakanlah Anda sedang menulis gaya TDD game Yahtzee. Anda ingin menguji bagian dari kode yang menentukan apakah satu set lima gulungan mati adalah rumah penuh. Sejauh yang saya tahu, ketika melakukan TDD, Anda mengikuti prinsip-prinsip ini:
- Tulis tes terlebih dahulu
- Tulis hal paling sederhana yang berhasil
- Memperbaiki dan memperbaiki
Jadi tes awal mungkin terlihat seperti ini:
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);
}
Saat mengikuti "Tulis hal paling sederhana yang berhasil", Anda sekarang harus menulis IsFullHouse
metode seperti ini:
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;
}
Ini menghasilkan tes hijau tetapi implementasinya tidak lengkap.
Haruskah Anda menguji setiap kemungkinan kombinasi yang valid (baik nilai dan posisi) untuk rumah lengkap? Itu sepertinya satu-satunya cara untuk benar-benar yakin bahwa IsFullHouse
kode Anda benar-benar diuji dan benar, tetapi juga terdengar sangat gila untuk melakukan itu.
Bagaimana Anda menguji sesuatu seperti ini?
Memperbarui
Erik dan Kilian menunjukkan bahwa menggunakan literal dalam implementasi awal untuk mendapatkan tes hijau mungkin bukan ide terbaik. Saya ingin menjelaskan mengapa saya melakukan itu dan penjelasan itu tidak sesuai dengan komentar.
Pengalaman praktis saya dengan pengujian unit (terutama menggunakan pendekatan TDD) sangat terbatas. Saya ingat menonton rekaman Masterclass TDD Roy Osherove di Tekpub. Dalam salah satu episode ia membangun gaya Kalkulator String TDD. Spesifikasi lengkap dari String Calculator dapat ditemukan di sini: http://osherove.com/tdd-kata-1/
Dia mulai dengan tes seperti ini:
public void Add_with_empty_string_should_return_zero()
{
StringCalculator sut = new StringCalculator();
int result = sut.Add("");
Assert.AreEqual(0, result);
}
Ini menghasilkan implementasi Add
metode ini yang pertama :
public int Add(string input)
{
return 0;
}
Kemudian tes ini ditambahkan:
public void Add_with_one_number_string_should_return_number()
{
StringCalculator sut = new StringCalculator();
int result = sut.Add("1");
Assert.AreEqual(1, result);
}
Dan Add
metodenya adalah refactored:
public int Add(string input)
{
if (input.Length == 0)
{
return 0;
}
return 1;
}
Setelah setiap langkah Roy mengatakan "Tulis hal paling sederhana yang akan berhasil".
Jadi saya pikir saya akan mencoba pendekatan ini ketika mencoba untuk melakukan permainan Yahtzee gaya TDD.
if (roll1 == 1 && roll2 == 1 && roll3 == 1 && roll4 == 2 && roll5 == 2)