如何使用Python测试API客户端?

时间:2013-02-05 21:48:54

标签: python unit-testing mocking

我正在开发一个流行API的客户端库。目前,我对所述客户端的所有单元测试都是针对测试帐户进行实际的API调用。

以下是一个例子:

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

    assert_is(type(results), list)

我想停止针对我的测试帐户进行实际的API调用。

我该如何解决这个问题?我应该使用Mock模拟对客户端的响应和响应吗?

另外,我对使用此客户端库进行测试的原理感到困惑。我对测试实际的API不感兴趣,但是当涉及到不同的因素时,例如调用的方法,可能的返回结果的排列等等 - 我不确定我应该测试什么和/或何时安全做出假设(例如模拟回应)。

在我的场景类型中如何使用Mock的任何方向和/或样本都将不胜感激。

2 个答案:

答案 0 :(得分:7)

我个人会首先创建一个单独的接口或函数调用,库用来实际联系服务,然后在测试期间为它编写一个自定义模拟。

例如,如果服务使用HTTP并且您正在使用请求来联系服务:

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

我首先会围绕请求编写一个小包装器:

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

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

然后,对于测试,我会嘲笑相关的功能:

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

在这样的测试中使用它:

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

此外,编写测试以便您可以针对真实服务针对模拟运行它们可能是有利的,这样如果事情开始失败,您可以快速找出谁是它是错的。

答案 1 :(得分:0)

我正在使用HTTmock,我很满意它:https://github.com/patrys/httmock