我有一个使用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)
答案 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,但这是以增加内存使用为代价的(所以我需要更大的实例)。
答案 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这似乎就是这样做的。在我有机会尝试之后,我会更新这个答案。