2013-02-05 27 views
6

Tôi đang làm việc trên thư viện ứng dụng cho một API phổ biến. Hiện tại, tất cả các bài kiểm tra đơn vị của tôi cho khách hàng đã nói đang thực hiện các cuộc gọi API thực tế đối với tài khoản thử nghiệm.Làm cách nào để thử nghiệm một Ứng dụng khách API với Python?

Dưới đây là một ví dụ:

def test_get_foo_settings(self): 
    client = MyCustomClient(token, account) 
    results = client.get_foo_settings() 

    assert_is(type(results), list) 

Tôi muốn dừng thực hiện cuộc gọi API thực tế chống lại tài khoản thử nghiệm của tôi.

Tôi nên giải quyết vấn đề này bằng cách nào? Tôi có nên sử dụng Mock để thử các cuộc gọi đến khách hàng và phản hồi không?

Ngoài ra, tôi còn nhầm lẫn về triết lý về những gì cần kiểm tra với thư viện ứng dụng khách này. Tôi không quan tâm đến việc kiểm tra API thực tế, nhưng khi có các yếu tố khác nhau liên quan như phương pháp được gọi, các hoán vị của kết quả trả về có thể, v.v. - Tôi không chắc mình nên kiểm tra và/hoặc khi nào an toàn đưa ra các giả định (chẳng hạn như phản hồi giả).

Bất kỳ hướng và/hoặc mẫu nào về cách sử dụng Mô hình trong loại kịch bản của tôi sẽ được đánh giá cao.

+0

Tôi chỉ biết về một module thú vị để thử nghiệm được gọi là 'fudge', bạn có thể kiểm tra mà ra. – BenDundee

Trả lời

6

Cá nhân tôi sẽ làm điều đó bằng cách tạo một giao diện hoặc chức năng duy nhất mà thư viện của bạn sử dụng để thực sự liên hệ với dịch vụ, sau đó viết mô hình tùy chỉnh cho quá trình kiểm tra.

Ví dụ, nếu dịch vụ sử dụng HTTP và bạn đang sử dụng yêu cầu liên lạc với dịch vụ:

class MyClient(…): 
    def do_stuff(self): 
     result = requests.get(self.service_url + "/stuff") 
     return result.json() 

tôi sẽ đầu tiên viết một wrapper nhỏ xung quanh yêu cầu:

class MyClient(…): 
    def _do_get(self, suffix): 
     return requests.get(self.service_url + "/" + suffix).json() 

    def do_stuff(self): 
     return self._do_get("stuff") 

Sau đó, cho kiểm tra, tôi sẽ thử các chức năng liên quan:

class MyClientWithMocks(MyClient): 
    def _do_get(self, suffix): 
      self.request_log.append(suffix) 
      return self.send_result 

Và sử dụng nó trong các thử nghiệm như sau:

def test_stuff(self): 
    client = MyClientWithMocks(send_result="bar") 
    assert_equal(client.do_stuff(), "bar") 
    assert_contains(client.request_log, "stuff") 

Thêm vào đó, nó sẽ có khả năng được thuận lợi để viết bài kiểm tra của bạn để bạn có thể chạy chúng cả chống giả của bạn chống lại các dịch vụ thực tế, do đó nếu mọi thứ bắt đầu thất bại, bạn có thể nhanh chóng tìm ra người có lỗi là nó là.

+0

Câu trả lời này sẽ được hưởng lợi từ một số giải thích thêm về * tại sao * bạn thích cách tiếp cận này, như [câu hỏi này] (http://stackoverflow.com/q/37885554/3001761) gợi ý! – jonrsharpe

+0

Bạn sẽ không giả tạo request.get() và làm cho nó có ý nghĩa hơn để có do_stuff() gọi _do_get() thay vì trả về giá trị từ do_get()? –

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