2012-01-26 8 views
5

Tôi đang cố gắng tham gia thử nghiệm đơn vị với NUnit. Hiện tại, tôi đang viết một bài kiểm tra đơn giản để làm quen với cú pháp và cách kiểm thử đơn vị. Nhưng tôi không chắc liệu tôi có làm đúng với thử nghiệm sau đây hay không:Đây có phải là cách thử nghiệm đơn vị tốt để sử dụng chức năng khác, được kiểm tra để chuẩn bị cho thử nghiệm thực tế không?

Lớp học thử nghiệm chứa danh sách các chuỗi có chứa tên trái cây, nơi có thể thêm tên trái cây mới qua class_under_test.addNewFruit(...). Vì vậy, để kiểm tra chức năng của addNewFruit(...), trước tiên tôi sử dụng phương pháp để thêm chuỗi mới vào danh sách (ví dụ: "Pinapple") và, trong bước tiếp theo, hãy xác minh xem danh sách có chứa chuỗi mới này hay không. Tôi không chắc đây có phải là cách tốt để kiểm tra chức năng của phương pháp hay không, bởi vì tôi dựa vào đáp ứng của một chức năng khác (mà tôi đã thử nghiệm trong bài kiểm tra đơn vị trước đó).

Đây có phải là cách để kiểm tra chức năng này hoặc có giải pháp tốt hơn không?

public void addNewFruit_validNewFruitName_ReturnsFalse() 
{ 
    //arrange 
    string newFruit = "Pineapple"; 

    //act 
    class_under_test.addNewFruit(newFruit); 
    bool result = class_under_test.isInFruitList(newFruit); 

    //assert 
    Assert.That(!result); 
} 

Trả lời

7

Trong một thế giới hoàn hảo, mọi thử nghiệm đơn vị chỉ có thể bị hỏng theo một chiều. Mỗi đơn vị kiểm tra "sống" trong sự cô lập với nhau. Thử nghiệm addNewFruit của bạn có thể bị hỏng bằng cách vi phạm isInFruitsList - nhưng may mắn thay, đây không phải là một thế giới hoàn hảo.

Vì bạn đã thử nghiệm phương pháp isInFruitsList, bạn không nên lo lắng về điều đó. Điều đó giống như sử dụng API của bên thứ ba - nó (thường là) được kiểm tra và bạn cho rằng nó hoạt động. Trong trường hợp của bạn, bạn giả sử isInFruitsList hoạt động vì, tốt - bạn đã thử nghiệm nó.

Đi vòng quanh "được chia theo một cách" bạn có thể thử hiển thị danh sách trái cây bên trong (và sử dụng thuộc tính InternalsVisibleTo) hoặc chuyển nó qua tiêm phụ thuộc. Câu hỏi là - liệu nó có xứng đáng với nỗ lực không? Bạn thực sự đạt được điều gì? Trong trường hợp đơn giản như vậy, bạn thường đạt được rất ít và chi phí giới thiệu các cấu trúc như vậy thường không đáng để dành thời gian.

+2

Tuyệt đối ... nếu tất cả các kết hợp thử nghiệm làInFruitsList đều tốt, và chúng là tác giả của mã đó, thì nó đáng tin cậy đối với các thử nghiệm khác ... Giống như chúng ta "dựa" vào C# và NUnit ... – DRapp

+2

Đúng rồi. Bạn luôn luôn cần phải tìm sự cân bằng giữa viết quá ít/quá chung chung kiểm tra và lặn vào thử nghiệm cho dù 'int a = 5' thực sự gán giá trị. Nó luôn luôn lành mạnh hơn để giả định CLR, mã bên thứ 3 và mã thử nghiệm của bạn hoạt động, hơn là hoang tưởng và kiểm tra mọi thứ di chuyển. –

+0

Cảm ơn cả hai! Bây giờ tôi cảm thấy an toàn hơn nhiều, biết rằng nó được "cho phép" dựa vào các bài kiểm tra của riêng mình. – DIF