[android] Espresso 테스트 이슈 해결

안드로이드 앱을 개발할 때 UI 테스트 자동화는 매우 중요합니다. 그러나 때때로 Espresso 테스트 중에 문제가 발생할 수 있습니다. 이번 블로그에서는 일반적인 Espresso 테스트 이슈와 그 해결 방법에 대해 알아보겠습니다.

Contents

  1. Espresso 테스트 실패 시 주요 이슈
  2. 테스트 이슈 해결 방법
    1. Idling resource 구현
    2. UI 스레드 조작 제약 해제
  3. 마치며

1. Espresso 테스트 실패 시 주요 이슈

Espresso 테스트가 실패하는 주요 이유는 앱이 메인 스레드에서 UI 이벤트를 처리하지 않는 경우입니다. 또한, 네트워크 호출 등으로 UI 스레드가 바쁜 경우에도 테스트가 실패할 수 있습니다. 이와 같은 이유로 Espresso는 일반적으로 앱이 대기 상태에 있을 때 자동으로 잠시 대기하는 Idling resources를 제공합니다.

2. 테스트 이슈 해결 방법

2.1 Idling resource 구현

자체 Idling resource를 구현하여 Espresso가 UI 스레드가 대기 중임을 인식하도록 할 수 있습니다. 이를 통해 Espresso 테스트가 대기 시간을 인식하고, 테스트 동안 패턴을 확인하여 정상적으로 수행될 수 있도록 할 수 있습니다.

아래는 Idling resource의 간단한 예시입니다.

public class CustomIdlingResource implements IdlingResource {
    private ResourceCallback resourceCallback;
    private boolean isIdle = false;

    @Override
    public String getName() {
        return CustomIdlingResource.class.getName();
    }

    @Override
    public boolean isIdleNow() {
        return isIdle;
    }

    @Override
    public void registerIdleTransitionCallback(ResourceCallback callback) {
        this.resourceCallback = callback;
    }

    public void setIdleState(boolean isIdle) {
        this.isIdle = isIdle;
        if (isIdle && resourceCallback != null) {
            resourceCallback.onTransitionToIdle();
        }
    }
}

2.2 UI 스레드 조작 제약 해제

안드로이드 9 (Pie) 이상에서는 StrictMode의 UI 스레드 조작 제약으로 테스트가 실패할 수 있습니다. 다음과 같이 특정 부분에서 해당 제약을 일시적으로 해제할 수 있습니다.

StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().permitAll().build());

3. 마치며

이러한 방법들을 통해 안드로이드 앱의 Espresso 테스트의 안정성을 높일 수 있습니다. 적절한 Idling resource를 구현하고, UI 스레드 조작 제약을 해제함으로써 테스트 작성 및 유지보수에 도움이 될 것입니다.

만약 여전히 Espresso 테스트에서 문제가 발생한다면, Espresso troubleshooting guide를 참조하는 것을 권장합니다.