2010-03-03 21 views
11

Người ta thường nói rằng giao diện khiến cho việc chế nhạo và thử nghiệm đơn vị trở nên dễ dàng hơn. Làm thế nào để giao diện giúp đỡ với điều này?Giao diện làm cho việc kiểm tra đơn vị và chế nhạo dễ dàng như thế nào?

+0

Xem giải thích này về mocks động: http://stackoverflow.com/questions/1972831/to-mock-an-object-does-it-have-to-be-either-implementing-an-interface-or- đánh dấu/1973482 # 1973482 –

Trả lời

4

Bản chất của giao diện là cung cấp nhiều triển khai, do đó, cho phép chế nhạo.

Đặc biệt trong thử nghiệm tích hợp, bạn có thể cung cấp phiên bản hệ thống phụ thuộc giả lập (ví dụ: dịch vụ web). Thay vì thực sự kêu gọi một hệ thống phụ thuộc hoặc thậm chí là một mô-đun, hoặc một phức tạp và khó khăn để nhanh chóng loại, bạn có thể cung cấp một giao diện đơn giản thực hiện rằng sẽ cung cấp kết quả cần thiết cho kiểm tra đơn vị để hoàn thành một cách chính xác.

Bên cạnh đó, khi bạn sử dụng trong kiểm tra đơn vị, một thực tế phụ thuộc loại (gọi nó là BigGraph) giấu một mô hình đối tượng phức tạp đằng sau nó, bạn đang ở trong thực tế làm thử nghiệm hội nhập không kiểm tra đơn vị. Kiểm tra của bạn có thể dễ dàng phá vỡ nếu có lỗi trong bất kỳ loại phụ thuộc nào (BigGraph), không phải loại bạn đang thử nghiệm, do đó không kiểm tra đơn vị. Sử dụng giả lập làm giảm nguy cơ xảy ra.

Tôi đã thấy nhiều hệ thống tích hợp liên tục hiển thị hàng chục lỗi cho một lỗi, khi chúng hiển thị một hoặc nhiều nhất là do mô hình đối tượng quá phức tạp và kiểm tra đơn vị không chính xác bằng văn bản - không sử dụng mô hình.

Ngày nay, các khung mocking phức tạp hơn (sửa đổi bytecode, vv) so với ngày cũ, vì vậy đôi khi giao diện hoặc thậm chí các phương pháp ảo không phải lúc nào cũng cần thiết.

giao diện sẽ không giúp nếu mô hình đối tượng của bạn là quá phức tạp và lộn xộn (ví dụ giao diện của bạn chủ yếu dựa trên các loại khác/interfaces); sau đó triển khai/chế nhạo tất cả điều này là một sự đau đớn.

2

Nếu bạn không bị ràng buộc thực hiện cụ thể, bạn có thể chuyển đổi hành vi phía sau giao diện.

Nếu lớp học của bạn thực hiện giao diện, hành vi có thể được mô phỏng.

Ví dụ: bạn không cần spam tất cả khách hàng trong cơ sở dữ liệu để kiểm tra xem thuật toán thông báo thư của bạn có hoạt động không. Bạn sẽ tạo mô hình cho giao diện IMailSender và chỉ đếm số lượng email đã gửi. Sau đó, bạn sẽ kiểm tra việc triển khai thực tế thực sự đang gửi email trên một địa chỉ email duy nhất và bạn biết rằng toàn bộ quá trình thông báo hoạt động.

Trong ví dụ cụ thể này, thử nghiệm sử dụng mô hình thực hiện IMailSender chỉ tính số email được gửi và mã sản xuất thực tế của bạn sẽ sử dụng triển khai thực hiện IMailSender thực sự gửi email qua máy chủ SMTP.

3

Nếu bạn có một số đối tượng có triển khai khác nhau nhưng cung cấp cùng phương pháp để chia sẻ bên ngoài cùng giao diện cho phép bạn viết một bài kiểm tra đơn vị và chạy nó chống lại tất cả các triển khai.

Nếu bạn có một lớp cho biết đăng nội dung lên web trở lại và sau đó truy xuất bài kiểm tra đơn vị câu trả lời có vấn đề, vì kết nối internet không thành công có thể cho phép thử nghiệm của bạn không thành công. Vì vậy, bạn xác định một giao diện cho lớp này và sau đó bạn có thể viết một triển khai thứ hai để ghi lại những thứ cần gửi và cung cấp câu trả lời đúng. Bằng cách này bạn có thể kiểm tra các lớp làm việc với câu trả lời từ phía sau mà không dựa vào kết nối internet trong thời gian chạy thử nghiệm.

3

Nếu bạn có một lớp học, bạn có thể có rất nhiều phụ thuộc như

  • constructors Insane (rất nhiều tranh cãi, hoặc nó cần một số lớp khác mà cần một lớp thứ ba mà cần một lớp thứ tư mà cần phải một kết nối cơ sở dữ liệu hợp lệ)

  • để sử dụng lớp trong bất kỳ cách nào, bạn phải khởi tạo nó một cách chính xác (ví dụ, bạn phải vượt qua nó một số đối tượng khác mà phải có giá trị, quá)

  • lớp có một tiểu bang. Trạng thái này có thể thay đổi trong khi kiểm tra vì một lý do nào đó.

  • Lớp có thể có hoặc sử dụng các trường tĩnh

Những phụ thuộc thường không thích hợp trong nhiều bài kiểm tra của bạn và bạn không muốn phải đối phó với họ.

Với giao diện, bạn có thể tạo một lớp mô hình đơn giản chỉ thực hiện một số phương thức bạn cần. Hầu hết các khuôn khổ mocking đã được hỗ trợ sẵn cho việc này. "Thực hiện" ở đây thường có nghĩa là "trả về một giá trị cố định". Bằng cách này, bạn có thể nhanh chóng xây dựng môi trường mà lớp theo nhu cầu kiểm tra.

Ví dụ: nếu lớp của bạn cần đọc bản ghi từ cơ sở dữ liệu, bạn có thể thay thế một số ResultSet chỉ trả về các hàng. Do đó bạn không cần phải có một cơ sở dữ liệu thực, bạn không cần phải tạo một kết nối (chậm và có thể thất bại vì nhiều lý do), bạn không phải quan tâm đến dữ liệu trong cơ sở dữ liệu (vì vậy bạn không không phải xóa/thả bảng và điền lại chúng với dữ liệu thử nghiệm), v.v.

0

Khi hành vi thử nghiệm đi qua cổng, có giao diện cho bộ điều hợp sẽ giúp có thể thực hiện khác trong khi thử nghiệm (ví dụ: test double).

Ví dụ: DAO gọi cơ sở dữ liệu hoặc dịch vụ web có thể được thay thế bằng cách triển khai trả về dữ liệu được phân tích.

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