Làm cách nào để mô phỏng API REST?


13

Tôi đang làm việc trên một dự án mới sẽ truy vấn dữ liệu từ API REST của bên thứ 3. Đây là một nguồn cấp dữ liệu thể thao thời gian thực, vì vậy nguồn cấp dữ liệu chỉ hoạt động khi một trò chơi đang thực sự diễn ra.

Mặc dù bên thứ 3 cung cấp tài liệu tốt (XSD, v.v.), nhưng họ không có cách nào để mô phỏng một trò chơi đang diễn ra, và vì vậy để kiểm tra mã tôi đã viết dựa trên API này, tôi sẽ phải chờ một trò chơi thực sự xảy ra.

Cách duy nhất của tôi là tự viết mã để mô phỏng một trò chơi, nhưng có vẻ như rất nhiều công việc. Làm thế nào bạn sẽ tiếp cận điều này?


5
Dữ liệu này phức tạp như thế nào? Trong hầu hết các trường hợp, tôi sẽ chỉ sơ khai các đối tượng xử lý dữ liệu không liên quan. Sử dụng dữ liệu từ các phiên trò chơi trước (có thể quá phức tạp để thử nghiệm) hoặc phân tích dữ liệu và trích xuất các loại thông tin có liên quan. Lưu trữ tệp này trong các tệp và cung cấp cho chương trình chính của bạn như thể nó đến từ nguồn thực.
thorsten müller

2
Trường hợp sử dụng hoàn hảo cho một đối tượng giả http: //en.wikipedia.org/wiki/Mock_object
kevin cline

Câu trả lời:


15

Đây là trường hợp sử dụng hoàn hảo cho một đối tượng giả . Có thư viện chế giễu cho mọi ngôn ngữ phổ biến. Bạn sẽ muốn giả định đối tượng cung cấp các phản hồi dịch vụ REST để trả về dữ liệu thử nghiệm. Bạn có thể tự tạo dữ liệu thử nghiệm hoặc thu thập dữ liệu từ các cuộc gọi trước đó đến hệ thống trực tiếp.


1
Vấn đề ở đây không phải là quá nhiều một mã. Đây là một trong những dữ liệu. Tôi có thể giả định các giả lập API hoặc sơ khai API, nhưng vấn đề là tạo dữ liệu giả mà nó sẽ cung cấp cho tôi
dferraro

@dferraro: Điều gì ngăn bạn bỏ phiếu dịch vụ vào lần tiếp theo có trò chơi và đưa dữ liệu đó vào một tệp. Khi bạn có khả năng làm điều đó và quen thuộc với định dạng, thì bạn có thể tạo một tệp mới (hoặc tệp) với các trường hợp thử nghiệm cụ thể.
Steven Evers

4

Đợi cho đến khi một trò chơi đang xảy ra. Nắm bắt mọi sự kiện từ nguồn cấp dữ liệu. Viết một trình giả lập phát lại các sự kiện vào thời điểm thích hợp. Voila, bạn có một trình mô phỏng thức ăn với dữ liệu thực.


Nếu bạn là người dùng Ruby, bạn có thể sử dụng VCR để chụp và phát lại các phản hồi HTTP.
dusan

2

Tôi khuyên bạn nên viết giả lập của riêng bạn. Bạn có thể sử dụng nó để kiểm tra tất cả các loại kịch bản;

  • Máy chủ chấp nhận kết nối nhưng không phản hồi
  • Máy chủ hết thời gian
  • Máy chủ gửi trả lời rác vv ...

Khi tôi đã làm điều này trong quá khứ, tôi đã sử dụng các giá trị "đặc biệt" trong các thông báo yêu cầu để nhắc trình giả lập thực hiện những gì tôi cần. Điều này cũng cho phép chạy thử nghiệm đầu cuối mà không cần ra ngoài môi trường phát triển của bạn.

Chỉnh sửa: Ví dụ: nếu dự án của bạn gửi XML cho dịch vụ bên thứ 3, yêu cầu có thể bao gồm ví dụ <value>50.00</value>. Trình mô phỏng có thể được mã hóa (hoặc, tốt hơn, được định cấu hình) sao cho 50.00 => phát nổ, 60.00 => rác, 70.00 => kết nối chặt chẽ, v.v. Ý tưởng là hành vi của trình giả lập phụ thuộc vào đầu vào của nó, mà bạn điều khiển trong từng trường hợp thử nghiệm.


Cảm ơn. Bạn có thể đưa ra một ví dụ về ý nghĩa của bạn về các giá trị 'đặc biệt' không?
dferraro

1
Xây dựng câu trả lời của tôi.
Rory Hunter

2

Xem xét rằng có lẽ nhà cái cung cấp một số dữ liệu mẫu (và điều này có thể được lưu trong giai đoạn tích hợp), lời khuyên của tôi là tổ chức các nguồn cấp dữ liệu đó theo cách này:

  • Danh sách các sự kiện
  • Cập nhật cho các sự kiện theo lịch trình
  • Cập nhật tỷ lệ cược
  • Các kết quả

Có lẽ nhà cung cấp cung cấp 2 loại cập nhật: Đẩy (POST) và Kéo (GET).

Tại thời điểm này bạn nên

  1. Tạo một máy chủ đơn giản chỉ xử lý các yêu cầu GET, để các lập trình viên của bạn có thể xây dựng các thuật toán.
  2. Tạo tự động hóa để quản lý việc gửi cùng thông tin và do đó có thể nhấn mạnh hệ thống của bạn.

Quản lý phát triển và thử nghiệm

Không đi sâu vào chi tiết về công nghệ sẽ được sử dụng, bạn có một máy chủ mini , chỉ đáp ứng với 4 URL (hoặc những URL cần thiết tùy thuộc vào những gì nhà cung cấp cung cấp) và dịch vụ đẩy mini .

Một điều rất tốt cần ghi nhớ khi làm việc với "máy chủ mini", là các trình xử lý của giao thức HTTP. Tạo một máy chủ trên cổng 80 rất đơn giản và giải quyết vấn đề. Bạn phải chắc chắn đưa tất cả thông tin vào các phản hồi NHẬN khi nhà cung cấp đưa ra (điều này sẽ tránh được các vấn đề khi đưa vào sản xuất).

Cá nhân tôi sẽ làm một máy chủ Perl đơn giản hoặc tương tự nhưng với Nodejs. Liên quan đến việc tiêm dữ liệu, sẽ có đủ bộ đếm thời gian, gọi trình duyệt ngoại tuyến ( CURL , WGET )


2

Tôi đã mô phỏng API REST bằng cách sử dụng kết hợp cucumberjs, ph Phantomjs với cài đặt máy chủ proxy thành 127.0.0.1 và nối một quy trình node.js với http-proxynockở đó. CucumberJS không phải là phần quan trọng, bạn có thể viết kịch bản thử nghiệm bằng mọi cách, phần còn lại là chìa khóa để mô phỏng. Nó có thể giả định đơn giản bằng dữ liệu khớp-yêu cầu-trả về-dữ liệu, nhưng bạn cũng có thể lọc theo các mẫu và hàm gọi lại để tạo ra một câu trả lời, do đó bạn có thể mô phỏng theo bất kỳ mức độ chi tiết nào bạn cần (kết thúc cực kỳ với một máy chủ demo đầy đủ, nhưng bạn có thể làm điều đó tăng dần).

Nó hoạt động độc đáo:

  1. Phantomjs yêu cầu một URI.
  2. Yêu cầu đến máy chủ proxy trên 127.0.0.1:port.
  3. Quá trình node.js của bạn ủy quyền cho nó chuyển tiếp trong suốt bằng cách sử dụng http-proxy. Vì vậy, bất kỳ tải "bình thường" (trang, hình ảnh) hoạt động.
  4. Nếu bạn chọn chặn một số yêu cầu (chủ yếu là API), bạn sẽ sử dụng nocknó.

Trong kịch bản của tôi, tôi đã kết hợp nó với các bài kiểm tra js dưa chuột trong cùng một quy trình, vì vậy nó đã đi như sau:

  1. Chạy thử.
  2. Nó thiết lập nockmocking HTTP cho kịch bản mà nó kiểm tra.
  3. Nó tải một trang trong ph Phantomjs thông qua giao thức Selenium.

Phần còn lại như được trình bày trước đó trong đoạn này (nghĩa là, đó là một chút của một chu kỳ, tôi với tư cách là người chạy thử nghiệm hướng dẫn ph Phantomjs tải một trang, chuyển tiếp tất cả các yêu cầu lại cho tôi và tôi chuyển tiếp chúng đến mạng; hoặc chặn nếu chúng là API được thử nghiệm).

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.