【问题标题】:How do I test an API Client with Python?如何使用 Python 测试 API 客户端?
【发布时间】:2013-02-05 21:48: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 的指导和/或示例将不胜感激。

【问题讨论】:

  • 我刚刚了解到一个有趣的测试模块,叫做fudge,你可以去看看。

标签: python unit-testing mocking


【解决方案1】:

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

例如,如果服务使用 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")

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

【讨论】:

  • 这个答案将受益于更多关于为什么你喜欢这种方法的解释,正如this question所建议的那样!
  • 你不想模拟 requests.get() 吗?让 do_stuff() 调用 _do_get() 而不是从 do_get() 返回值更有意义吗?
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-18
    • 2014-01-30
    • 2018-12-10
    • 2012-06-25
    • 1970-01-01
    • 2014-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多