缓存Google API调用单元测试

时间:2017-11-14 15:16:44

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

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

运行我的单元测试时,我会对API进行大量调用。这会减慢我的测试速度并导致成本增加。

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

我找到了这个Google API page,建议这样做:

pip

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

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

缓存不起作用,上面的解决方案似乎太简单了,所以我怀疑我错过了什么。

更新:

我更新了我的测试以便不使用App Engine(只是常规的单元测试),而且我还发现我可以将我创建的NLP = discovery.build("language", "v1", API_KEY) 传递给Google API客户端,如下所示:

http

现在,缓存了初始发现调用,但实际的API调用没有被缓存,例如,此调用未缓存:

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

3 个答案:

答案 0 :(得分:1)

建议的代码:

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

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

  from google.appengine.api import memcache

  http = httplib2.Http(cache=memcache)

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

如果失败,您还可以尝试memoization。我成功地记得调用缓慢或片状的API,但这是以增加内存使用为代价的(所以我需要更大的实例)。

编辑:我从您的评论中看到您在本地遇到此问题。我原本以为memoization会是另一种选择,但是对httplib2进行攻击的需要使得它过于复杂。我回想起如何说服httplib2做正确的事。

答案 1 :(得分:0)

如果您试图通过缓存API调用结果来加快测试运行速度,请停止并考虑您是否采取了错误的转向。

如果您可以重新构建代码,以便可以使用 var emptyText = true var isMinusPrinted=false//add this line here fun numberEvents(view: View) { var checkButton:Boolean = false if(emptyText){ viewResult.setText("") } emptyText = false var button = view as Button var isClicked = viewResult.text.toString() when (button.id) { buttonOne.id -> isClicked += "1" buttonTwo.id -> isClicked += "2" buttonThree.id -> isClicked += "3" dotButton.id-> isClicked+="." plusMinusBtn.id->{//add this block of code from here var resultWithoutMinus=Math.abs(isClicked.toInt()) //ex: 123 if(!isMinusPrinted){ isClicked = "-" + resultWithoutMinus//this line for example give result like: -123 isMinusPrinted=true } else{ isClicked=resultWithoutMinus //result became : 123 isMinusPrinted=false } }//to here } viewResult.setText(isClicked) } 替换API调用,那么您的测试运行速度会快得多。

答案 2 :(得分:0)

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