방법

Compose 테스트에서 리소스 유휴 상태로 두는 대신 사용할 수 있는 방법: waitUntil API (업데이트됨)

3분 읽음
Jose Alcérreca
개발자 관계팀 엔지니어

이 도움말에서는 Compose에서 waitUntil 테스트 API를 사용하여 특정 조건이 충족될 때까지 기다리는 방법을 알아봅니다. 이는 일부 상황에서 리소스를 유휴 상태로 두는 대신 사용할 수 있는 좋은 대안입니다.

[2023년 업데이트] 요약: Compose 테스트 (v1.4.0 이상)에서 동기화하려면 새로운 waitUntil API를 사용하세요.


동기화란 무엇인가요?

테스트를 분류하는 한 가지 방법은 범위를 기준으로 하는 것입니다. 소규모 테스트 또는 단위 테스트는 앱의 작은 부분에 중점을 두는 반면 대규모 테스트 또는 엔드 투 엔드는 앱의 많은 부분을 다룹니다. 새로 업데이트된 테스트 문서에서 이 테스트와 다른 유형의 테스트에 관해 읽어볼 수 있습니다.

Enter 키를 누르거나 클릭하여 이미지를 전체 크기로 봅니다.

large_0_9n_Nqkt_HHUTOQ_In_AI_b113b43bcf.png
앱의 다양한 테스트 범위

동기화 는 테스트에서 다음 작업을 실행할 시점을 알 수 있도록 하는 메커니즘입니다. 확인하려는 코드 청크가 클수록 테스트와 동기화하기가 더 어려워집니다. 단위 테스트에서는 확인하려는 코드의 실행을 완전히 제어하기가 쉽습니다. 그러나 더 많은 클래스, 모듈, 레이어를 포함하도록 범위를 넓히면 테스트 프레임워크에서 앱이 작업 중간에 있는지 여부를 알기가 어려워집니다.

Enter 키를 누르거나 클릭하여 이미지를 전체 크기로 봅니다.

large_correct_b1a355f41b.webp
테스트와 앱 간의 올바른 동기화

androidx.test 및 확장 프로그램인 Compose 테스트는 이 문제를 너무 걱정하지 않도록 내부적으로 몇 가지 트릭을 사용합니다. 예를 들어 기본 스레드가 사용 중이면 테스트는 다음 줄을 실행할 수 있을 때까지 일시중지됩니다.

그러나 모든 것을 알 수는 없습니다. 예를 들어 백그라운드 스레드에서 데이터를 로드하면 테스트 프레임워크가 다음 작업을 너무 빨리 실행하여 테스트가 실패할 수 있습니다. 가장 안 좋은 상황은 이 문제가 아주 적은 비율로만 발생하여 테스트가 불안정해지는 것입니다.

옵션 1: 리소스 유휴 상태로 두기

리소스 유휴 상태로 두기는 개발자가 앱이 사용 중인 시점을 결정할 수 있도록 하는 Espresso 기능입니다. 이 기능을 사용하는 방법에는 두 가지가 있습니다.

1. 테스트에서 볼 수 없는 작업을 실행하는 프레임워크 또는 라이브러리에 설치합니다.

이러한 좋은 예는 RxIdler이며, 이는 RxJava 스케줄러를 래핑합니다. 이렇게 하면 테스트 설정이 테스트 코드에서 깔끔하게 분리되므로 리소스 유휴 상태로 두기를 등록하는 것이 좋습니다.

2. 테스트 중인 코드를 수정하여 앱이 사용 중인지 여부에 관한 정보를 명시적으로 노출합니다.

예를 들어 데이터 소스에서 데이터를 로드하는 동안 사용 중임을 나타내도록 저장소 (또는 테스트 더블)를 수정할 수 있습니다.

프로덕션 코드를 오염시키거나 복잡한 테스트 더블을 만들고 설치하기 어려운 상황이 있으므로 이 방법은 이상적이지 않습니다. 예를 들어 Kotlin Flow에서 리소스 유휴 상태로 두기를 어떻게 사용하나요? 최종 업데이트는 무엇인가요?

대신 항목을 기다릴 수 있습니다.

옵션 2: 항목을 기다리는 잘못된 방법

데이터 로드는 일반적으로 빠르며 특히 가짜 데이터를 사용하는 경우 테스트를 몇 초 동안 절전 모드로 전환할 수 있는데 유휴 리소스를 사용하여 시간을 낭비하는 이유는 무엇인가요?

이 테스트는 필요한 것보다 느리게 실행되거나 실패 합니다. 수백 또는 수천 개의 UI 테스트가 있는 경우 테스트가 최대한 빨라야 합니다.

또한 에뮬레이터 또는 기기가 잘못 작동하고 버벅거림이 발생하여 작업이 2,000ms보다 약간 더 오래 걸려 빌드가 중단될 수 있습니다. 수백 개의 테스트가 있는 경우 이는 큰 문제가 됩니다.

0_DOCdjq-JpPDGV5OB.png

옵션 3: 항목을 기다리는 올바른 방법

테스트 중인 코드를 수정하여 사용 중인 시점을 노출하지 않으려면 임의의 시간 동안 기다리는 대신 특정 조건이 충족될 때까지 기다리는 방법도 있습니다.

1_jIYFxE4qlHXMi2SwW6JemA.png

Compose에서는 불리언을 생성하는 다른 함수를 사용하는 waitUntil 함수를 활용할 수 있습니다.

2023년 3월 22일 업데이트: Compose 1.4.0부터 새로운 waitUntil API 세트가 추가되었습니다.

[1.4.0 이전: waitUntilExists, waitUntilNodeCount 도우미 사용]

다음과 같이 사용합니다.

테스트를 UI와 동기화해야 하는 경우에만 이러한 API를 사용하세요. 모든 테스트 문에서 동기화하면 테스트 코드가 불필요하게 오염되어 유지보수가 더 어려워집니다.

그렇다면 언제 사용해야 할까요? 이러한 좋은 사용 사례는 식별 가능한 항목 (LiveData, Kotlin Flow 또는 RxJava 사용)에서 데이터를 로드하는 것입니다. UI가 유휴 상태로 간주되기 전에 여러 업데이트를 수신해야 하는 경우 waitUntil을 사용하여 동기화를 간소화하는 것이 좋습니다.

예를 들어 뷰에서 Flow를 수집하는 경우

여러 항목을 내보냅니다.

repository가 첫 번째 결과를 반환하는 데 시간이 걸리면 테스트 프레임워크는 '로드 중'이 유휴 상태 (collectAsState에 할당된 초기 값)라고 생각하고 다음 문을 계속 실행합니다.

따라서 UI에 로드 중 표시기가 표시되지 않도록 하면 테스트를 훨씬 더 안정적으로 만들 수 있습니다.


즐거운… 기다려… 테스트!


코드 스니펫 라이선스:

Copyright 2022 Google LLC.
SPDX-License-Identifier: Apache-2.0
작성자:

계속 읽기