안드로이드 앱을 개발할 때 UI 테스트 자동화는 매우 중요합니다. 그러나 때때로 Espresso 테스트 중에 문제가 발생할 수 있습니다. 이번 블로그에서는 일반적인 Espresso 테스트 이슈와 그 해결 방법에 대해 알아보겠습니다.
Contents
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를 참조하는 것을 권장합니다.