2010-09-30 21 views
5

Trong thiết kế thử nghiệm đơn vị, rất dễ rơi vào cái bẫy thực sự chỉ cần gọi logic thực hiện của bạn. Ví dụ, nếu thử nghiệm một mảng các int mà tất cả phải cao hơn hai (2, 4, 6, 8, vv), thì nó có thực sự đủ để lấy giá trị trả về từ phương thức và khẳng định rằng điều này hay không. mô hình là trường hợp?Thiết kế thử nghiệm đơn vị mạnh mẽ - kiểm tra cùng một logic theo nhiều cách khác nhau?

Tôi có thiếu gì đó không? Nó có vẻ như một phương pháp thử nghiệm đơn vị duy nhất cần phải được thực hiện mạnh mẽ hơn bằng cách thử nghiệm cùng một kỳ vọng theo nhiều cách. Vì vậy, kỳ vọng trên có thể được khẳng định bằng cách kiểm tra sự gia tăng của hai đang xảy ra nhưng cũng là số tiếp theo là chia hết cho 2. Hoặc là logic này chỉ dư thừa?

Vì vậy, trong ngắn hạn, một thử nghiệm đơn vị nên kiểm tra một kỳ vọng theo nhiều cách? Ví dụ, nếu tôi muốn kiểm tra rằng quần của tôi phù hợp với tôi, tôi sẽ/có thể đo chiều dài, đặt nó bên cạnh chân của tôi và xem so sánh, vv Đây có phải là loại logic cần thiết cho thử nghiệm đơn vị?

Cảm ơn

+0

_So kỳ vọng trên có thể được khẳng định bằng cách kiểm tra sự gia tăng của hai đang xảy ra nhưng cũng là số tiếp theo chia hết cho 2. Hoặc đây chỉ là logic dự phòng? Và có thể sai - nếu spec nói "thêm hai" thì 5 7 là đúng. Nhưng 7 không chia hết cho hai (đồng đều, yadda) –

Trả lời

3

kiểm tra đơn vị của bạn nên rà soát tất cả các giả định của bạn . Cho dù bạn làm điều đó trong 1 bài kiểm tra hoặc nhiều bài kiểm tra đều là sở thích cá nhân.

Trong ví dụ bạn đã nói ở trên, bạn có hai giả định khác nhau: (1) Mỗi ​​giá trị sẽ tăng thêm 2. (2) Tất cả giá trị phải là số chẵn.

Nên (-8, -6, -4, -2) vượt qua/thất bại?

Hãy nhớ rằng, đảm bảo mã của bạn không thành công khi được cho là quan trọng, nếu không quan trọng hơn, hãy đảm bảo mã sẽ chuyển khi được yêu cầu.

+1

_Khi bạn làm điều đó trong 1 bài kiểm tra hoặc nhiều bài kiểm tra là một sở thích cá nhân._ Tôi không đồng ý. Các xét nghiệm nên càng nhỏ càng tốt, càng đơn giản càng tốt, được đặt tên cụ thể và kiểm tra chính xác một điều. –

+0

@Tony Ennis: Tôi đồng ý với bạn, nhưng sẽ không bắt đầu một cuộc chiến thánh thiện :-) – Snekse

+0

heh không có ý định chiến tranh ;-) –

1

Nếu bạn khẳng định rằng mảng của bạn có chứa 2,4,6,8 - sau đó Logic thử nghiệm của bạn có thể có những thiếu sót vì thử nghiệm của bạn sẽ vượt qua nếu bạn vừa trở về một mảng với những yếu tố, nhưng không phải với , nói, 6,8,10,12. Bạn cần kiểm tra tính toán đó là chính xác. Vì vậy, bạn cần phải thử nghiệm nó với nhiều mảng, trong trường hợp cụ thể này.

Tôi thấy rằng việc bảo đảm các thử nghiệm thất bại, sau đó làm cho qua kiểm tra, theo tinh thần thực sự của TDD, giúp tuôn ra những bài kiểm tra đúng là ...

1

Mảng bạn đang thử nghiệm, phải được tạo trong một số loại logic. Không phải là nó tốt hơn để kiểm tra logic này để đảm bảo rằng mảng kết quả luôn đáp ứng yêu cầu của bạn?

1

Ví dụ, nếu thử nghiệm một loạt các ints mà nên tất cả là hai cao hơn khác (2, 4, 6, 8, vv), là nó thực sự đủ để có được sự trở lại giá trị từ phương pháp và khẳng định rằng mẫu này là trường hợp?

Có lẽ bạn cần suy nghĩ thêm một chút về cách sử dụng chức năng này. Nó sẽ được sử dụng với số lượng rất lớn? Nếu vậy, bạn có thể muốn thử một số xét nghiệm với số lượng rất lớn. Nó sẽ được sử dụng với số âm?

Tôi có thiếu gì đó không? Có vẻ như giống như phương pháp thử nghiệm đơn vị đơn lẻ cần để được thực hiện mạnh mẽ hơn bằng cách kiểm tra các kỳ vọng giống nhau theo một số cách.Vì vậy, kỳ vọng trên có thể được khẳng định bằng cách kiểm tra sự gia tăng của hai là xảy ra nhưng cũng là số tiếp theo là chia hết cho 2. Hoặc đây chỉ là logic dự phòng?

Hmm ... well 1,3,5,9 sẽ vượt qua assertEachValueIncrementsByTwo kiểm tra, nhưng nó sẽ không vượt qua assertValuesDivisibleByTwo thử nghiệm. Có vấn đề gì khi chúng chia hết cho 2? Nếu vậy, thì bạn thực sự nên kiểm tra điều đó. Nếu không, thì đó là một thử nghiệm dư thừa vô nghĩa.

Bạn nên cố gắng tìm nhiều hơn 1 bài kiểm tra cho các phương pháp của mình, nhưng các bài kiểm tra dự phòng vì mục đích thử nghiệm nhiều hơn sẽ không giúp bạn. Thêm assertValuesDivisibleByTwo kiểm tra khi điều đó không thực sự cần thiết sẽ chỉ gây nhầm lẫn cho các nhà phát triển sau này, những người đang cố sửa đổi mã của bạn.

Nếu bạn không thể nghĩ ra bất kỳ bài kiểm tra nào nữa, hãy thử viết một hàm đầu vào ngẫu nhiên sẽ tạo ra 100 mảng kiểm tra ngẫu nhiên mỗi lần bạn chạy thử nghiệm. Bạn sẽ ngạc nhiên khi có bao nhiêu lỗi thoát ra dưới rada khi bạn chỉ kiểm tra một hoặc hai bộ đầu vào.

1

Tôi muốn đề xuất nhiều thử nghiệm. Nếu bạn cần thay đổi hành vi bạn muốn có càng ít bài kiểm tra để thay đổi càng tốt. Điều này cũng giúp dễ dàng tìm ra vấn đề là gì. Nếu bạn thực sự thổi việc thực hiện và nhận được [1,3,4,5] một bài kiểm tra của bạn sẽ thất bại, nhưng bạn sẽ chỉ nhận được một thất bại cho điều đầu tiên bạn kiểm tra khi thực sự có hai vấn đề khác nhau.

Thử đặt tên cho thử nghiệm của bạn. Nếu bạn không thể nói trong một tên phương thức rõ ràng, những gì bạn đang thử nghiệm sẽ phá vỡ bài kiểm tra.

testEntriesStepByTwo 

testEntriesAllEven 

Cũng đừng quên các trường hợp cạnh. Danh sách trống sẽ có khả năng vượt qua 'mỗi mục là 2 nhiều hơn' trước đó 'và tất cả các mục thậm chí là' kiểm tra, nhưng phải không?

Các vấn đề liên quan