Dev

안드로이드 TDD 요약

ingeeC 2025. 2. 21. 16:22

안드로이드 앱을 개발하게 됐습니다.
할 일은 많고 일손은 부족합니다. 무심코 개발을 진행하다 삐끗하면 버그 잡느라 많은 시간을 소진할 것 같습니다. 그래서 웹앱 개발할 때 도움됐던 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, ...
  • 테스트 피라미드

 

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을 이용해서 작성한다

 

후기

  • 안드로이드 테스트 자동화 관련 최신 자료가 별로 없었다
  • 테스트 도구 자체는 오랫동안 변화가 없었던 듯하다

 

Ref.