Tôi đã đi vòng tròn trong các vòng tròn cố gắng tìm ra cách tốt nhất để kiểm tra đơn vị thư viện máy khách API tôi đang phát triển. Thư viện có một Client
lớp về cơ bản có ánh xạ 1: 1 với API và một Wrapper
lớp bổ sung cung cấp giao diện thân thiện hơn với người dùng ở phía trên Client
.
Wrapper --> Client --> External API
Trước tiên tôi đã viết một loạt các thử nghiệm chống lại cả hai Client
và Wrapper
, thực tế chỉ kiểm tra rằng chúng chuyển tiếp đến các chức năng phù hợp của bất kỳ hoạt động nào ( Wrapper
hoạt động Client
và Client
hoạt động trên kết nối HTTP). Tôi bắt đầu cảm thấy không thoải mái với điều này, tuy nhiên, vì tôi cảm thấy như tôi đang thử nghiệm việc thực hiện các lớp này, thay vì giao diện. Về lý thuyết, tôi có thể thay đổi các lớp để có một triển khai hoàn toàn hợp lệ khác, nhưng các thử nghiệm của tôi sẽ thất bại vì các hàm mà tôi dự kiến sẽ không được gọi. Nghe có vẻ như những bài kiểm tra mong manh đối với tôi.
Sau này, tôi nghĩ về giao diện của các lớp. Các bài kiểm tra nên xác minh rằng các lớp thực sự làm công việc họ dự định làm, hơn là cách họ thực hiện nó. Vì vậy, làm thế nào tôi có thể làm điều này? Điều đầu tiên xuất hiện trong đầu là các yêu cầu API bên ngoài. Tuy nhiên, tôi lo lắng về việc đơn giản hóa dịch vụ bên ngoài. Rất nhiều ví dụ về các API còn sơ khai mà tôi đã thấy chỉ đưa ra các phản hồi đóng hộp, nghe có vẻ như là một cách thực sự dễ dàng để chỉ kiểm tra xem mã của bạn có chạy chính xác với API giả của bạn không. Giải pháp thay thế là chế nhạo dịch vụ, điều này là không khả thi, và sẽ cần được cập nhật bất cứ khi nào dịch vụ thực sự thay đổi - cảm giác như quá mức và lãng phí thời gian.
Cuối cùng, tôi đọc điều này từ một câu trả lời khác trên các lập trình viên SE :
Công việc của máy khách API từ xa là đưa ra các cuộc gọi nhất định - không hơn, không kém. Do đó, thử nghiệm của nó nên xác minh rằng nó phát hành các cuộc gọi đó - không hơn, không kém.
Và bây giờ tôi ít nhiều bị thuyết phục - khi thử nghiệm Client
, tất cả những gì tôi cần kiểm tra là nó đưa ra các yêu cầu chính xác cho API (Tất nhiên, luôn có khả năng API sẽ thay đổi nhưng các thử nghiệm của tôi vẫn tiếp tục - nhưng đó là trong đó các bài kiểm tra tích hợp sẽ có ích). Vì Client
chỉ là ánh xạ 1: 1 với API, mối quan tâm của tôi trước đây về việc thay đổi từ một triển khai hợp lệ này sang một triển khai hợp lệ khác không thực sự áp dụng - chỉ có một triển khai hợp lệ cho mỗi phương thức Client
.
Tuy nhiên, tôi vẫn bị mắc kẹt với Wrapper
lớp học. Tôi thấy các tùy chọn sau:
Tôi bỏ
Client
lớp và kiểm tra xem các phương thức thích hợp có được gọi không. Theo cách này, tôi đang làm tương tự như trên nhưng coi việcClient
thay thế cho API. Điều này đặt tôi trở lại ngay nơi tôi bắt đầu. Một lần nữa, điều này mang lại cho tôi cảm giác không thoải mái khi thực hiện thử nghiệm, không phải giao diện. CácWrapper
rất có thể được thực hiện bằng cách sử dụng khách hàng hoàn toàn khác nhau.Tôi tạo ra một bản giả
Client
. Bây giờ tôi phải quyết định đi bao xa với việc chế nhạo nó - tạo ra một bản dịch hoàn chỉnh của dịch vụ sẽ tốn rất nhiều công sức (nhiều công việc hơn là đã đi vào thư viện). Bản thân API rất đơn giản, nhưng dịch vụ này khá phức tạp (về cơ bản là kho dữ liệu với các hoạt động trên dữ liệu đó). Và một lần nữa, tôi sẽ phải giữ cho bản giả của mình đồng bộ với thực tếClient
.Tôi chỉ kiểm tra rằng các yêu cầu HTTP thích hợp đang được thực hiện. Điều này có nghĩa là
Wrapper
sẽ gọi thông qua mộtClient
đối tượng thực để thực hiện các yêu cầu HTTP đó, vì vậy tôi không thực sự kiểm tra nó một cách cô lập. Điều này làm cho nó một chút của một bài kiểm tra đơn vị khủng khiếp.
Vì vậy, tôi không đặc biệt hài lòng với bất kỳ giải pháp nào trong số này. Bạn sẽ làm gì? Có một cách đúng đắn để đi về điều này?