การกระทำที่ดีที่สุดใน TDD คืออะไรหากหลังจากใช้ตรรกะอย่างถูกต้องการทดสอบยังคงล้มเหลว (เพราะมีข้อผิดพลาดในการทดสอบ)?
ตัวอย่างเช่นสมมติว่าคุณต้องการพัฒนาฟังก์ชั่นต่อไปนี้:
int add(int a, int b) {
return a + b;
}
สมมติว่าเราพัฒนามันในขั้นตอนต่อไปนี้:
ทดสอบการเขียน (ยังไม่มีฟังก์ชั่น):
// test1 Assert.assertEquals(5, add(2, 3));
ผลลัพธ์มีข้อผิดพลาดในการรวบรวม
เขียนการใช้งานฟังก์ชันหลอกตา:
int add(int a, int b) { return 5; }
ผลลัพธ์:
test1
ผ่านเพิ่มกรณีทดสอบอื่น:
// test2 -- notice the wrong expected value (should be 11)! Assert.assertEquals(12, add(5, 6));
ผลลัพธ์:
test2
ล้มเหลวtest1
ยังคงผ่านไปเขียนการใช้งานจริง:
int add(int a, int b) { return a + b; }
ผลลัพธ์:
test1
ยังคงผ่านและtest2
ยังคงล้มเหลว (ตั้งแต่11 != 12
)
ในกรณีนี้จะเป็นการดีกว่าหรือไม่:
- ถูกต้อง
test2
และดูว่าตอนนี้ผ่านไปหรือ - ลบส่วนใหม่ของการใช้งาน (เช่นกลับไปที่ขั้นตอนที่ 2 ด้านบน) แก้ไข
test2
และปล่อยให้มันล้มเหลวจากนั้นนำการใช้งานที่ถูกต้องกลับมาใช้ใหม่ (ขั้นตอนที่ 4 ด้านบน)
หรือมีบางวิธีที่ฉลาดกว่า?
ในขณะที่ฉันเข้าใจว่าปัญหาตัวอย่างค่อนข้างน่าสนใจ แต่ฉันสนใจว่าจะทำอย่างไรในกรณีทั่วไปซึ่งอาจซับซ้อนกว่าการเพิ่มตัวเลขสองตัว
แก้ไข (เพื่อตอบสนองต่อคำตอบของ @Thomas Junk):
จุดเน้นของคำถามนี้คือสิ่งที่ TDD แนะนำในกรณีเช่นนี้ไม่ใช่ "แนวปฏิบัติที่เป็นสากลที่ดีที่สุด" สำหรับการบรรลุรหัสหรือการทดสอบที่ดี (ซึ่งอาจแตกต่างจากวิธี TDD)