Kiểm tra máy khách REST dựa trên máy chủ REST. Làm thế nào để làm đồ đạc?


10

Khi viết bài kiểm tra đơn vị, thông thường sử dụng đồ đạc: ít dữ liệu có thể kiểm tra, vì vậy chúng tôi có thể nói: 1. Nhận tất cả các khách hàng nên bao gồm Willy Wonka. 2. Xóa ứng dụng khách 3 và bây giờ, khách hàng không nên bao gồm Willy Wonka nữa.

Điều đó tốt cho các bài kiểm tra đơn vị. Sử dụng thiết lập / phân tích để tải lại đồ đạc hoặc khôi phục giao dịch. Vì vậy, kiểm tra tạo, cập nhật và xóa được thực hiện trong một giao dịch . Dữ liệu tạm thời mới chỉ tồn tại trong khoảng thời gian của bài kiểm tra đó, sau đó được đặt lại.

Nhưng còn khi chúng ta tách máy chủ REST khỏi máy khách REST thì sao?

Chúng tôi muốn đảm bảo rằng máy khách REST của chúng tôi không chỉ đọc chính xác mà còn tạo, cập nhật và xóa chính xác.

Tôi chưa thể tìm thấy bất kỳ ví dụ hoặc đề xuất nào về cách thực hiện điều này đối với máy chủ REST kiểm tra từ xa.

Giả sử tôi đã có một máy chủ REST thử nghiệm chỉ phục vụ đồ đạc. Toàn bộ bản chất không trạng thái của HTTP có nghĩa là thật khó để gửi một loại tin nhắn "BEGIN TRANSACTION" và "ROLLBACK TRANSACTION" hoặc "ReloAD FIXTOUND", phải không?

Tôi không thể là người đầu tiên muốn làm điều này, vì vậy tôi có cảm giác tôi cần một cách nghĩ khác về việc này.

Bất kỳ đề xuất?


Có lẽ, vì nó là một máy chủ thử nghiệm, bạn có thể có một điểm cuối sẽ tải lại các đồ đạc?
David Radcliffe

Nếu vấn đề chính của bạn là đưa máy chủ thử nghiệm của bạn trở lại trạng thái được xác định trước, tại sao bạn không thêm một số loại chức năng kiểm tra đặc biệt như "RELOAD TESTDATA" vào API còn lại để làm những gì bạn muốn? Tất nhiên, bạn nên đảm bảo rằng các loại lệnh gọi API không có sẵn trong sản xuất.
Doc Brown

Câu trả lời:


7

Các hệ thống phần mềm lý tưởng có ranh giới hệ thống và giao diện được xác định rõ giữa chúng. Dịch vụ REST là ví dụ tốt về điều này.

Cuối cùng, tôi muốn giới thiệu với làm những gì bạn đang cố gắng làm.

Đặc biệt:

Chúng tôi muốn đảm bảo rằng máy khách REST của chúng tôi không chỉ đọc chính xác mà còn tạo, cập nhật và xóa chính xác.

Thay vào đó, những gì tôi muốn đề xuất là:

  • Xây dựng các thử nghiệm cho máy khách REST của bạn, để đảm bảo rằng nó hoạt động chính xác, được cung cấp đầu vào và đầu ra cụ thể. Tài khoản cho các giá trị tốt (dự kiến) và xấu (bất ngờ).

  • Xây dựng các thử nghiệm cho dịch vụ REST của bạn (nếu bạn kiểm soát nó, nghĩa là), để hành xử theo chức năng dự định của nó

  • Giữ các bài kiểm tra gần với miền vấn đề của họ, để họ có thể giúp hướng dẫn thiết kế và phát triển những gì quan trọng trong bối cảnh đó


3
Bạn bỏ qua toàn bộ ý tưởng kiểm tra tích hợp ở đây khá tình cờ. Tôi không nghĩ rằng phương pháp này được thông báo từ thực tiễn.
febeling

Cảm ơn tất cả các đề xuất hữu ích. Cũng bởi Twitter, tôi đã nhận được những gợi ý tuyệt vời để dùng thử "webmock" của Ruby gem và tương tự như giả lập phản hồi của máy chủ API REST. Tôi cũng đồng ý với "febeling" rằng những gì tôi mô tả dường như giống một bài kiểm tra tích hợp hơn, vì vậy tôi sẽ xem xét riêng điều đó. Cảm ơn mọi người một lần nữa. - Derek
sivers

chế nhạo một API là cách tuyệt vời để giải quyết vấn đề. Nhưng làm thế nào để bạn chắc chắn rằng API giả định == API thực?
FrEaKmAn

4

Hai góc độ cần ghi nhớ ở đây:

  • Bạn đang kiểm tra mã của bạn hoặc hệ thống ống nước? Giả sử bạn đang sử dụng một dịch vụ và ngăn xếp khách hàng nổi tiếng, có lẽ bạn có thể đoán được một cách an toàn những người thử nghiệm của họ và hàng ngàn người dùng thường sẽ đảm bảo không có lỗi cơ bản trong nền tảng.
  • Tại sao bài kiểm tra của bạn không bình thường? Tạo một cách để ghi dữ liệu phi sản xuất hoặc ghi vào một điểm cuối khác. Chọn một số mô hình đặt tên dự đoán. Tải trước DB máy chủ còn lại trước khi kiểm tra. Và có lẽ có một vài cách nữa để thực hiện điều này - phương pháp thực sự mang tính chiến thuật và nên phụ thuộc vào bản chất của ứng dụng.

2

Tôi nghĩ rằng giả mạo các phản hồi của máy chủ REST là cách tốt nhất để kiểm tra máy khách.

Đối với Ruby, có đá quý FakeWeb mà bạn có thể sử dụng để phát ra phản hồi giả - https://github.com/chrisk/fakeweb .

Ngoài ra, trong JavaScript, bạn có thể sử dụng một cái gì đó như Sinon.JS, cung cấp cho bạn một máy chủ giả - http://sinonjs.org/docs/#fakeServer .


1

Như những người khác đã nói, nếu bạn đang kiểm tra một khách hàng, bạn không cần phải đi xa như tạo, xóa, v.v. trên máy chủ. Rất nhiều thời gian bạn thậm chí không cần phải chế nhạo một máy chủ. Bạn thực sự chỉ cần đảm bảo rằng bạn đang thực hiện đúng yêu cầu và xử lý chính xác các phản hồi, cho dù nó được viết bằng Ruby, Python, PHP hay bất cứ thứ gì khác, đôi khi khách hàng của bạn có thể sẽ sử dụng một phương thức từ thư viện HTTP để thực hiện một yêu cầu và nó đủ để chế giễu phương pháp đó, kiểm tra xem nó được gọi như thế nào và trả về kết quả kiểm tra.

Lấy một máy khách Python giả định sử dụng urllib2để thực hiện các yêu cầu. Bạn có thể có một số phương thức trong máy khách, hãy gọi nó get(), có một cuộc gọi urllib2.Request()trong đó. Bạn chỉ thực sự cần phải chế nhạo cuộc gọi đến lớp của chính bạn get().

@patch('your.Client.get')
def test_with_mock(self, your_mock):
    your_mock.return_value({'some': 'json'})
    test_obj = your.Client.get_object(5)
    your_mock.assert_called_with('/the/correct/endpoint/5')

Ví dụ rất đơn giản này sử dụng thư viện Mock của Python để kiểm tra một your.Clientlớp giả thuyết với một get_object()phương thức tạo url chính xác để lấy thứ gì đó từ một số API. Để thực hiện yêu cầu, khách hàng gọi get()phương thức của mình bằng url đó. Ở đây, phương thức đó bị chế giễu ( your.Client.getđược "vá" để nó nằm dưới sự kiểm soát của your_mock) và kiểm tra kiểm tra xem điểm cuối bên phải có được yêu cầu hay không.

Phương thức giả định trả về phản hồi JSON được cấu hình ( your_mock.return_value) mà máy khách phải xử lý và bạn sẽ đưa ra các xác nhận tiếp theo để kiểm tra xem nó đã xử lý dữ liệu dự kiến ​​theo cách mong đợi.


Nhưng làm thế nào để bạn chắc chắn rằng khi bạn thực hiện yêu cầu "đúng" thì đó là yêu cầu đúng (trong sản xuất)? Bởi vì nếu tôi hiểu đề xuất của bạn, nếu API thay đổi hoặc phá vỡ, các thử nghiệm của bạn sẽ vẫn hoạt động. Trong khi sản xuất, câu chuyện hoàn toàn khác.
FrEaKmAn

1

Những gì bạn mô tả là một kịch bản thử nghiệm tích hợp. Đây thường là một chút lúng túng để thiết lập và phá bỏ. Nó làm cho chúng chạy chậm và khá thường xuyên giòn.

Cách tiếp cận với đồ đạc chỉ là vụng về và vụng về, nhưng đó là cách mặc định mà một số khung làm việc về nó, ví dụ như Rails, và nó đã được hỗ trợ. Họ cần trường hợp thử nghiệm trừu tượng hoặc một cái gì đó tương tự để chuẩn bị cơ sở dữ liệu với đồ đạc. (Coi chừng việc đặt tên bất thường của các loại thử nghiệm trong Rails, các thử nghiệm đơn vị với đồ đạc DB cũng nói đúng là các thử nghiệm tích hợp.)

Cách tôi đi về kịch bản của bạn là chấp nhận để có quyền kiểm soát cụ thể đối với trạng thái ứng dụng API hoặc cơ sở dữ liệu của nó. Bạn có thể có các điểm cuối bổ sung để thiết lập và phân tích, chỉ xuất hiện trong môi trường thử nghiệm. Hoặc cách khác, bạn nói chuyện với cơ sở dữ liệu (hoặc bất cứ điều gì bạn đang sử dụng) đằng sau mặt sau của ứng dụng / API của bạn.

Nếu bạn cảm thấy điều này là quá nhiều (theo nghĩa của nỗ lực không đáng có), thì hãy xem xét rằng cách tiếp cận với đồ đạc cho cơ sở dữ liệu thực hiện điều đó: sử dụng các phương tiện bổ sung, kiểm tra cụ thể để thao tác cơ sở dữ liệu hoặc trạng thái ứng dụng.

Mặc dù vậy, tôi không nghĩ rằng cuộc thảo luận này có liên quan đến bản chất phi trạng thái của HTTP. HTTP là không trạng thái, nhưng ứng dụng chắc chắn là không, trong phần lớn các trường hợp. Nghe có vẻ giống như bạn đang tìm kiếm sự nghiêm ngặt REST. Bạn cũng có thể có tất cả các tài nguyên có thể được tạo hoàn toàn, có thể đọc và xóa được. Trong trường hợp đó, bạn chỉ có thể thực hiện tất cả các thiết lập và phân tích thông qua các phương tiện API thông thường. Tuy nhiên, điều này thường không được thực hiện vì bạn không muốn bao gồm các hoạt động nhất định từ hiểu biết kinh doanh về ứng dụng của mình, ít nhất là không nằm ngoài môi trường thử nghiệm.


1

Khỉ vá

Trong công việc của mình, chúng tôi thực hiện ATDD bằng cách sử dụng khung xUnit thoát và các cuộc gọi mạng vá khỉ giữa máy khách và máy chủ. Trong cùng một không gian quy trình, chúng tôi tải máy khách, khỉ vá cuộc gọi mạng lên đầu mã ngăn xếp máy chủ REST. Tất cả các cuộc gọi sau đó được phát ra từ máy khách như bình thường và mã máy chủ nhận được các yêu cầu chính xác như bình thường.

Những lợi ích

  • không phải đồng bộ hóa với máy chủ khởi động (vì không có máy chủ)
  • tận dụng phương pháp thiết lập và phá vỡ đơn vị cổ điển để quản lý những thứ như đồ đạc
  • khả năng sử dụng giả / cuống và các bản vá khỉ khác để kiểm soát chi tiết hơn trong bài kiểm tra
  • có thể được viết bằng cách sử dụng framwork xUnit

Đánh đổi

  • không phơi bày các tương tác / vấn đề đa quy trình (khóa, bỏ đói tài nguyên, v.v.)
  • không phơi bày các vấn đề đa máy chủ (tuần tự hóa dữ liệu, kiểu phân cụm)
  • không phơi bày các sự cố mạng vì đó là mô phỏng (truy cập, lỗi hết thời gian, v.v.)
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.