如何用Python测试API客户端?

10 投票
2 回答
8303 浏览
提问于 2025-04-17 14:53

我正在为一个流行的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

我正在使用HTTmock,感觉非常不错: https://github.com/patrys/httmock

11

我个人的做法是,首先创建一个接口或者函数,这个接口是你的库用来联系服务的,然后在测试时为它写一个自定义的模拟。

举个例子,如果这个服务是通过HTTP来联系的,而你是用Requests库来联系这个服务:

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

我会先在requests的基础上写一个小的封装:

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")

此外,写测试时最好能让它同时在模拟和真实服务上运行,这样如果出现问题,你可以快速找出是哪里出了错。

撰写回答