Xác minh cuộc gọi TDD Mock - đó có phải là mô hình chống không?


11

Tôi đã làm TDD được một năm rồi, tôi cảm thấy khá tốt về nó, tôi yêu tất cả các bộ thử nghiệm của tôi. Tuy nhiên, tôi nhận thấy rằng gần đây tôi đã thực hiện rất nhiều xác minh cuộc gọi giả. Ví dụ: Tôi có một Dịch vụ sẽ được lưu trữ Kho lưu trữ - trong thử nghiệm đơn vị của tôi, tôi sẽ vượt qua một bản nháp của Kho lưu trữ và xác minh rằng nó được gọi trong phương thức mà tôi đang thử nghiệm. Sau đó tôi sẽ kiểm tra xem kết quả trả về có đúng không (trong một thử nghiệm khác). Điều này chắc chắn "cảm thấy" sai, vì các bài kiểm tra đơn vị của tôi bây giờ rất được kết hợp với các chi tiết thực hiện. Tôi đã nghe nói rằng bạn nên kiểm tra "hành vi", tuy nhiên trong rất nhiều tình huống ... emm - không thể? Nếu bạn có mộtvoidphương pháp ví dụ, bạn thường kiểm tra tác dụng phụ. Ý tôi là thật dễ dàng để tiếp tục và hiển thị một số mã đơn giản, nơi điều này có thể được chứng minh, nhưng IMHO nó không phản ánh rất tốt với các chương trình trong thế giới thực mà chúng ta viết. Là những gì tôi đang làm sai? Đây có phải là loại thử nghiệm của một mô hình chống? Tôi đánh giá cao ý kiến ​​của bạn về điều này, tôi vẫn là một người mới khi nói đến TDD.


2
Câu trả lời ngắn gọn: có. Có những câu hỏi rất thú vị về chủ đề này đã ở đâu đó ở đây. Các bài kiểm tra đơn vị của bạn không nên mong manh và phụ thuộc nhiều vào việc thực hiện của bạn. Đây là lý do tại sao các bài kiểm tra cấp cao hơn dành cho (tích hợp, v.v.). Tại đây: lập trình
viên.stackexchange.com/questions / 1945453 / Kem

@Kemoda Tôi đánh giá cao nếu bạn có thể liên kết tôi với một cuộc thảo luận hoặc một số tài liệu khác về vấn đề này, tôi rất muốn cải thiện kỹ thuật của mình.
Dimitar Dimitrov

1
bạn có cái này chẳng hạn như lập trình
viên.stackexchange.com /questions / 194545 / /

Câu trả lời:


8

Vâng, bạn nên cố gắng kiểm tra đầu vào và đầu ra. Bạn nên xác minh hành vi nhìn thấy bên ngoài. "Lời hứa" hoặc "hợp đồng" mà lớp của bạn thực hiện.

Đồng thời đôi khi không có cách nào tốt hơn để kiểm tra một phương pháp hơn là làm những gì bạn nói.

Tôi nghĩ rằng nó làm cho bài kiểm tra của bạn dễ vỡ hơn, vì vậy bạn nên tránh các bài kiểm tra dựa trên chi tiết triển khai nếu bạn có thể, nhưng đó không phải là một thỏa thuận tất cả hoặc không có gì. Đôi khi cũng không sao, điều tồi tệ nhất xảy ra là bạn thay đổi việc thực hiện và phải cập nhật kiểm tra.


2

Mục đích của một bài kiểm tra là để hạn chế việc triển khai sản xuất có thể. Hãy chắc chắn rằng bạn chỉ đặt các hạn chế đối với việc triển khai mà bạn thực sự cần. Thông thường đây là những gì chương trình của bạn nên làm, và không phải làm thế nào nó làm điều đó.

Vì vậy, nếu ví dụ dịch vụ của bạn thêm một cái gì đó vào kho lưu trữ, bạn nên kiểm tra xem mục mới có được chứa trong kho không, và không phải là hành động thêm được kích hoạt.

Để làm việc này, bạn cần có khả năng sử dụng triển khai kho lưu trữ (được thử nghiệm ở nơi khác) trong thử nghiệm dịch vụ. Tôi thấy rằng sử dụng triển khai thực sự của một cộng tác viên nói chung là một cách tiếp cận tốt - bởi vì đó thực sự là cách thực hiện tốt nhất xung quanh.


"Vì vậy, nhưng nếu sử dụng các triển khai thực tế trong thử nghiệm thì tốn kém (ví dụ vì chúng yêu cầu các tài nguyên phức tạp để thiết lập)? Tôi cần sử dụng giả trong trường hợp này, phải không?"

Trong mọi trường hợp, bạn có thể muốn một thử nghiệm tích hợp để kiểm tra các triển khai thực sự hoạt động cùng nhau. Đảm bảo rằng một thử nghiệm tích hợp này là tất cả những gì cần thiết để kiểm tra dịch vụ của bạn. Hay nói cách khác: Nếu một dịch vụ kết hợp nhiều cộng tác viên (và do đó rất khó kiểm tra), hãy đảm bảo rằng dịch vụ đó không chứa bất kỳ logic nào. Nếu có, và bạn cần nhiều thử nghiệm (tích hợp), bạn cần thay đổi cấu trúc mã của mình, ví dụ bằng cách cô lập logic và do đó làm cho nó dễ kiểm tra hơn.

Sử dụng giả trong trường hợp này giúp giảm bớt nỗi đau khi thử nghiệm một đoạn logic bị cô lập tồi tệ, và do đó che giấu một vấn đề kiến ​​trúc . Vì vậy, không sử dụng giả để kiểm tra mã có cấu trúc xấu, nhưng thay vào đó hãy sửa cấu trúc.


1
Tôi thấy những gì bạn đang nói. Chủ đề này hơi khó hiểu khi "thử nghiệm bao nhiêu thử nghiệm quá nhiều", giả sử tôi có một "dịch vụ tổng hợp" về cơ bản là một mặt tiền và chỉ "dán" lại với nhau các dịch vụ / kho lưu trữ / thành phần khác loại thử nghiệm nào bạn viết cho nó? Tất cả những gì tôi có thể nghĩ là xác minh cuộc gọi. Tôi hy vọng tôi có ý nghĩa.
Dimitar Dimitrov

2

Suy nghĩ của tôi lại: 'tổng hợp các dịch vụ'.

Xác minh cuộc gọi sẽ làm điều này, nhưng sẽ không cung cấp nhiều giá trị. Bạn chỉ đang kiểm tra hệ thống dây điện của bạn.

Có 3 cách không độc quyền, khác:

  1. Mở rộng các bài kiểm tra bạn có cho từng dịch vụ riêng lẻ để nó kiểm tra hành vi cấp cao hơn. Ví dụ: nếu bạn truy cập cơ sở dữ liệu trong bộ nhớ trong đơn vị kiểm tra dịch vụ của mình, hãy nâng cấp lên để bạn kiểm tra dịch vụ dựa trên db thực tế. Lớp dịch vụ cao hơn cây trừu tượng và thử nghiệm của bạn cũng vậy.

  2. Sử dụng tạo mã để tạo dịch vụ trực tiếp từ các dịch vụ tổng hợp.

  3. Sử dụng một số loại phản xạ hoặc ngôn ngữ động để làm điều tương tự. Ví dụ, trong Java, có thể sử dụng giao diện Groovy, trực tiếp chuyển cuộc gọi.

Có thể có nhiều cách khác để làm điều này, nhưng chỉ cần kiểm tra hệ thống dây điện có mức hoàn vốn rất thấp và sẽ giúp bạn thực hiện việc này.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.