Như được đề cập bởi câu trả lời được bình chọn hàng đầu, Martin Fowler thảo luận về những điểm khác biệt này trong Mocks Ar't Stub , và đặc biệt là phân nhóm Sự khác biệt giữa Mocks và Stub , vì vậy hãy chắc chắn đọc bài viết đó.
Thay vì tập trung vào việc những thứ này khác nhau như thế nào , tôi nghĩ sẽ tập trung hơn vào việc tại sao đây là những khái niệm riêng biệt. Mỗi tồn tại cho một mục đích khác nhau.
Hàng giả
Một giả là một thực hiện mà cư xử "một cách tự nhiên", nhưng không phải là "thật". Đây là những khái niệm mờ nhạt và vì vậy những người khác nhau có những cách hiểu khác nhau về những gì làm cho mọi thứ trở thành giả.
Một ví dụ về giả là cơ sở dữ liệu trong bộ nhớ (ví dụ: sử dụng sqlite với :memory:
cửa hàng). Bạn sẽ không bao giờ sử dụng điều này cho sản xuất (vì dữ liệu không được duy trì), nhưng nó hoàn toàn đầy đủ như một cơ sở dữ liệu để sử dụng trong môi trường thử nghiệm. Nó cũng nhẹ hơn nhiều so với cơ sở dữ liệu "thực".
Một ví dụ khác, có lẽ bạn sử dụng một số loại kho đối tượng (ví dụ Amazon S3) trong sản xuất, nhưng trong thử nghiệm, bạn có thể chỉ cần lưu đối tượng vào các tệp trên đĩa; thì việc thực hiện "lưu vào đĩa" của bạn sẽ là giả mạo. (Hoặc thậm chí bạn có thể giả mạo thao tác "lưu vào đĩa" bằng cách sử dụng hệ thống tệp trong bộ nhớ thay thế.)
Như một ví dụ thứ ba, hãy tưởng tượng một đối tượng cung cấp API bộ đệm; một đối tượng thực hiện giao diện chính xác nhưng chỉ đơn giản là không thực hiện bộ nhớ đệm mà luôn trả về lỗi bộ nhớ cache sẽ là một loại giả mạo.
Mục đích của việc giả mạo không phải là để ảnh hưởng đến hành vi của hệ thống được thử nghiệm , mà là để đơn giản hóa việc thực hiện thử nghiệm (bằng cách loại bỏ các phụ thuộc không cần thiết hoặc nặng).
Sơ khai
Một sơ khai là một thực hiện mà ứng xử "không tự nhiên". Nó được cấu hình sẵn (thường là do thiết lập thử nghiệm) để đáp ứng với các đầu vào cụ thể với các đầu ra cụ thể.
Mục đích của sơ khai là đưa hệ thống của bạn vào thử nghiệm ở trạng thái cụ thể. Ví dụ: nếu bạn đang viết thử nghiệm cho một số mã tương tác với API REST, bạn có thể loại bỏ API REST bằng API luôn trả về phản hồi đóng hộp hoặc phản hồi yêu cầu API có lỗi cụ thể. Bằng cách này, bạn có thể viết các bài kiểm tra để khẳng định về cách hệ thống phản ứng với các trạng thái này; ví dụ: kiểm tra phản hồi mà người dùng của bạn nhận được nếu API trả về lỗi 404.
Một sơ khai thường được thực hiện để chỉ đáp ứng với các tương tác chính xác mà bạn đã nói với nó để đáp ứng. Nhưng tính năng chính làm cho một cái gì đó còn sơ khai là mục đích của nó : một sơ khai là tất cả về việc thiết lập trường hợp thử nghiệm của bạn.
Giả
Một bản giả tương tự như một sơ khai, nhưng có thêm xác minh . Mục đích của bản giả là đưa ra các xác nhận về cách hệ thống của bạn được kiểm tra tương tác với phụ thuộc .
Ví dụ: nếu bạn đang viết bài kiểm tra cho một hệ thống tải tệp lên trang web, bạn có thể tạo một bản giả chấp nhận tệp và bạn có thể sử dụng để xác nhận rằng tệp đã tải lên là chính xác. Hoặc, ở quy mô nhỏ hơn, người ta thường sử dụng giả của một đối tượng để xác minh rằng hệ thống được thử nghiệm gọi các phương thức cụ thể của đối tượng bị giả.
Mocks gắn liền với thử nghiệm tương tác , đây là một phương pháp thử nghiệm cụ thể. Những người thích kiểm tra trạng thái hệ thống hơn là tương tác hệ thống sẽ sử dụng giả một cách tiết kiệm nếu có.
Kiểm tra đôi
Hàng giả, cuống và giả đều thuộc về loại thử nghiệm nhân đôi . Kiểm tra kép là bất kỳ đối tượng hoặc hệ thống nào bạn sử dụng trong kiểm tra thay vì một thứ khác. Hầu hết các kiểm thử phần mềm tự động liên quan đến việc sử dụng các phép thử nhân đôi bằng cách này hay cách khác. Một số loại nhân đôi kiểm tra khác bao gồm các giá trị giả , gián điệp , và I / O blackholes .