UI 테스트 자동화

3 분 소요

유저 상호작용 테스트는 앱을 상호작용할 때 불편한 경험이나 예상치 못한 결과를 맞닥뜨리지 않도록 도움을 준다. 앱의 UI 가 기능적으로 잘 돌아가는걸 검증 하려면 UI 테스트를 만드는걸 습관화 해야한다.

간단하게 UI 테스트를 하는 방법은 테스터(사람)가 앱의 동작들을 직접 수행하고 정확하게 동작하는지 확인하는방법이다. 하지만 직접 테스트하는건 시간 소모적이고 에러를 유발하기 쉽다.

보다 효율적인 방법은 유저 동작을 자동적으로 수행하도록 UI 테스트를 작성하는 것이다. 자동화된 접근은 반복적인 방법으로 테스트를 빠르고 안정적이게 해준다.

UI 테스트들은 앱을 띄우고 (아니면 앱의 일부분이나) 유저 상호작용을 시뮬레이션 하며 최종적으로 앱이 적절히 반응하는지 확인한다. 그것들은 작은 컴포넌트의 동작 확인부터 유저 흐름 전체를 횡단하는 큰 탐색 테스트까지 범위 지정 할 수 있는 통합 테스트다.

UI 테스트는 회귀 를 확인하기 유용하고 다른 API 레벨과 물리기기들 에서의 호환성 확인을 할 수 있다.

UI 테스트라는 용어는 올바른 UI 동작을 확인하는 어떤 테스트든 사용된다. 보통 기기에서 동작하는 계측 테스트이며 앱이 올바르게 동작하는지 계측을 통해 확인한다. 하지만 로컬 테스트에서도 UI 테스트를 만들 수 있다. 로컬 테스트이기 때문에 개발머신에서 동작하며 에뮬레이터나 기기를 필요로 하지 않는다.

안드로이드 스튜디오에서 계측 테스트


안드로이드 스튜디오를 사용해 계측 테스트를 동작 시키려면 src/androidTest/java 폴더에 테스트 코드를 구현하면 된다. Android Plug-in for Gradle 가 테스트 코드를 기반으로 테스트 앱을 빌드하고 대상앱과 동일한 기기에 테스트 앱을 로드한다. 특정 사용 시나리오를 다루는 테스트 작업을 수행하기 위해 UI 테스트 프레임 워크를 사용해 테스트 코드에서 앱의 유저 상호작용을 시뮬레이션 할 수 있다.

Jetpack Frameworks

Jetpack 은 UI 테스트 작성을 위한 API 들을 제공하는 다양한 프레임워크를 포함하고 있다.

  • Espresso Testing Framework 는 단일 대상 앱에서 뷰와 상호작용을 시뮬레이션 할 수 있는 UI 테스트를 작성하기 위해 API 들을 제공해준다. Espresso 는 Android 4.0.1 (API level 14) 이나 그 위의 기기에서 동작하고 가장 큰 이점은 테스트 하는 앱의 UI 테스트 동작의 자동 동기화를 제공한다. Espresso 는 메인스레드가 유휴 상태인걸 감지하면 테스트 명령어를 적절하게 동작시켜줌으로 신뢰도를 향상시킨다.

  • Jetpack Compose 는 Compose 화면 및 구성 요소를 실행하고 상호 작용하기 위한 테스트 API 세트 를 제공합니다. Compose 요소와의 상호 작용은 테스트와 동기화되며 시간, 애니메이션 및 재구성을 완벽하게 제어할 수 있습니다.

  • UI Automator (Android 4.3, API level 18 또는 그 이상) 는 UI 테스트 프레임워크로 시스템과 설치된 앱 사이의 기능적 UI 테스트에 적절하다.

  • Robolectric 는 실제 기기나 에뮬레이터가 아닌 JVM 안의 끊임없는 통합 환경 또는 개발 머신에서 동작하는 로컬 테스트를 만들어 준다. Robolectric 는 Espresso 나 Compose 테스트 API 들을 UI 컴포넌트와 상호작용을 위해 사용할 수 있다.

불안정성과 동기화

모바일 앱과 프레임워크의 비동기라는 특징으로 인해 때로는 신뢰가고 반복적인 테스트 작성을 어렵게 만든다. 테스트 프레임워크는 유저 이벤트가 주입됫을때 스크린의 텍스트가 변한다거나 액티비티의 완전한 재생성 같은 것들의 반응이 완료될 때까지 기다려야 한다. 테스트가 결정적인 동작을 가지지 못한다면 그것은 불안정하다.

Compose 나 Espresso 는 테스트를 고려해 설계되었고 UI 가 다음 테스트 동작이나 Assertion 이 있을시
유휴 상태임을 확실히 보장한다. 이것이 동기화다.

테스트 동기화

테스트를 위해 비동기 또는 알수 없는 백그라운드 동작은 이슈가 생길 수 있다.
(DB 에서 데이터 로딩 , 무한한 애니메이션 보여주기 등)

테스트에서 신뢰도를 올리기 위해서 백그라운드 동작에 기록하기 위해 Eepresso Idling Resource 를 설치 할 수 있다. 또한 코루틴을 위한 TestCoroutineDispatcher 또는 RXJava 를 위한 RxIdler 같이 유휴 상태를 질의하거나 동기화 향상을 위해 테스트 버전용 모듈로 교체할 수 있다.

주의: 앱의 동작과 안정화을 위해 임의의 기간 (sleep 같이) 동안 앱을 중지하는걸 피해라. 이건 불필요하게 느리고 불안정하다. 다른 환경에서 동작하는 같은 테스트들이 더 많게 혹은 적게 시간이 걸릴 수 있기 때문이다.

아키텍쳐와 테스트 설정


앱의 아키텍쳐는 테스트를 테스트 더블을 위해 일부를 대체할 수 있도록 하고 테스트를 돕기위한 유틸을 제공해주는 라이브러리를 사용해야한다. 예를 들어 data repository 모듈을 fake 에 테스트를 위해 정해져 있는 데이터를 제공하는 인메모리 버전으로 교체를 할 수 있다.

추천하는 접근 방식은 dependency injection 을 사용하는 것이다. 직접 DI 를 구축할 수 있지만 Hilt 같은 DI 프레임워크를 사용하길 권한다.

왜 테스트 자동화를 해야하는가?


안드로이드 앱은 다양한 API 레벨들과 폼팩터를 통해서 다른 수천가지의 기기들을 대상으로 삼을 수 있다. 그리고 OS 가 유저에게 제공하는 높은 수준의 사용자 정의는 앱이 부적절하게 렌더링 되거나 몇몇 기기에서 충돌이 날 수 있다.

UI 테스트는 호환성 테스트를 할수 있게 해주고 다른 컨텍스트에서 앱의 동작을 검증한다.
다음과 같은 방식으로 다양한 기기에서 UI 테스트를 동작시킬수 있다.

  • API 레벨 : 21,25,30
  • Locale : English, Korea , Chinese
  • Orientation : Protrait , landscape

더욱이 앱은 태블릿이나 폴더블 등 다른 기기에 대해서도 확인해봐야한다.

출저


Automate UI tests

카테고리: ,

업데이트:

댓글남기기