2009-02-17 30 views
6

Tôi đang kết nối với dịch vụ bên ngoài đơn giản, nếu không đồng bộ.Làm thế nào có thể chế nhạo các dịch vụ bên ngoài cải thiện các bài kiểm tra đơn vị?

Tôi tin rằng các bài kiểm tra đơn vị của tôi không nên phụ thuộc vào tính khả dụng hoặc thực hiện dịch vụ bên ngoài đó, vì vậy tôi dự định sẽ thử.

Tôi cần giả để chấp nhận và trả lời các tin nhắn và phản hồi thực tế - nếu không thử nghiệm của tôi sẽ không đại diện cho các trạng thái thực sự của công việc. Ví dụ, nó phải ném đúng loại lỗi - và có ít nhất 7 cách khác nhau mà nó có thể thất bại (giữa bạn và tôi không phải là dịch vụ bên ngoài được thiết kế tốt). Vì vậy, ở mức tối thiểu tôi phải có một băm của các cặp tin nhắn/phản hồi.

Vì vậy, thay vì giảm dự phòng, chế nhạo đã giới thiệu lại nó ở một nơi khác. Trong thực tế, như nói đi, bây giờ tôi đã có hai vấn đề: Tôi đã phải chắc chắn rằng những gì trong băm của tôi là một đại diện công bằng về cách dịch vụ bên ngoài cư xử. Nhưng chắc chắn nguồn kinh điển của đối tượng phản hồi X đưa ra cho thông điệp m là chính X. Bất cứ điều gì khác là nguy hiểm và lộn xộn.

Tôi đã rẽ sai? Làm thế nào tôi có thể loại bỏ vòng tròn rõ ràng này?

EDIT Tôi đã làm rõ những gì tôi nghĩ rằng vấn đề là do ánh sáng của các nhận xét hữu ích của Tư pháp.

Trả lời

3

Để tôi giới thiệu bạn đến my two answers at another question về kiểm tra đơn vị chỉ để tránh lặp lại bản thân, trước tiên.

Điều tôi nghĩ rằng chế nhạo cung cấp cho bạn trong môi trường này là nó chỉ định một cách chặt chẽ những gì bạn nghĩ rằng hành vi của giao diện bên ngoài đó sẽ là. Điều này có nghĩa là bạn đã có một thử nghiệm có kiểm soát (điều gì đó cho tôi biết dịch vụ bên ngoài này thay đổi thường xuyên như vậy.) Vì vậy, bạn không chỉ có thể kiểm tra và gỡ lỗi mã của mình bằng chuỗi phản ứng "tốt" đã biết mà bạn có một bộ tài liệu ví dụ về những gì bạn mong đợi.

Nếu tôi đang ở trong tình huống đó, và tùy thuộc vào dịch vụ thực tế, tôi sẽ bị cám dỗ để viết một bài kiểm tra đơn vị hoặc giả cho dịch vụ bên ngoài cũng như. Bằng cách đó, nếu bạn quan sát lỗi trong hoạt động thực tế, bạn có thể (1) chạy thử nghiệm đối với mã của bạn bằng cách sử dụng mô hình cho giao diện bên ngoài và (2) kiểm tra dịch vụ bên ngoài dựa trên mong đợi của bạn.

Điểm mấu chốt là phải có thứ gì đó mà bạn có niềm tin thực sự và bạn hoàn toàn kiểm soát được điều đó.

+0

Ah vâng, đúng vậy, cảm ơn.Rủi ro và bảo trì sẽ không biến mất, bởi đức tính đơn giản của thực tế đó là một dịch vụ _external_! Nhưng bằng cách thể hiện sự mong đợi của tôi về hành vi của nó, tôi cô lập sự không chắc chắn. –

+1

Liên kết đến 'hai câu trả lời của tôi ở một câu hỏi khác' bị hỏng. Có ai có thể tìm thấy nó đang sống ở đâu không? –

+0

Điều này sẽ hoạt động. http://stackoverflow.com/questions/513778/what-do-you-think-of-junit-style-unit-testing-do-you-favor-behaviour-driven-tes/513807#513807 –

0

Mô phỏng của bạn dành cho các thử nghiệm đơn vị nên không đại diện chính xác cho dịch vụ bên ngoài. Bạn nên chọn các giá trị đầu vào và đầu ra được xác định trước cho dịch vụ bên ngoài được giả lập. Họ có thể hoặc có thể không phải là những gì dịch vụ bên ngoài sẽ thực sự trở lại (nhưng họ phải là "loại" thực). Mục tiêu của các bài kiểm tra đơn vị của bạn là kiểm tra kỹ xem các đối tượng của bạn có hoạt động chính xác hay không, được cung cấp bộ đầu vào và đầu ra này cho một ý nghĩa nhất định của "chính xác".

+0

Cảm ơn - Tôi đã chỉnh sửa câu hỏi trong ánh sáng của các nhận xét rõ ràng của bạn. Tôi không chắc bạn đã trả lời mối quan tâm cơ bản của tôi. Nếu bạn có một chút thời gian, bạn có thể xem xét lại không? Chúc mừng. –

-1

Đảm bảo rằng mọi thứ mà lớp của bạn phụ thuộc vào có giao diện (trái ngược với việc triển khai thực hiện cụ thể) và sau đó bạn có thể sử dụng JMock. Điều này sẽ đơn giản hóa thử nghiệm của bạn vô cùng. Bạn có thể làm những việc như yêu cầu nó mong đợi một phương thức gọi X, trả về một giá trị cụ thể hoặc ném một ngoại lệ. Nó thực sự là một lần tiết kiệm thời gian.

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