สมมติว่าคุณกำลังเขียนสไตล์เกม TDT ของ Yahtzee คุณต้องการทดสอบส่วนของรหัสที่กำหนดว่าชุดแม่พิมพ์ห้าม้วนเป็นบ้านเต็มหรือไม่ เท่าที่ฉันรู้เมื่อทำ TDD คุณทำตามหลักการเหล่านี้:
- เขียนแบบทดสอบก่อน
- เขียนสิ่งที่ง่ายที่สุดที่เป็นไปได้
- ปรับแต่งและ refactor
ดังนั้นการทดสอบครั้งแรกอาจมีลักษณะเช่นนี้:
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);
}
เมื่อทำตาม "เขียนสิ่งที่ง่ายที่สุดที่เป็นไปได้" คุณควรเขียนIsFullHouse
วิธีดังนี้:
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;
}
ผลลัพธ์นี้ในการทดสอบสีเขียว แต่การใช้งานไม่สมบูรณ์
คุณควรทดสอบหน่วยที่เป็นไปได้ทั้งหมด (ทั้งค่าและตำแหน่ง) สำหรับการบ้านแบบเต็มหรือไม่? นั่นเป็นวิธีเดียวที่จะมั่นใจได้ว่าIsFullHouse
รหัสของคุณได้รับการทดสอบและแก้ไขอย่างสมบูรณ์ แต่ก็ฟังดูไม่ดีนัก
คุณจะทดสอบสิ่งนี้อย่างไร
ปรับปรุง
Erik และ Kilian ชี้ให้เห็นว่าการใช้ตัวอักษรในการเริ่มต้นใช้งานเพื่อรับการทดสอบสีเขียวอาจไม่ใช่แนวคิดที่ดีที่สุด ฉันต้องการอธิบายว่าทำไมฉันถึงทำอย่างนั้นและคำอธิบายนั้นไม่เหมาะสมในความคิดเห็น
ประสบการณ์เชิงปฏิบัติของฉันกับการทดสอบหน่วย (โดยเฉพาะการใช้วิธีการ TDD) มี จำกัด มาก ฉันจำได้ว่ากำลังดูบันทึกของ TDD Masterclass ของ Roy Osherove ใน Tekpub หนึ่งในตอนที่เขาสร้างสไตล์เครื่องคิดเลข String ข้อมูลจำเพาะทั้งหมดของเครื่องคำนวณสตริงสามารถดูได้ที่นี่: http://osherove.com/tdd-kata-1/
เขาเริ่มต้นด้วยการทดสอบเช่นนี้:
public void Add_with_empty_string_should_return_zero()
{
StringCalculator sut = new StringCalculator();
int result = sut.Add("");
Assert.AreEqual(0, result);
}
นี่เป็นผลลัพธ์ในการใช้Add
วิธีการแรก:
public int Add(string input)
{
return 0;
}
จากนั้นเพิ่มการทดสอบนี้:
public void Add_with_one_number_string_should_return_number()
{
StringCalculator sut = new StringCalculator();
int result = sut.Add("1");
Assert.AreEqual(1, result);
}
และAdd
วิธีการนั้นจะ refactored:
public int Add(string input)
{
if (input.Length == 0)
{
return 0;
}
return 1;
}
หลังจากแต่ละขั้นตอนรอยพูดว่า "เขียนสิ่งที่ง่ายที่สุดที่จะใช้ได้"
ดังนั้นฉันคิดว่าฉันจะลองวิธีนี้เมื่อพยายามทำเกม Yahtzee สไตล์ TDD
if (roll1 == 1 && roll2 == 1 && roll3 == 1 && roll4 == 2 && roll5 == 2)