如何用Python测试API客户端?
我正在为一个流行的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")
此外,写测试时最好能让它同时在模拟和真实服务上运行,这样如果出现问题,你可以快速找出是哪里出了错。