2008-10-17 37 views
28

Tôi chỉ đọc bài viết trên Wikipedia mock objects, nhưng tôi vẫn chưa hoàn toàn rõ ràng về mục đích của họ. Dường như chúng là các đối tượng được tạo bởi một khung kiểm tra khi đối tượng thực sự quá phức tạp hoặc không thể đoán trước (bạn biết chắc chắn 100% giá trị của đối tượng giả là vì bạn kiểm soát chúng hoàn toàn).Mô phỏng là gì và khi nào bạn nên sử dụng?

Tuy nhiên, tôi đã ấn tượng rằng tất cả các thử nghiệm được thực hiện với các đối tượng có giá trị đã biết, vì vậy tôi phải thiếu một cái gì đó. Ví dụ, trong một dự án khóa học, chúng tôi đã được giao nhiệm vụ với một ứng dụng lịch. Bộ thử nghiệm của chúng tôi bao gồm các đối tượng sự kiện mà chúng tôi biết chính xác chúng là gì để chúng tôi có thể kiểm tra tương tác giữa nhiều đối tượng sự kiện, các hệ thống con khác nhau và giao diện người dùng. Tôi đoán đây là những đối tượng giả, nhưng tôi không biết tại sao bạn sẽ không làm điều này bởi vì không có các đối tượng của các giá trị đã biết, bạn không thể thử nghiệm một hệ thống.

Trả lời

26

Đối tượng giả không chỉ là đối tượng có giá trị đã biết. Nó là một đối tượng có giao diện giống như một đối tượng phức tạp mà bạn không thể sử dụng trong thử nghiệm (như kết nối cơ sở dữ liệu và các tập kết quả), nhưng với một thực thi mà bạn có thể kiểm soát trong thử nghiệm của mình.

Có các khung mocking cho phép bạn tạo các đối tượng này một cách nhanh chóng và về bản chất cho phép bạn nói một cái gì đó như: Làm cho tôi trở thành đối tượng có phương thức foo lấy int và trả về một bool. Khi tôi vượt qua 0, nó sẽ trở lại đúng sự thật. Sau đó, bạn có thể kiểm tra mã sử dụng foo(), để đảm bảo mã phản ứng phù hợp.

Martin Fowler có một bài viết tuyệt vời về chế giễu:

+0

Liên kết bài viết tuyệt vời. Cảm ơn –

9

Hãy nghĩ về trường hợp cổ điển của việc có phần mềm máy khách và máy chủ. Để kiểm tra máy khách, bạn cần máy chủ; để kiểm tra máy chủ, bạn cần ứng dụng khách. Điều này làm cho đơn vị thử nghiệm khá nhiều điều không thể - mà không cần sử dụng mocks. Nếu bạn giả lập máy chủ, bạn có thể kiểm tra khách hàng một cách độc lập và ngược lại.

Điểm của mô hình không phải là để nhân đôi hành vi của những điều mocking của nó mặc dù. Nó hoạt động như một máy trạng thái đơn giản mà các thay đổi trạng thái có thể được phân tích bởi khung kiểm thử. Vì vậy, một mô hình khách hàng có thể tạo ra dữ liệu thử nghiệm, gửi nó đến máy chủ và sau đó phân tích phản hồi. Bạn mong đợi một phản ứng nhất định cho một yêu cầu cụ thể, và vì vậy bạn có thể kiểm tra nếu bạn nhận được nó.

6

Tôi đồng ý với tất cả mọi thứ @Lou Franco nói và bạn chắc chắn nên đọc bài viết Martin Fowler tuyệt vời trên thử nghiệm tăng gấp đôi mà @Lou Franco điểm bạn. Mục đích chính của bất kỳ kiểm tra kép (giả, sơ khai hoặc giả) là để cô lập các đối tượng được thử nghiệm để kiểm tra đơn vị của bạn chỉ kiểm tra đối tượng đó (không phụ thuộc của nó và các loại khác nó cộng tác hoặc tương tác với).

Một đối tượng cung cấp giao diện mà đối tượng của bạn phụ thuộc có thể được sử dụng thay cho phụ thuộc thực tế để mong đợi có thể được đặt là các tương tác nhất định sẽ xảy ra. Điều này có thể hữu ích nhưng có một số tranh cãi xung quanh thử nghiệm dựa trên trạng thái so với dựa trên tương tác. Việc sử dụng quá mức kỳ vọng giả sẽ dẫn đến các xét nghiệm giòn.

Lý do nữa để kiểm tra tăng gấp đôi là xóa phụ thuộc vào cơ sở dữ liệu hoặc hệ thống tệp hoặc các loại đắt tiền khác để thiết lập hoặc thực hiện các hoạt động tốn thời gian. Điều này có nghĩa là bạn có thể giữ thời gian cần thiết để kiểm tra đơn vị đối tượng bạn quan tâm đến mức tối thiểu.

2

Dưới đây là một ví dụ: nếu bạn đang viết mã để điền một cơ sở dữ liệu, bạn có thể muốn kiểm tra xem một phương pháp cụ thể có thêm dữ liệu vào cơ sở dữ liệu hay không.

Thiết lập bản sao của cơ sở dữ liệu để thử nghiệm có vấn đề nếu bạn cho rằng không có bản ghi nào trước khi gọi phương thức đã thử và một bản ghi sau đó, bạn cần khôi phục cơ sở dữ liệu về trạng thái trước đó thêm vào chi phí để chạy thử nghiệm.

Nếu bạn cho rằng chỉ có một bản ghi nhiều hơn trước đó, nó có thể xung đột với người kiểm tra thứ hai (hoặc thậm chí thử nghiệm thứ hai trong cùng một mã) kết nối với cùng cơ sở dữ liệu, do đó gây ra phụ thuộc và làm cho các bài kiểm tra mong manh.

Mô hình cho phép bạn giữ các kiểm tra độc lập với nhau và dễ thiết lập.

Đây chỉ là một ví dụ - Tôi chắc rằng những người khác có thể cung cấp nhiều hơn.

Tôi đồng ý 100% với những người đóng góp khác về chủ đề này, đặc biệt là với đề xuất cho bài viết của Martin Fowler.

0

Bạn có thể quan tâm đến sách của chúng tôi, xem http://www.growing-object-oriented-software.com/. Đó là trong Java, nhưng các ý tưởng vẫn được áp dụng.

+0

Đây là liên kết bị hỏng. –

+0

đã sửa liên kết sách, cảm ơn –

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