Diyelim ki Yahtzee oyunu TDD stili yazıyorsunuz. Beş kalıp rulosunun dolu bir ev olup olmadığını belirleyen kodun bir kısmını test etmek istiyorsunuz. Bildiğim kadarıyla, TDD yaparken, şu ilkeleri takip ediyorsunuz:
- Önce testleri yaz
- İşe yarayan en basit şeyi yaz
- Rafine ve refactor
Öyleyse, ilk test böyle bir şeye benzeyebilir:
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);
}
"İşe IsFullHouse
yarayan en basit şeyi yaz" yazısını takip ederken, şu şekilde yöntemi yazmalısınız :
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;
}
Bu yeşil bir testle sonuçlanır ancak uygulama eksiktir.
Tam bir ev için mümkün olan her geçerli kombinasyonu (hem değerleri hem de konumları) test etmeli misiniz? IsFullHouse
Kodunuzun tamamen test edilmiş ve doğru olduğundan kesinlikle emin olmanın tek yolu gibi gözüküyor , ama aynı zamanda bunu yapmak da delice geliyor.
Böyle bir şeyi nasıl test edersiniz?
Güncelleştirme
Erik ve Kilian, ilk uygulamada değişmezleri yeşil bir test almak için kullanmanın en iyi fikir olmadığını belirtmişlerdir. Bunu neden yaptığımı ve bu açıklamanın bir yorumda yer almadığını açıklamak istiyorum.
Ünite testi ile ilgili pratik deneyimim (özellikle bir TDD yaklaşımı kullanmak) çok sınırlı. Roy Osherove'in TDD Masterclass'in Tekpub'ta bir kaydını izlediğimi hatırlıyorum. Bölümlerden birinde, bir String Calculator TDD stili oluşturuyor. Dize Hesap Makinesinin tam özelliklerini burada bulabilirsiniz: http://osherove.com/tdd-kata-1/
Böyle bir testle başlar:
public void Add_with_empty_string_should_return_zero()
{
StringCalculator sut = new StringCalculator();
int result = sut.Add("");
Assert.AreEqual(0, result);
}
Bu, Add
yöntemin bu ilk uygulanmasında sonuçlanır :
public int Add(string input)
{
return 0;
}
Sonra bu test eklenir:
public void Add_with_one_number_string_should_return_number()
{
StringCalculator sut = new StringCalculator();
int result = sut.Add("1");
Assert.AreEqual(1, result);
}
Ve Add
yöntem yeniden düzenlendi:
public int Add(string input)
{
if (input.Length == 0)
{
return 0;
}
return 1;
}
Her adımdan sonra Roy "İşe yarayacak en basit şeyi yaz" diyor.
Bu yüzden TDD tarzı bir Yahtzee oyunu yapmaya çalışırken bu yaklaşımı deneyeceğimi düşündüm.
if (roll1 == 1 && roll2 == 1 && roll3 == 1 && roll4 == 2 && roll5 == 2)