Giả sử bạn đang viết một trò chơi TDD theo phong cách Yahtzee. Bạn muốn kiểm tra một phần của mã xác định xem một bộ năm cuộn chết có phải là một ngôi nhà đầy đủ hay không. Theo tôi biết, khi làm TDD, bạn tuân thủ các nguyên tắc sau:
- Viết bài kiểm tra trước
- Viết điều đơn giản nhất có thể có hiệu quả
- Tinh chỉnh và tái cấu trúc
Vì vậy, một thử nghiệm ban đầu có thể trông giống như thế này:
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);
}
Khi làm theo "Viết điều đơn giản nhất có thể có hiệu quả", bây giờ bạn nên viết IsFullHouse
phương thức như thế này:
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;
}
Điều này dẫn đến một thử nghiệm xanh nhưng việc thực hiện không đầy đủ.
Bạn có nên kiểm tra đơn vị mọi sự kết hợp hợp lệ có thể (cả giá trị và vị trí) cho một ngôi nhà đầy đủ không? Điều đó có vẻ như là cách duy nhất để hoàn toàn chắc chắn rằng IsFullHouse
mã của bạn đã được kiểm tra và sửa chữa hoàn toàn, nhưng cũng có vẻ khá điên rồ khi làm điều đó.
Làm thế nào bạn sẽ đơn vị kiểm tra một cái gì đó như thế này?
Cập nhật
Erik và Kilian chỉ ra rằng sử dụng nghĩa đen trong triển khai ban đầu để có được bài kiểm tra xanh có thể không phải là ý tưởng tốt nhất. Tôi muốn giải thích lý do tại sao tôi làm điều đó và lời giải thích đó không phù hợp với một nhận xét.
Kinh nghiệm thực tế của tôi với thử nghiệm đơn vị (đặc biệt là sử dụng phương pháp TDD) rất hạn chế. Tôi nhớ đã xem bản ghi âm TDD Master Class của Roy Osherove trên Tekpub. Trong một trong những tập phim, anh xây dựng kiểu TDD String Calculator. Thông số đầy đủ của Máy tính chuỗi có thể được tìm thấy ở đây: http://osherove.com/tdd-kata-1/
Anh ta bắt đầu với một bài kiểm tra như thế này:
public void Add_with_empty_string_should_return_zero()
{
StringCalculator sut = new StringCalculator();
int result = sut.Add("");
Assert.AreEqual(0, result);
}
Điều này dẫn đến việc thực hiện Add
phương pháp đầu tiên này :
public int Add(string input)
{
return 0;
}
Sau đó, bài kiểm tra này được thêm vào:
public void Add_with_one_number_string_should_return_number()
{
StringCalculator sut = new StringCalculator();
int result = sut.Add("1");
Assert.AreEqual(1, result);
}
Và Add
phương pháp được tái cấu trúc:
public int Add(string input)
{
if (input.Length == 0)
{
return 0;
}
return 1;
}
Sau mỗi bước, Roy nói "Viết điều đơn giản nhất sẽ hoạt động".
Vì vậy, tôi nghĩ rằng tôi sẽ thử cách tiếp cận này khi thử làm một trò chơi Yahtzee theo phong cách TDD.
if (roll1 == 1 && roll2 == 1 && roll3 == 1 && roll4 == 2 && roll5 == 2)