Đơn vị kiểm tra trình khách API và trình bao bọc


14

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 Clientlớp về cơ bản có ánh xạ 1: 1 với API và một Wrapperlớ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 ClientWrapper, 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 ( Wrapperhoạt động ClientClienthoạ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ì Clientchỉ 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 Wrapperlớp học. Tôi thấy các tùy chọn sau:

  1. Tôi bỏ Clientlớ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ệc Clientthay 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ác Wrapperrấ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.

  2. 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.

  3. 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à Wrappersẽ gọi thông qua một Clientđố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?


Tôi có xu hướng tránh thử nghiệm đơn vị trong các tình huống này khi có thư viện bên thứ ba thực hiện hầu hết các công việc lặt vặt và tôi chỉ có một trình bao bọc (chủ yếu vì tôi không biết làm thế nào để kiểm tra bất cứ điều gì thực sự có ý nghĩa). Nói chung tôi làm thử nghiệm tích hợp trong những trường hợp đó, có thể với một dịch vụ giả. Có lẽ ai đó biết cách thực hiện một bài kiểm tra đơn vị thực sự có ý nghĩa cho những điều này - tôi có xu hướng ưu tiên các thành phần quan trọng nhất trong hệ thống dưới sự kiểm soát của chúng tôi. Ở đây phần quan trọng nằm ngoài tầm kiểm soát của chúng tôi. :-(

Câu trả lời:


10

TLDR : Mặc dù khó khăn, bạn nên khai thác dịch vụ và sử dụng để kiểm tra đơn vị khách hàng.


Tôi không chắc chắn rằng "công việc của máy khách API từ xa là thực hiện một số cuộc gọi nhất định, không hơn, không kém ...", trừ khi API chỉ bao gồm các điểm cuối luôn trả về trạng thái cố định và không tiêu thụ cũng không tạo ra bất kỳ dữ liệu. Đây sẽ không phải là API hữu ích nhất ...

Bạn cũng muốn kiểm tra xem máy khách không chỉ gửi các yêu cầu chính xác mà còn xử lý đúng nội dung phản hồi, lỗi, chuyển hướng, v.v. và kiểm tra tất cả các trường hợp này.

Như bạn lưu ý, bạn nên có các bài kiểm tra tích hợp bao gồm toàn bộ ngăn xếp từ trình bao bọc -> máy khách -> dịch vụ -> DB và hơn thế nữa, nhưng để trả lời câu hỏi chính của bạn, trừ khi bạn có một môi trường nơi các bài kiểm tra tích hợp có thể được chạy như một phần của mọi CI xây dựng mà không có nhiều vấn đề đau đầu (cơ sở dữ liệu thử nghiệm được chia sẻ, v.v.), bạn nên đầu tư thời gian vào việc tạo ra một sơ khai của API.

Sơ khai sẽ cho phép bạn tạo một triển khai hoạt động của dịch vụ, nhưng không phải thực hiện bất kỳ lớp nào bên dưới chính dịch vụ.

Bạn có thể xem xét sử dụng giải pháp dựa trên DI để thực hiện việc này, với việc triển khai mẫu Kho lưu trữ bên dưới tài nguyên REST:

  • Thay thế tất cả các mã chức năng trong trình xử lý REST bằng các cuộc gọi đến IWhthingRep repository.
  • Tạo một kho lưu trữ sản xuất với mã được trích xuất từ ​​các tài nguyên REST và TestWhthingResposeective trả về các phản hồi đóng hộp để sử dụng trong quá trình kiểm tra đơn vị.
  • Sử dụng bộ chứa DI để thêm vào tệp DLL / lớp sản xuất hoặc TestWhthingRep repository DLL, v.v. tùy thuộc vào cấu hình.

Dù sao, trừ khi vẫn còn sơ khai và / hoặc tái cấu trúc dịch vụ là vấn đề chính trị hoặc thực tế, tôi có thể thực hiện một cái gì đó tương tự như trên. Nếu không thể, thì tôi chắc chắn sẽ có phạm vi tích hợp thực sự tốt và chạy chúng thường xuyên nhất có thể với thiết lập thử nghiệm khả dụng của bạn.

HTH

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.