2010-06-28 29 views
48

Tôi đang ở điểm mà tôi cần phải viết các bài kiểm tra đơn vị cho một API REST được viết bằng CakePHP 1.3. API hỗ trợ các yêu cầu GET, POST và PUT để truy vấn và thao tác dữ liệu.Làm thế nào để kiểm tra đơn vị API của bạn?

Có cách nào được thiết lập để kiểm tra đầu vào/đầu ra chính xác của API mô phỏng yêu cầu HTTP hay không, sử dụng đồ đạc? Tôi không muốn chạy các yêu cầu POST/PUT thực tế đối với cơ sở dữ liệu trực tiếp (dev). Làm thế nào tôi có thể mô phỏng tốt nhất hệ thống để sử dụng các mô hình tạm thời, nhưng vẫn kiểm tra phần còn lại của ngăn xếp như là?


Kiểm tra yêu cầu GET đủ dễ dàng với controller tests. Tuy nhiên, để thao tác dữ liệu, API sử dụng các tiêu đề HTTP khá rộng rãi và cũng phân tích cú pháp dữ liệu XML và JSON POST/PUT thô. Các phương pháp kiểm tra đơn vị bộ điều khiển chỉ giả lập dữ liệu POST bằng cách thiết lập $this->data trong bộ điều khiển, điều này không cho phép tôi kiểm tra đúng API.

+3

Nếu bạn đang thử nghiệm gần như toàn bộ ngăn xếp cùng một lúc, nó không thực sự là một thử nghiệm đơn vị nữa, phải không? – wds

+0

@wds Sau đó, một lần nữa, không phải là một yêu cầu API giống như một cuộc gọi chức năng cho khách hàng? Tại sao * không nên * Tôi thử nghiệm điều này như một tổng thể? – deceze

+2

nó chỉ là một câu hỏi nhỏ về danh pháp. Tôi đã gọi đây là một bài kiểm tra tích hợp, không phải là một bài kiểm tra đơn vị. – wds

Trả lời

3

Hình như bạn có thể để kiểm tra PUT XML thô và dữ liệu POST mà không cần quá nhiều rắc rối. The CakePHP REST documentation nói điều này:

Nếu một POST hoặc yêu cầu PUT có một XML content-type, sau đó đầu vào được thực hiện và chuyển đến một thể hiện của đối tượng Xml Bánh, mà được gán cho thuộc tính $ data của bộ điều khiển. Do tính năng này, việc xử lý dữ liệu XML và POST song song là liền mạch: không yêu cầu thay đổi đối với bộ điều khiển hoặc mã mô hình. Mọi thứ bạn cần sẽ kết thúc bằng $ this-> data.

Thử bước qua mã bộ điều khiển của bạn ở chế độ gỡ lỗi để xem những gì thực sự đến qua $this->data trong khi yêu cầu XML.

Để tránh cơ sở dữ liệu trực tiếp, liệu cơ sở dữ liệu trong bộ nhớ SQLite có dễ dàng hơn không?

+0

Tôi không thực sự quan tâm đến loại cơ sở dữ liệu tôi đang sử dụng, tôi muốn sử dụng đồ đạc trong các bảng thử nghiệm. Đây là những chỉ có sẵn thông qua một số đối tượng giả mạo, trong đó đòi hỏi tôi phải bỏ qua một số phần cấp thấp trong API. Để kiểm tra API hoàn chỉnh như một ứng dụng khách sẽ thấy nó, tôi cần truy cập vào dữ liệu POST/PUT thô, vì tôi là một) kiểm tra chữ ký trên dữ liệu đã đăng và b) cũng cần kiểm tra dữ liệu JSON đã đăng. Giả mạo quá trình với các đối tượng giả và thiết lập '$ this-> data' này làm việc trực tiếp với một số mở rộng, nhưng nó không cho phép tôi kiểm tra toàn bộ chu trình yêu cầu/phản hồi API như một đơn vị duy nhất. – deceze

+0

Tôi đã sử dụng các thiết bị thử nghiệm trong một số thử nghiệm, @deceze và tôi không nhớ phải thử bất cứ thứ gì. Việc chế nhạo là cần thiết để kiểm tra các phương pháp điều khiển, tôi nghĩ vậy. Đó là một vài tháng, vì vậy tôi có thể đã quên một số chi tiết. Tôi theo các hướng dẫn ở đây: http://book.cakephp.org/view/363/Testing-models –

+0

Nếu bạn đang cố gắng kiểm tra một phần của chu kỳ giữa yêu cầu http và phương pháp điều khiển, @deceze, sau đó tôi sẽ giải quyết riêng biệt như kiểm tra tích hợp. Chỉ cần kiểm tra nó một lần bởi vì nó được xử lý bởi mã định tuyến CakePHP. Sau đó, đối với mỗi phương pháp điều khiển của bạn, bạn có thể viết một bài kiểm tra đơn vị đơn giản mà không cần lo lắng về việc định tuyến. –

3

Bạn nên tạo Mocks hoặc sử dụng Khung cách ly để mô phỏng môi trường API. Kiểm tra đơn vị không nên phụ thuộc vào các tài nguyên như kết nối internet, mạng, thiết bị đầu cuối, v.v.

Nếu bạn dự định kiểm tra các cuộc gọi API thực, bạn nên tạo dự án thử nghiệm tích hợp và sử dụng nó cho mục đích này. Nhưng hãy nhận biết các bài kiểm tra tích hợp hầu như không lặp lại được và sẽ cho bạn kết quả khác nhau trên mỗi lần chạy.

Các vấn đề liên quan