【问题标题】:Caching Google API calls for unit tests为单元测试缓存 Google API 调用
【发布时间】:2018-04-27 14:34:19
【问题描述】:

我有一个使用 Google Cloud Language API 的 Google App Engine 项目,并且我正在使用 Google API 客户端库 (Python) 进行 API 调用。

在运行单元测试时,我会多次调用 API。这会减慢我的测试速度并产生成本。

我想缓存对 Google API 的调用以加快我的测试并避免 API 费用,如果有其他解决方案可用,我宁愿不自己动手。

我发现了这个Google API page,建议这样做:

import httplib2
http = httplib2.Http(cache=".cache")

我已将这些行添加到我的代码中(还有另一个选项可以使用 GAE 内存缓存,但不会在测试代码调用之间持久化)并且在这些行之后,我创建了我的 API 调用连接:

NLP = discovery.build("language", "v1", API_KEY)

缓存不起作用,上面的解决方案似乎太简单了,所以我怀疑我遗漏了一些东西。

更新:

我更新了我的测试,以便不使用 App Engine(只是一个常规的单元测试),我还发现我可以像这样将我创建的 http 传递给 Google API 客户端:

NLP = discovery.build("language", "v1", http, API_KEY)

现在,最初的发现调用被缓存,但实际的 API 调用没有被缓存,例如,这个调用没有被缓存:

result = NLP.documents().annotateText(body=data).execute()

【问题讨论】:

    标签: python unit-testing google-app-engine google-api httplib2


    【解决方案1】:

    建议的代码:

    http = httplib2.Http(cache=".cache") 正在尝试缓存到名为“.cache”的目录中的本地文件系统。在 App Engine 上,您是 cannot write to the local filesystem,所以这没有任何作用。

    相反,您可以尝试缓存到Memcache。引用的Python Client docs 的另一个建议就是这样做:

    从 google.appengine.api 导入内存缓存 http = httplib2.Http(cache=memcache)

    由于所有 App Engine 应用都可以免费访问shared memcache,这总比没有好。

    如果失败,你也可以尝试记忆。我已经成功地记住了对缓慢或不稳定的 API 的调用,但这是以增加内存使用为代价的(所以我需要更大的实例)。

    编辑:我从您的评论中看到您在本地遇到了这个问题。我最初认为 memoization 将是一种替代方案,但需要破解 httplib2 使得这过于复杂。我又开始思考如何说服 httplib2 做正确的事了。

    【讨论】:

    • 我认为文件系统版本可以工作,因为我在本地机器上进行测试。我尝试了 memcache 版本,但由于 memcache 在我的单元测试调用之间没有持久化,这也不起作用。
    • 单次运行后.cache目录有什么东西吗?
    • 不,似乎单元测试以与部署的应用程序类似的方式被沙盒化,因此即使单元测试也无法写入磁盘。一种解决方案可能是将需要 GAE 功能的单元测试与不需要的单元测试分开。
    • 乔,我修改了我的测试,使它们在 GAE 之外,但 .cache 目录仍然是空的。如果您有任何进一步的见解,我将不胜感激。
    【解决方案2】:

    如果您试图通过缓存 API 调用结果来加快测试运行速度,请停下来考虑一下您是否走错路了。

    如果您可以重组您的代码,以便将 API 调用替换为 unittest.mock,那么您的测试将运行得更快。

    【讨论】:

    • 是的,我绝对可以做到这一点。我没有这样做的原因是,为一大堆 API 调用执行此操作既乏味又耗时。特别是因为 API 的返回数据有些大。交钥匙缓存解决方案将为我节省大量时间。 ;-)
    【解决方案3】:

    我刚刚遇到vcrpy,它似乎正是这样做的。有机会尝试后,我会更新这个答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-15
      • 2021-11-09
      • 2021-11-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多