2017-11-14 29 views
0

Google Cloud Language APIを使用するGoogle App Engineプロジェクトがあり、Google APIクライアントライブラリ(Python)を使用してAPI呼び出しを行っています。単体テスト用Google API呼び出しのキャッシング

ユニットテストを実行しているときに、私はAPIをかなり呼び出しています。これは私のテストを遅らせ、またコストもかかります。

私はテストをスピードアップし、API料金を避けるためにGoogle APIへの呼び出しをキャッシュしたいと思います。

私はこれを行うことを示唆している。このGoogle API page、見つかった:(そこGAEのmemcacheのを使用するための別のオプションがあるが、テストコードの呼び出しの間で永続化されることはありません

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

をそして私は私のコードにこれらの行を追加しました)、右これらの行の後に、私は私のAPIコール接続の作成:

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

キャッシングが動作していないし、上記溶液は、私は、私は何かが欠けてい疑うあまりにも簡単なようですが。

UPDATE:

のApp Engineを使用しないように、私は私のテストを更新しました(普通のユニットテスト)と私はまた、私はこのような、GoogleのAPIクライアントに私が作成したhttpを渡すことができることを考え出し:

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

さて、最初の発見コールがキャッシュされているが、実際のAPIコールは、例えばキャッシュされません、この呼び出しがキャッシュされていない:

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

答えて

1

提案コード:

http = httplib2.Http(cache=".cache")は、 ".cache"というディレクトリのローカルファイルシステムにキャッシュしようとしています。 App Engineの場合はcannot write to the local filesystemなので、これは何もしません。

代わりに、Memcacheにキャッシュすることができます。すべてのApp Engineのアプリがshared memcacheへの無料アクセスを取得しているので、これは何もないよりはましである必要があり

 
    from google.appengine.api import memcache 

    http = httplib2.Http(cache=memcache) 

:参照Python Client docs上の他の提案は、まさにこれを実行することです。

これが失敗した場合は、メモを取ってみることもできます。私は、遅くなったり、剥がれたAPIへの呼び出しをメモに記録して成功しましたが、メモリ使用量が増えてしまいます(大きなインスタンスが必要です)。

編集:この問題はローカルで発生しています。もともと私はmemoizationが代わりになると考えていましたが、httplib2をハックする必要性はそれを過度に複雑にしています。私は正しいことをするためにhttplib2を納得させる方法を考えることに戻ります。

+0

ローカルマシンでテストしているので、ファイルシステムのバージョンが機能すると思っていました。私はmemcacheのバージョンを試しましたが、私の単体テストの呼び出しの間にmemcacheが保持されていないので、どちらも動作しません。 –

+0

一度実行すると.cacheディレクトリに何かがありますか? – jjjjoe

+0

いいえ、単体テストでも展開されたアプリケーションと同様にサンドボックス化されているので、単体テストでもディスクに書き込むことはできません。 1つの解決策は、GAE機能を必要とする単体テストとそうでない単体テストを分離することです。 –

0

API呼び出しの結果をキャッシュしてテストを高速化しようとしている場合は、間違った方向に回った可能性があるかどうかを停止し、検討してください。

API呼び出しをunittest.mockに置き換えることができるようにコードを再構成できれば、テストははるかに高速に実行されます。

+0

はい、私は間違いなくこれを行うことができます。なぜなら、私はAPI呼び出しのすべてのためにこれを行うのは退屈で時間がかかるということではありません。特に、APIの返品データが多少あるためです。ターンキーのキャッシュソリューションは、私に多くの時間を節約します。 ;-) –

関連する問題