0

Google Cloud Language API을 사용하는 Google App Engine 프로젝트가 있고 API 호출을 위해 Google API 클라이언트 라이브러리 (Python)를 사용하고 있습니다.단위 테스트 용 Google API 호출 캐싱

단위 테스트를 실행할 때 API에 대한 호출이 많습니다. 이렇게하면 테스트 속도가 느려지고 비용이 발생합니다.

테스트 속도를 높이고 API 청구를 피하기 위해 Google API 호출을 캐시하고 싶습니다. 다른 솔루션을 사용할 수 있다면 내 자신을 롤업하지 않을 것입니다.

내가이 일을 제안이 Google API page 발견 :

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

그리고 내 코드에 다음 줄을 추가 한을 (이 GAE의 memcache에를 사용하는 또 다른 방법입니다하지만 테스트 코드 호출 사이에 지속되지 않습니다)와, 내 API 호출 연결을 만들 바로 다음 줄 뒤에 : 캐싱이 작동하지 않으며 위의 솔루션은 너무 단순 같다

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

그래서 나는 뭔가를 놓치고 생각합니다.

UPDATE :

앱 엔진 사용 (단지 일반 단위 테스트) 및되지 않는다는 것을 나는 또한 내가이 같은 구글의 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에 캐싱을 시도 할 수 있습니다. 참조 Python Client docs에 다른 제안은 바로이 작업을 수행하는 것입니다

 
    from google.appengine.api import memcache 

    http = httplib2.Http(cache=memcache) 

모든 앱 엔진 앱이 아무것도보다 더해야 shared memcache에 무료로 액세스 할 수 있기 때문에.

이 경우 실패하면 메모를 해 볼 수도 있습니다. 느린 API 또는 비정상적인 API 호출을 성공 적으로 메모 해 봤지만 메모리 사용량 증가로 인한 비용 증가 (더 큰 인스턴스가 필요함)가 있습니다.

편집 : 귀하의 의견을 보면이 문제가 로컬에서 발생하는 것으로 확인됩니다. 나는 원래 memoization이 대안이 될 것이라고 생각했지만 httplib2를 해킹 할 필요가 너무 복잡해졌습니다. 나는 httplib2가 옳은 일을하도록 납득시키는 방법에 대해 생각하고 돌아왔다.

+0

로컬 시스템에서 테스트 중이므로 파일 시스템 버전이 작동 할 것으로 생각했습니다. memcache 버전을 시도했지만 memcache가 유닛 테스트 호출간에 유지되지 않기 때문에 작동하지 않습니다. –

+0

단일 실행 후 .cache 디렉토리에 아무 것도 없습니까? – jjjjoe

+0

아니, 단위 테스트도 디스크에 쓸 수 없도록 배포 된 앱과 비슷한 방법으로 샌드 박스 처리되는 것 같습니다. 한 가지 해결책은 GAE 기능을 필요로하는 단위 테스트와 그렇지 않은 단위 테스트를 분리하는 것입니다. –

0

API 호출 결과를 캐싱하여 더 빨리 테스트를 실행하려는 경우 중지하고 잘못 처리했는지 여부를 고려하십시오.

API 호출을 unittest.mock으로 바꿀 수 있도록 코드를 재구성 할 수 있다면 테스트가 훨씬 빨라질 것입니다.

+0

예, 분명히 할 수 있습니다. API 호출 전체에 대해 이렇게하는 것이 지루하고 시간이 많이 걸리는 이유는 아닙니다. 특히 API의 반환 데이터가 다소 크기 때문에 특히 그렇습니다. 턴키 캐싱 솔루션은 많은 시간을 절약 해줍니다. ;-) –