Có hai vấn đề chúng ta phải xem xét ở đây.
Đầu tiên là bạn dường như đang xem xét tất cả các bài kiểm tra của bạn từ góc độ kiểm tra đơn vị. Các bài kiểm tra đơn vị là vô cùng có giá trị, nhưng không phải là loại kiểm tra duy nhất. Các thử nghiệm thực sự có thể được chia thành nhiều lớp khác nhau, từ các thử nghiệm đơn vị rất nhanh đến các thử nghiệm tích hợp ít nhanh hơn đến các thử nghiệm chấp nhận chậm hơn . (Có thể có nhiều lớp hơn nữa bị phá vỡ, như các bài kiểm tra chức năng .)
Thứ hai là bạn đang trộn lẫn các cuộc gọi đến mã của bên thứ ba với logic kinh doanh của bạn, tạo ra các thách thức thử nghiệm và có thể làm cho mã của bạn dễ vỡ hơn.
Các bài kiểm tra đơn vị nên nhanh và nên được chạy thường xuyên. Việc phụ thuộc chế độ giả giúp giữ cho các thử nghiệm này chạy nhanh, nhưng có khả năng đưa ra các lỗ hổng trong phạm vi bảo hiểm nếu sự phụ thuộc thay đổi và giả lập không. Mã của bạn có thể bị hỏng trong khi các bài kiểm tra của bạn vẫn chạy màu xanh lá cây. Một số thư viện chế giễu sẽ cảnh báo bạn nếu giao diện của người phụ thuộc thay đổi, những người khác không thể.
Mặt khác, các kiểm tra tích hợp được thiết kế để kiểm tra các tương tác giữa các thành phần, bao gồm các thư viện của bên thứ ba. Không nên sử dụng giả ở cấp độ thử nghiệm này vì chúng tôi muốn xem đối tượng thực tế tương tác với nhau như thế nào. Bởi vì chúng tôi đang sử dụng các đối tượng thực tế, các thử nghiệm này sẽ chậm hơn và chúng tôi sẽ không chạy chúng gần như thường xuyên như các thử nghiệm đơn vị của chúng tôi.
Các thử nghiệm chấp nhận nhìn ở mức độ cao hơn, kiểm tra rằng các yêu cầu cho phần mềm được đáp ứng. Các thử nghiệm này chạy với toàn bộ hệ thống hoàn chỉnh sẽ được triển khai. Một lần nữa, không nên chế nhạo.
Một hướng dẫn mọi người đã tìm thấy có giá trị liên quan đến giả là không chế giễu các loại bạn không sở hữu . Amazon sở hữu API thành S3 để họ có thể đảm bảo nó không thay đổi bên dưới chúng. Mặt khác, bạn không có những đảm bảo này. Do đó, nếu bạn giả lập API S3 trong các thử nghiệm của mình, nó có thể thay đổi và phá vỡ mã của bạn, trong khi tất cả các thử nghiệm của bạn đều hiển thị màu xanh lá cây. Vậy làm thế nào để chúng tôi đơn vị kiểm tra mã sử dụng thư viện của bên thứ ba?
Vâng, chúng tôi không. Nếu chúng tôi làm theo hướng dẫn, chúng tôi không thể chế giễu các đối tượng chúng tôi không sở hữu. Nhưng nếu chúng ta sở hữu những phụ thuộc trực tiếp, chúng ta có thể chế nhạo họ. Nhưng bằng cách nào? Chúng tôi tạo trình bao bọc riêng cho API S3. Chúng tôi có thể làm cho nó trông rất giống API S3 hoặc chúng tôi có thể làm cho nó phù hợp với nhu cầu của chúng tôi chặt chẽ hơn (ưu tiên). Chúng ta thậm chí có thể làm cho nó trừu tượng hơn một chút, nói một PersistenceService
thay vì một AmazonS3Bucket
. PersistenceService
sẽ là một giao diện với các phương thức như #save(Thing)
và #fetch(ThingId)
, các loại phương thức chúng ta có thể muốn xem (đây là những ví dụ, bạn thực sự có thể muốn các phương thức khác nhau). Bây giờ chúng ta có thể triển khai PersistenceService
API S3 (giả sử a S3PersistenceService
), gói gọn nó khỏi mã gọi của chúng tôi.
Bây giờ đến mã gọi API S3. Chúng ta cần thay thế các cuộc gọi đó bằng các cuộc gọi đến một PersistenceService
đối tượng. Chúng tôi sử dụng tiêm phụ thuộc để truyền của chúng tôi PersistenceService
vào đối tượng. Điều quan trọng không phải là yêu cầu a S3PersistenceService
, mà là yêu cầu a PersistenceService
. Điều này cho phép chúng tôi trao đổi thực hiện trong các thử nghiệm của chúng tôi.
Tất cả các mã được sử dụng để sử dụng API S3 trực tiếp bây giờ đều sử dụng của chúng tôi PersistenceService
và S3PersistenceService
giờ đây chúng tôi thực hiện tất cả các cuộc gọi đến API S3. Trong các thử nghiệm của chúng tôi, chúng tôi có thể giả lập PersistenceService
, vì chúng tôi sở hữu nó và sử dụng giả để đảm bảo rằng mã của chúng tôi thực hiện các cuộc gọi chính xác. Nhưng bây giờ lá làm thế nào để kiểm tra S3PersistenceService
. Nó có cùng một vấn đề như trước đây: chúng tôi không thể kiểm tra đơn vị mà không gọi cho dịch vụ bên ngoài. Vì vậy, chúng tôi không đơn vị kiểm tra nó. Chúng tôi có thể giả định các phụ thuộc API S3, nhưng điều này sẽ mang lại cho chúng tôi ít nhiều sự tự tin. Thay vào đó, chúng tôi phải kiểm tra nó ở cấp độ cao hơn: kiểm tra tích hợp.
Điều này nghe có vẻ hơi rắc rối khi nói rằng chúng ta không nên đơn vị kiểm tra một phần mã của mình, nhưng hãy nhìn vào những gì chúng ta đã đạt được. Chúng tôi đã có một loạt mã ở khắp nơi mà chúng tôi không thể kiểm tra đơn vị mà bây giờ có thể được kiểm tra đơn vị thông qua PersistenceService
. Chúng tôi có thư viện bên thứ ba lộn xộn trong một lớp thực hiện. Lớp đó sẽ cung cấp các chức năng cần thiết để sử dụng API, nhưng không có logic kinh doanh bên ngoài nào được đính kèm. Do đó, một khi nó được viết, nó sẽ rất ổn định và không nên thay đổi nhiều. Chúng tôi có thể dựa vào các thử nghiệm chậm hơn mà chúng tôi không chạy thường xuyên vì mã ổn định.
Bước tiếp theo là viết các bài kiểm tra tích hợp cho S3PersistenceService
. Chúng nên được phân tách bằng tên hoặc thư mục để chúng tôi có thể chạy chúng tách biệt khỏi các bài kiểm tra đơn vị nhanh của chúng tôi. Kiểm thử tích hợp thường có thể sử dụng các khung kiểm tra tương tự như kiểm thử đơn vị nếu mã đủ thông tin, vì vậy chúng tôi không cần phải tìm hiểu một công cụ mới. Mã thực tế cho bài kiểm tra tích hợp là những gì bạn sẽ viết cho Tùy chọn 1 của mình.