Android에서 한 번만 작성하면 어디서든 테스트 실행 가능합니다
2019년 1월 30일 수요일
- 새로운 ActivityScenario API를 사용하여 LoginActivity를 시작합니다. 이를 통해 액티비티를 생성하고 재개된(resumed) 상태로 전환하는데, 그러면 사용자에게 표시되어 사용자의 입력을 받을 준비가 됩니다. ActivityScenario는 시스템과의 모든 동기화를 처리하고, 시스템에서 앱을 종료하고(destroyed) 다시 생성하는(recreated) 것과 같이, 테스트해봐야 하는 공통 시나리오에 대한 지원을 제공합니다.
- 우리는 Espresso 뷰 상호 작용 라이브러리를 사용하여 두 텍스트 입력란에 텍스트를 입력하고 UI에서 버튼을 클릭합니다. ActivityScenario와 마찬가지로, Espresso는 멀티스레딩과 동기화를 자동으로 처리하고 테스트 작성에 사용하기 위해 읽을 수 있는 fluent API를 표시합니다.
- 우리는 캡처된 인텐트의 목록을 반환하는 새로운 Intents.getIntents() Espresso API를 사용합니다. 그런 다음, 새로운 Android Truth 확장 프로그램에 속한 IntentSubject.assertThat()을 사용하여 캡처된 인텐트를 확인합니다. Android Truth 확장 프로그램은 기본 Android 프레임워크 객체의 상태를 확인하기 위해 다양한 표현을 제공하고 읽을 수 있는 API를 제공합니다.
우리는 18’Google I/O에서 Jetpack의 일환으로 AndroidX Test를 출시했습니다. Robolectric v4.0과 함께 v1.0.0 Final에 대해서도 소개해드립니다. 1.0.0 버전의 일부로, 모든 AndroidX Test가 이제 오픈소스로 제공됩니다.
AndroidX Test는 instrumentation 및 Robolectric 테스트를 포함한 테스트 환경에서 공통 테스트 API를 제공합니다. 그리고 기존의 Android JUnit 4 지원 기능, Espresso 뷰 상호 작용 라이브러리, 여러 가지 새로운 주요 테스트 API를 포함합니다. 이러한 API는 실제 기기와 가상 기기에서 instrumentation 테스트에 사용할 수 있습니다. 현재 Robolectric 4.0에서 이들 API를 로컬 JVM 테스트에도 사용할 수 있습니다.
로그인 화면을 시작하고, 유효한 사용자 이름과 암호를 입력하고, 홈 화면으로 이동하는지 확인하는 다음 사용 사례를 생각해 보세요.
테스트를 단계별로 살펴봅시다.
- 새로운 ActivityScenario API를 사용하여 LoginActivity를 시작합니다. 이를 통해 액티비티를 생성하고 재개된(resumed) 상태로 전환하는데, 그러면 사용자에게 표시되어 사용자의 입력을 받을 준비가 됩니다. ActivityScenario는 시스템과의 모든 동기화를 처리하고, 시스템에서 앱을 종료하고(destroyed) 다시 생성하는(recreated) 것과 같이, 테스트해봐야 하는 공통 시나리오에 대한 지원을 제공합니다.
- 우리는 Espresso 뷰 상호 작용 라이브러리를 사용하여 두 텍스트 입력란에 텍스트를 입력하고 UI에서 버튼을 클릭합니다. ActivityScenario와 마찬가지로, Espresso는 멀티스레딩과 동기화를 자동으로 처리하고 테스트 작성에 사용하기 위해 읽을 수 있는 fluent API를 표시합니다.
- 우리는 캡처된 인텐트의 목록을 반환하는 새로운 Intents.getIntents() Espresso API를 사용합니다. 그런 다음, 새로운 Android Truth 확장 프로그램에 속한 IntentSubject.assertThat()을 사용하여 캡처된 인텐트를 확인합니다. Android Truth 확장 프로그램은 기본 Android 프레임워크 객체의 상태를 확인하기 위해 다양한 표현을 제공하고 읽을 수 있는 API를 제공합니다.
Robolectric 또는 임의의 실제 기기나 가상 기기를 사용하여 로컬 JVM에서 이 테스트를 실행할 수 있습니다.
Android 기기에서 테스트를 실행하려면 다음 의존성과 함께 'androidTest' 소스 루트에 테스트를 배치하세요.
androidTestImplementation(“androidx.test:runner:1.1.0”)
androidTestImplementation(“androidx.test.ext:junit:1.0.0”)
androidTestImplementation(“androidx.test.espresso:espresso-intents:3.1.0”)
androidTestImplementation(“androidx.test.espresso:espresso-core:3.1.0”)
androidTestImplementation(“androidx.test.ext:truth:1.0.0”)
실제 기기나 가상 기기에서 실행하면 작성한 코드가 Android 시스템과 올바르게 상호 작용함을 확실히 알 수 있습니다. 하지만 테스트 사례의 수가 늘어남에 따라 테스트 실행 시간이 영향을 받기 시작합니다. 로컬 JVM에서 더 빠르게 테스트를 실행할 수 있는 Robolectric과 같은 시뮬레이터에서 다수의 작은 단위 테스트를 실행하는 동안 실제 기기에서는 소수의 더 큰 테스트만 실행하도록 결정할 수 있습니다.
Robolectric 시뮬레이터를 사용하여 로컬 JVM에 대한 테스트를 실행하려면 '테스트' 소스 루트에 테스트를 배치하고 gradle.build에 다음 행을 추가하세요.
testImplementation(“androidx.test:runner:1.1.0”)
testImplementation(“androidx.test.ext:junit:1.0.0”)
testImplementation(“androidx.test.espresso:espresso-intents:3.1.0”)
testImplementation(“androidx.test.espresso:espresso-core:3.1.0”)
testImplementation(“androidx.test.ext:truth:1.0.0”)
testImplementation (“org.robolectric:robolectric:4.0”)
android {
testOptions.unitTests.includeAndroidResources = true
}
시뮬레이터와 instrumentation 사이의 테스트 API를 통합하면 많은 흥미로운 가능성이 열립니다! Google I/O에서도 발표한 Project Nitrogen을 통해 런타임 환경 간에 테스트를 원활하게 이동할 수 있을 것입니다. 이는 곧 새로운 AndroidX Test API에 대해 작성된 테스트를 수행하고 로컬 JVM, 실제 기기 또는 가상 기기, 더 나아가 Firebase Test Lab과 같은 클라우드 기반 테스트 플랫폼에서도 테스트를 실행할 수 있음을 의미합니다. 이를 통해 개발자가 자신이 개발한 애플리케이션의 품질에 관해 빠르고 정확하며 실행 가능한 피드백을 받을 수 있는 기회를 누리게 될 것이라는 사실에 매우 기쁩니다.
자세히 알아보기
출시 노트:
- AndroidX Test: https://developer.android.com/training/testing/release-notes
- Robolectric: https://github.com/robolectric/robolectric/releases/
Robolectric: https://github.com/robolectric/robolectric
AndroidX Test: https://github.com/android/android-test