UI Automator: 개념, 주요 용어 및 작동 방식

저자: IT Sectr 게시일: 2026-04-08 읽는 시간: 8 분

UI Automator는 Google의 Android 애플리케이션 자동 UI 테스트 프레임워크로, 시스템 수준에서 작동하며 단일 앱을 넘어 인터페이스 요소와 상호작용할 수 있습니다. Espresso와 달리 UI Automator는 특정 애플리케이션 프로세스에 묶여 있지 않습니다. 시스템 대화 상자, 알림 창을 열고 애플리케이션 간에 전환할 수 있습니다. Google Android Developers에 따르면 UI Automator는 표준 Accessibility Service를 사용하여 기기의 UI 트리에 액세스합니다.

주요 내용

  • UI Automator — Android에서 크로스 애플리케이션 UI 테스트를 위한 프레임워크.
  • UiDevice — 기기 화면 및 요소에 액세스하기 위한 진입점.
  • UiSelector — 텍스트, 클래스, 설명 및 계층 구조로 요소를 찾는 메커니즘.
  • Cross-application — 테스트가 설정, 브라우저 및 테스트 중인 앱 간에 전환 가능.
  • Accessibility Service — UI Automator가 UI 트리를 읽고 조작하는 데 사용.

UI Automator란?

UI Automator는 운영 체제 수준에서 작동하는 Android의 기능적 UI 테스트를 위한 프레임워크입니다. 기기 화면의 모든 요소에 액세스할 수 있는 API를 제공하며, 해당 요소가 어떤 앱에 속해 있는지에 관계없이 — 시스템 상태 표시줄, 권한 대화 상자, 홈 화면 및 타사 앱을 포함합니다. 이는 단일 앱을 넘어서는 시나리오를 테스트하는 데 필수적입니다.

아키텍처적으로 UI Automator는 Accessibility Service를 사용합니다 — TalkBack, Switch Access 및 기타 접근성 도구에서 사용하는 동일한 서비스입니다. 이 서비스를 통해 프레임워크는 현재 화면의 완전한 UI 구성 요소 트리를 가져오고 탭, 스와이프, 텍스트 입력, 길게 누르기 등의 작업을 수행할 수 있습니다.

UI Automator는 Android 4.3(API 18)에서 처음 등장했으며 그 이후로 크로스 애플리케이션 테스트를 위한 Google의 공식 도구로 Android Testing Support Library의 일부가 되었습니다. AndroidX Test에서는 별도의 아티팩트인 androidx.test.uiautomator:uiautomator 버전 2.3.0(2024)으로 사용할 수 있으며, API 18 이후의 모든 Android 버전을 지원합니다.

UI Automator 작동 방식

작동 원리: UI Automator는 현재 화면의 접근성 트리를 스캔하는 방식으로 작동합니다. findObject(selector) 메서드가 호출되면 프레임워크가 View 계층 구조를 탐색하고 UiSelector 조건과 일치하는 첫 번째 요소를 찾아 UiObject — 실제 View와 상호작용하기 위한 프록시를 반환합니다.

UI Automator 테스트 수명 주기

일반적인 UI Automator 테스트는 물리적 기기를 나타내는 UiDevice 인스턴스를 획득하는 것으로 시작됩니다. UiDevice는 요소 찾기, 버튼 누름(홈, 뒤로, 최근) 관리, 화면 회전 및 스크린샷 촬영을 위한 메서드를 제공합니다. UiSelector를 통해 요소를 찾은 후 UiObject에 대한 작업이 수행됩니다.

기본 예제

아래 예제에서 테스트는 설정 앱을 열고 텍스트로 “배터리” 항목을 찾아 탭합니다. UI Automator는 Activity를 시작할 필요가 없습니다 — 타사 앱을 포함하여 기기의 모든 화면에서 작동합니다.

kotlin
val device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())

// 설정 화면 열기
device.pressHome()
device.wait(Until.hasObject(UiSelector().text("설정")), 2000)

// "배터리" 항목을 찾아 탭
val batteryItem = device.findObject(
    UiSelector().text("배터리")
)
batteryItem.clickAndWait(Until.newWindow(), 3000)

UiDevice 및 UiSelector: 주요 클래스

UiDevice는 기기와 상호작용하기 위한 주요 클래스입니다. 요소 찾기, 하드웨어 버튼 누름(홈, 뒤로, 메뉴, 볼륨) 시뮬레이션, 전원 관리, 스크린샷 촬영 및 특정 화면 상태 대기를 위한 메서드를 제공합니다. UiDevice는 테스트당 한 번 생성되며 모든 작업에 재사용됩니다.

UiSelector는 UI 요소를 찾기 위한 유연한 API입니다. Espresso ViewMatchers와 달리 UiSelector는 컴파일이 필요하지 않습니다 — 검색 조건은 메서드 체인을 통해 형성됩니다: text(), className(), description(), resourceId(), index(). 여러 조건은 논리 AND를 통해 자동으로 결합됩니다.

UiSelector 메서드목적
text(String)정확한 요소 텍스트로 검색
textContains(String)부분 텍스트 일치로 검색
resourceId(String)리소스 ID로 검색 (예: com.example:id/button)
className(String)View 클래스 이름으로 검색
description(String)content-description으로 검색
childSelector(selector)컨테이너 내에서 자식 요소 검색

여러 조건으로 검색 예제

화면에 동일한 텍스트를 가진 여러 요소가 있을 때 UiSelector는 기준을 결합할 수 있습니다: ID로 컨테이너를 찾은 다음 그 안에서 텍스트와 클래스로 요소를 찾습니다. 이렇게 하면 원하는 구성 요소의 고유한 식별이 보장됩니다. childSelector 메서드는 검색 범위를 지정된 컨테이너로 좁혀 UI 트리 탐색 속도를 높입니다.

kotlin
val scrollView = device.findObject(
    UiSelector().resourceId("android:id/list")
)

// 목록 내에서 "Wi-Fi" 텍스트가 있는 요소 찾기
val wifiItem = scrollView.findObject(
    UiSelector().text("Wi-Fi")
wifiItem.click()

UI Automator를 사용한 크로스 애플리케이션 테스트

크로스 애플리케이션(앱 간) 테스트는 UI Automator가 선택되는 주요 기능입니다. 프레임워크는 앱 간에 전환하고, 브라우저를 통한 OAuth 로그인을 테스트하고, 시스템 대화 상자(권한, 앱 선택기)를 확인하고, 시스템 상태 표시줄, 알림 패널 및 잠금 화면과 상호작용할 수 있습니다.

OAuth 로그인 테스트

일반적인 크로스 앱 테스트 시나리오: 앱이 OAuth 인증을 위해 브라우저를 열고, 사용자가 로그인과 비밀번호를 입력하면 브라우저가 앱으로 리디렉션합니다. UI Automator는 프로세스 간에 전환하고, 브라우저에서 입력 필드를 찾아 채우고 “로그인”을 탭합니다.

kotlin
// 브라우저가 나타날 때까지 대기
device.wait(Until.hasObject(
    UiSelector().packageName("com.android.chrome")
), 5000)

// 브라우저에서 이메일 입력 필드 검색
val emailField = device.findObject(
    UiSelector().className("android.widget.EditText").instance(0)
)
emailField.text = "user@example.com"

시스템 대화 상자 확인

UI Automator는 시스템 대화 상자를 확인하고 닫을 수 있습니다 — 위치 권한, 알림, 파일 액세스. 이는 시스템이 여러 권한을 순차적으로 요청하는 첫 실행 시나리오를 테스트하는 데 매우 중요합니다. UI Automator가 없으면 시스템 대화 상자가 앱 프로세스에 속하지 않기 때문에 이러한 시나리오를 자동화할 수 없습니다.

UI Automator 대 Espresso: 접근 방식 비교

선택은 테스트 시나리오에 따라 다릅니다. Espresso는 자동 동기화와 최소한의 상용구로 단일 앱을 테스트하는 데 최적화되어 있습니다. UI Automator는 시스템, 브라우저 또는 여러 앱과 상호작용해야 하는 시나리오에 적합합니다.

기준UI AutomatorEspresso
범위전체 기기, 여러 앱단일 앱
동기화수동 (대기, 슬립)자동 (Idling Resource)
속도느림 (서비스를 통한 액세스)빠름 (프로세스 내에서 작동)
시스템 UI지원 (알림, 빠른 설정)지원 안 함
검색 정확도속성별 UiSelector유형 및 계층별 ViewMatchers
안정성낮음 (타이밍에 의존)높음 (자동 대기)

실제로 이러한 프레임워크는 함께 사용되는 경우가 많습니다: Espresso는 높은 안정성으로 기본 앱의 UI 테스트를 담당하고, UI Automator는 앱 경계를 넘는 시나리오 — OAuth 로그인, 시스템 권한, Share Intent 작업에 사용됩니다. 이 조합은 최소한의 테스트 유지 관리 비용으로 최대 UI 커버리지를 제공합니다.

Android 프로젝트에서 UI Automator 설정

통합은 build.gradle에 종속성을 추가하여 수행됩니다. 프레임워크는 AndroidX Test의 일부이며 매니페스트에 추가 권한이 필요하지 않습니다 — 계측 테스트가 시작될 때 Accessibility Service에 대한 액세스가 자동으로 구성됩니다.

Gradle 종속성

최소 구성에는 uiautomator 아티팩트와 표준 AndroidJUnitRunner 테스트 러너가 포함됩니다. UI Automator 테스트는 src/androidTest 디렉토리에 배치되며 Android API 18+를 실행하는 에뮬레이터 또는 물리적 기기에서 실행됩니다.

kotlin
dependencies {
    androidTestImplementation("androidx.test.uiautomator:uiautomator:2.3.0")
    androidTestImplementation("androidx.test.ext:junit:1.2.1")
    androidTestImplementation("androidx.test:runner:1.6.1")
}

UiDevice 및 테스트 구성

UiDevice 인스턴스를 얻으려면 InstrumentationRegistry.getInstrumentation()을 사용합니다. UiDevice는 setUp() 메서드에서 한 번 생성하고 기기 리소스를 절약하기 위해 클래스의 모든 테스트에서 재사용해야 합니다. UiDevice는 스레드 안전하지 않다는 점에 유의하는 것이 중요합니다 — 모든 작업은 테스트 메서드의 동일한 스레드에서 수행되어야 합니다. 각 테스트에서 새 UiDevice를 만들면 오버헤드가 발생하고 실행 속도가 느려집니다. beforeClass 메서드에서 UiDevice를 한 번 만들고 테스트 클래스의 모든 테스트에 재사용하는 것이 좋습니다.

UI Automator에서 대기

Espresso와 달리 UI Automator에는 자동 동기화가 없습니다. 요소가 나타날 때까지 대기하려면 UiDevice.wait(condition, timeout) 메서드를 Until 객체와 함께 사용합니다: Until.findObject(selector), Until.hasObject(selector), Until.gone(selector). 적절한 대기 없이는 경쟁 조건으로 인해 테스트가 불안정해집니다 — 검색 시점에 요소가 화면에 나타나지 않았을 수 있습니다. 안정성을 위해 최소 3~5초의 타임아웃을 설정하는 것이 좋습니다.

자주 묻는 질문

UI Automator와 Espresso의 차이점은 무엇인가요?

UI Automator는 Accessibility Service 수준에서 작동하며 모든 앱과 상호작용할 수 있습니다. Espresso는 단일 앱의 프로세스 내에서 작동하며 UI 스레드와의 자동 동기화를 사용합니다. UI Automator는 크로스 앱 시나리오에 더 적합하고, Espresso는 안정적인 단일 앱 테스트에 더 적합합니다.

UI Automator는 모든 기기에서 실행할 수 있나요?

네, UI Automator는 Android API 18+를 실행하는 모든 기기에서 작동합니다. 루트 액세스가 필요하지 않습니다 — 테스트 시작 시 Instrumentation을 통해 활성화되는 표준 Accessibility Service를 사용합니다.

UI Automator는 화면에서 요소를 어떻게 찾나요?

UI Automator는 Accessibility Service를 사용하여 현재 화면의 완전한 UI 구성 요소 트리를 가져옵니다. 그런 다음 UiSelector가 이 트리를 탐색하고 지정된 기준(텍스트, 클래스, ID, content-description 또는 이들의 조합)으로 요소를 찾습니다.

UI Automator는 스크린샷을 지원하나요?

네, UiDevice.takeScreenshot(storePath) 메서드를 사용하면 현재 화면의 스크린샷을 찍어 파일로 저장할 수 있습니다. 이는 디버깅에 유용합니다: 테스트가 실패하면 스크린샷을 저장하고 화면 상태를 분석할 수 있습니다.

코드 변경 없이 UI Automator 테스트가 때때로 실패하는 이유는 무엇인가요?

UI Automator에는 자동 동기화가 없으므로 테스트가 타이밍에 민감합니다. 애니메이션이 완료되지 않았거나 View가 아직 렌더링되지 않은 경우 findObject가 요소를 찾지 못할 수 있습니다. 해결책은 충분한 타임아웃으로 UiDevice.wait()를 사용하는 것입니다.

요약

UI Automator 도구 세트는 모든 주요 크로스 애플리케이션 테스트 시나리오를 다루며 시스템 수준에서 Android 자동화의 표준입니다.

  • UI Automator — Accessibility Service를 통한 크로스 애플리케이션 Android 테스트 프레임워크.
  • UiDevice — 기기 및 화면 요소에 액세스하기 위한 진입점.
  • UiSelector — 텍스트, ID, 클래스 및 계층 구조로 요소를 찾기 위한 유연한 API.
  • 크로스 앱 테스트 — OAuth 로그인, 시스템 권한, 여러 앱과의 상호작용.
  • Espresso와 비교 — UI Automator는 범위가 넓지만 안정성과 속도가 떨어집니다.
  • 대기 — 테스트 안정성을 위해 UiDevice.wait() 및 Until 조건이 필수적입니다.
  • API 18+ — 프레임워크는 Android 4.3부터 모든 기기를 지원합니다.

턴키 방식의 모바일 애플리케이션을 개발해 드립니다

IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.

프로젝트 논의

더 읽어보기