이 도움말에서는 Compose에서 waitUntil 테스트 API를 사용하여 특정 조건이 충족될 때까지 기다리는 방법을 알아봅니다. 이는 일부 상황에서 리소스를 유휴 상태로 두는 대신 사용할 수 있는 좋은 대안입니다.
[2023년 업데이트] 요약: Compose 테스트 (v1.4.0 이상)에서 동기화하려면 새 waitUntil API를 사용하세요.
동기화란 무엇인가요?
테스트를 분류하는 한 가지 방법은 범위에 따라 분류하는 것입니다. 소규모 테스트(단위 테스트)는 앱의 작은 부분에 초점을 맞추는 반면 대규모 테스트(엔드 투 엔드)는 앱의 큰 부분을 다룹니다. 새로 업데이트된 테스트 문서에서 이러한 테스트 유형과 기타 테스트 유형에 관해 자세히 알아보세요.
Enter를 누르거나 클릭하여 이미지를 전체 크기로 보기
동기화는 테스트에서 다음 작업을 실행해야 하는 시점을 알 수 있도록 하는 메커니즘입니다. 확인할 코드 청크가 클수록 테스트와 동기화하기가 어려워집니다. 단위 테스트에서는 코드가 실행되는 방식을 완전히 제어하여 검증하기가 쉽습니다. 하지만 더 많은 클래스, 모듈, 레이어를 포함하도록 범위를 확장하면 테스트 프레임워크에서 앱이 작업 중인지 아닌지 알기가 어려워집니다.
Enter를 누르거나 클릭하여 이미지를 전체 크기로 보기
androidx.test 및 확장된 Compose 테스트는 내부적으로 몇 가지 트릭을 사용하므로 이 문제에 대해 너무 걱정하지 않아도 됩니다. 예를 들어 기본 스레드가 사용 중이면 다음 줄을 실행할 수 있을 때까지 테스트가 일시중지됩니다.
하지만 모든 것을 알 수는 없습니다. 예를 들어 백그라운드 스레드에서 데이터를 로드하면 테스트 프레임워크에서 다음 작업을 너무 빨리 실행하여 테스트가 실패할 수 있습니다. 이 문제가 발생하는 빈도가 낮아 테스트가 불안정해지는 경우가 가장 심각합니다.
옵션 1: 유휴 리소스
유휴 리소스는 개발자가 앱이 언제 사용 중인지 결정할 수 있는 Espresso 기능입니다. 다음 두 가지 방법으로 사용할 수 있습니다.
1. 테스트에서 볼 수 없는 작업을 실행하는 프레임워크나 라이브러리에 설치하는 경우
이의 좋은 예는 RxJava 스케줄러를 래핑하는 RxIdler입니다. 이렇게 하면 테스트 설정이 테스트 코드에서 깔끔하게 분리되므로 유휴 리소스를 등록하는 데 권장되는 방법입니다.
2. 테스트 중인 코드를 수정하여 앱이 사용 중인지 여부에 관한 정보를 명시적으로 노출합니다.
예를 들어 데이터 소스에서 데이터를 로드하는 동안 저장소 (또는 테스트 더블)가 사용 중임을 나타내도록 수정할 수 있습니다.
프로덕션 코드가 오염되거나 복잡한 테스트 더블이 생성되고 설치하기 어려운 상황이 있으므로 이는 이상적이지 않습니다. 예를 들어 Kotlin Flow에서 유휴 리소스를 어떻게 사용하나요? 어떤 업데이트가 최종 업데이트인가요?
대신 상황을 기다릴 수 있습니다.
옵션 2: 잘못된 방식으로 기다리기
데이터 로드는 일반적으로 빠릅니다. 특히 가짜 데이터를 사용하는 경우 몇 초 동안 테스트를 절전 모드로 전환할 수 있는데 유휴 리소스로 시간을 낭비할 필요가 없습니다.
이 테스트는 필요한 것보다 느리게 실행되거나 실패합니다. UI 테스트가 수백 개 또는 수천 개 있는 경우 테스트가 최대한 빨리 실행되기를 원할 것입니다.
또한 에뮬레이터나 기기가 잘못 작동하고 버벅거려 해당 작업이 2000ms보다 약간 더 오래 걸려 빌드가 중단되는 경우도 있습니다. 테스트가 수백 개에 달하면 이 문제가 매우 심각해집니다.
옵션 3: 올바른 방법으로 기다리기
테스트 중인 코드를 수정하여 코드가 언제 사용 중인지 노출하고 싶지 않다면 임의의 시간 동안 기다리는 대신 특정 조건이 충족될 때까지 기다리는 방법도 있습니다.
Compose에서는 불리언을 생성하는 다른 함수를 사용하는 waitUntil 함수를 활용할 수 있습니다.
2023년 3월 22일 업데이트: Compose 1.4.0부터 다음과 같은 새로운 waitUntil API 세트가 추가되었습니다.
[1.4.0 전: waitUntilExists, waitUntilNodeCount 도우미 사용]
다음과 같이 사용합니다.
UI와 테스트를 동기화해야 하는 경우에만 이러한 API를 사용하세요. 모든 테스트 문에서 동기화하면 테스트 코드가 불필요하게 오염되어 유지보수가 어려워집니다.
그렇다면 언제 사용해야 할까요? 관찰 가능한 항목 (LiveData, Kotlin Flow 또는 RxJava 사용)에서 데이터를 로드하는 것이 좋은 사용 사례입니다. UI가 유휴 상태로 간주되기 전에 여러 업데이트를 수신해야 하는 경우 waitUntil를 사용하여 동기화를 단순화하는 것이 좋습니다.
예를 들어 뷰에서 흐름을 수집하는 경우 다음을 충족해야 합니다.
다음과 같이 여러 항목을 내보냅니다.
repository가 첫 번째 결과를 반환하는 데 불확실한 시간이 걸리면 테스트 프레임워크는 '로딩'이 유휴 상태 (collectAsState에 할당된 초기 값)라고 생각하고 다음 문을 계속 실행합니다.
따라서 UI에 로드 표시기가 표시되지 않는지 확인하면 테스트의 신뢰성을 훨씬 높일 수 있습니다.
테스트에 참여해 주셔서 감사합니다.
코드 스니펫 라이선스:
Copyright 2022 Google LLC. SPDX-License-Identifier: Apache-2.0
계속 읽기
-
방법
이 게시물에서는 시각적으로 좀 더 흥미로운 주제인 카메라 미리보기에 스포트라이트 효과를 구현하는 방법을 살펴보겠습니다. 얼굴 감지를 효과의 기준으로 사용합니다.
Jolanda Verhoef • 8분 읽기
-
방법
과도한 배터리 소모가 Android 사용자의 가장 큰 관심사임을 인식한 Google은 개발자가 더 효율적인 앱을 빌드할 수 있도록 지원하기 위해 상당한 조치를 취해 왔습니다.
Alice Yuan • 8분 읽기
-
방법
온디바이스 모델과 클라우드 모델을 모두 사용하는 AI 지원 기능의 예를 제공하여 사용자에게 즐거운 경험을 선사할 수 있도록 영감을 드리고자 합니다.
Thomas Ezan, Ivy Knight • 전문 길이: 2분
소식 받아 보기
Android 개발 관련 최신 정보를 이메일로 받아 보세요.