안드로이드 앱을 개발하게 됐습니다.
할 일은 많고 일손은 부족합니다. 무심코 개발을 진행하다 삐끗하면 버그 잡느라 많은 시간을 소진할 것 같습니다. 그래서 웹앱 개발할 때 도움됐던 TDD를 안드로이드 앱 개발에도 적용해보기로 합니다.
관련 내용을 요약합니다. 과제가 마무리되면 소감도 올려보겠습니다.
개요
- 안드로이드는 앱 테스트 자동화를 위해 JUnit(Test Runner)을 사용한다
- 안드로이드 앱 프로젝트를 생성하면 유닛 테스트(Unit Test)와 기기 테스트(Instrumentation Test) 환경이 자동 생성된다
- Unit Test: app/src/test 디렉토리의 test 프로젝트
- Instrumentation Test: app/src/androidTest 디렉토리의 androidTest 프로젝트
상세
- 주로 ViewModel 클래스가 안드로이드 Unit Test의 대상이다
- JUnit에서 사용하는 주요 어노테이션은 다음과 같다
- @Before, @After, @Test, @Ignore, ...
- 테스트 피라미드
- (최상위) UI Test : Espresso, Robotium, UI Automator 사용
- (중간) Integration Test : Robolectric 사용
- (최하위) Unit Test : JUnit, Mockito, PowerMock 사용
. https://medium.com/arabamlabs/android-unit-test-i-c05da693cceb
TDD 관점 상세
- 테스트 코드를 (구현 코드보다) 먼저 작성해야 TDD다
- TDD의 효과
- 테스트 코드가 프로젝트에 대한 최신의(up-to-date한) 문서 역할을 한다
- 확신을 갖고 개발할 수 있다 (코드 수정으로 인해 깨지는 기능이 없음을 확신할 수 있다)
- 테스트 피라미드
- (최상위) End-to-end Test : Appium, Calaba.sh 사용 (둘 다 Selenium 기반 도구)
- (중간) Integration Test : mockServer with OkHttp 사용
- (최하위) Unit Test : JUnit, Robolectric, Espresso 사용
- 다음과 같은 경우 Unit Test가 아니다
- DB를 호출하는 경우
- 네트워크를 이용하는 경우
- 파일 시스템을 건드리는 경우
- 다른 유닛 테스트와 동시에 실행할 수 없는 경우
- 테스트 실행을 위해 (환경 변수 설정 같은) 특별한 작업이 필요한 경우
테스트 프레임워크 Robolectric
- app/src/test 디렉토리에 위치하는 Unit Test 작성에 적합하다 (실행 속도가 빠르고 안드로이드 view의 라이프사이클을 테스트할 수 있다)
- 테스트 코드 샘플 : 버튼을 클릭하면 inputText에 입력한 문자열을 label에 표시
@Test
public void shouIdDispIayTextFromEditTextOnTextField_whenClickOnChangeHelloWorldButton() throws Exception {
EditText inputText = (EditText) mainActivity.findViewById(R.id.label_input);
inputText.setText("This app is fun!");
changeHelloWorldTextButton.performClick();
assertThat(helloWordLabel).hasText("This app is fun!");
}
테스트 프레임워크 Espresso
- app/src/androidTest 디렉토리에 위치하는 기기 테스트(instrumentation test: 실제 기기 또는 에뮬레이터에서 실행되는 테스트) 작성에 적합하다
- Espresso 테스트는 실행 시간이 오래 걸린다 (그래서 빠른 피드백이 필수인 TDD에 적합하지 않다)
- Unit Test보다 End-to-end Test에 가깝게 쓰는 게 좋다
결론 (이렇게 해보기로 했다)
- app/src/test 디렉토리의 test 프로젝트에서 Roboletric을 이용해서 Unit Test를 작성하면서 TDD를 시도한다
- 통합 테스트는 필요할 경우(Unit Test 보다 적게), app/src/androidTest 디렉토리의 androidTest 프로젝트에서 Espresso를 이용해서 작성한다
- e2e 테스트는 정말 필요성할 때만, Appium을 이용해서 작성한다
후기
- 안드로이드 테스트 자동화 관련 최신 자료가 별로 없었다
- 테스트 도구 자체는 오랫동안 변화가 없었던 듯하다