parse.com의 api 호출 테스트하느라 만들어본 intrumentation test 작성기
parse.com에 만들고 있는 앱에 테스트 데이터를 만들고, api도 호출해 보고 싶어졌다. robolectric을 사용해보려고 했다. 이런 거 손으로 한두번 돌려보다가 결국 나중엔 자동화 도구를 찾게되기 마련이라 애초에 처음부터 준비를 하는게 시간과 에너지를 절약하는 길이다.
android studio 최근 버전에선 robolectric을 사용하기 매우 편해졌다. robolectric도 이번엔 과감히 3.0을 사용했다. 연동 방법은 이 글에 잘 나와있다. 요약하면 android studio에서 unit test TestArtifact 기능 활성화 하고, robolectric 3.0 의존 관계만 gradle에 추가하면 그냥 끝난다. 예전엔 gradle plugin도 추가하고 이것저것 해 줘야 했는데 엄청 편해졌다. 게다가 3.0엔 RobolectricGradleTestRunner 도 추가가 되어 더 편해진 듯.
하지만 테스트 실행하면 바로 아래 예외가 튀어나온다.
Exception in thread "ParseRequest.NETWORK_EXECUTOR-thread-1" java.lang.UnsatisfiedLinkError: no javacrypto in java.library.path
딱 이 예외는 아니지만 비슷한 문제가 robolecric github 이슈에 등록이 되어있고, 'unit test에선 직접 api 호출하지 말고 mocking하세요' 라는 교과서적인 대답이 달려있다. 이게 참 맞는 말이긴 한데, 슬쩍슬쩍 api 호출 한두개 할 때 robolectric을 쓰기가 어려워져서 아쉽네.
저 예외를 꾸역꾸역 해결해서 robolectric으로 내가 원하던 api 호출이 가능하게 만드느니 그냥 자연스럽게 instrumentation test를 만들어서 해결하는 방향으로 선회했다.
instumentation test는 정말 오랫만에 다시 들여다봤는데, 이 쪽도 그 사이에 많이 바뀌었다. Building Instrumented Unit Tests를 보면 이제 android testing support library 덕분에 junit4 기반으로 테스트를 만들어서 돌릴 수 있다. 내 경우 현재 최신인 22.1.1 support v4와 test runner v0.2 를 같이 붙이니 support annotation의 버전 차이 때문에 gradle의 dependency에 문제가 생겼다. 이 문제는 아래와 같이 해결했다.
androidTestCompile 'com.android.support:support-annotations:22.1.1' androidTestCompile('com.android.support.test:runner:0.2') { exclude group: 'com.android.support', module: 'support-annotations' }
이제 android studio의 Test Artifact를 다시 Android Instrumentation Tests로 돌리고, app/src/androidTest/java 밑에 테스트 클래스를 만들어서 돌리니 잘~ 실행이 된다. 워낙 테스트가 간단하고 프로젝트가 (아직은) 작아서 그런지, 예전 느낌과 달리 빌드와 실행도 금방 끝나네. 항상 robolectric에만 의존하는 습관이 있었는데, 어찌보면 단위 테스트보다는 일종의 통합 테스트라고 볼 수 있는, 직접 api 호출하는 테스트는 intrumentation test가 답인지도 모르겠다. 예전에 비해 이젠 작성하기도 많이 편해졌다. 작성 샘플은 안드로이드 문서를 참고하면 된다.

















