XCUITest: 개념, 작동 방식 및 iOS UI 테스트

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

XCUITest는 iOS, iPadOS 및 macOS 애플리케이션의 UI 테스트를 위한 Apple의 프레임워크로, XCTest 및 Xcode에 직접 내장되어 있습니다. 탭, 텍스트 입력, 스와이프, 스크롤 및 제스처와 같은 사용자 동작을 시뮬레이션할 수 있으며, 인터페이스 요소의 내부 상태에 액세스할 수 있습니다. Apple Developer Documentation, 2025에 따르면, XCUIApplication은 모든 UI 테스트의 진입점이며 화면 요소의 계층 구조에 대한 액세스를 제공합니다.

핵심 요점

  • XCUITest는 Xcode에 내장된 Apple의 네이티브 UI 테스트 프레임워크입니다
  • 화이트박스 접근 방식은 접근성 속성 및 요소 계층 구조에 대한 액세스를 제공합니다
  • 테스트는 XCTest와 통합된 Swift 또는 Objective-C로 작성됩니다
  • 테스트 녹화는 Xcode의 내장 레코더를 통해 사용할 수 있습니다
  • 실행은 추가 서버 없이 iOS 시뮬레이터 또는 실제 기기에서 수행됩니다

XCUITest란

XCUITest는 Apple이 Xcode 7(2015)에서 출시한 UI 테스트 프레임워크입니다. UI Automation(UIA)을 대체하고 Apple 플랫폼에서 자동화된 인터페이스 테스트의 표준 도구가 되었습니다. XCUITest는 Apple의 통합 테스트 프레임워크인 XCTest에 완전히 통합되어 있습니다.

XCTest 단위 테스트와의 차이점

클래스 및 메서드 수준에서 로직을 검증하는 단위 테스트와 달리, XCUITest는 동작 시뮬레이션을 통해 사용자 인터페이스를 테스트합니다. 테스트는 애플리케이션과 별도의 프로세스로 실행되며 접근성 API를 통해 애플리케이션과 상호 작용합니다. 이를 통해 격리성과 신뢰성이 보장됩니다.

네이티브 접근 방식의 장점

XCUITest는 타사 서버(Appium과 달리) 또는 기기 상호 작용을 위한 추가 라이브러리를 설치할 필요가 없습니다. 필요한 모든 것이 이미 Xcode에 포함되어 있습니다. 이는 새로운 iOS 버전과의 최상의 호환성과 새로운 제스처 및 컨트롤에 대한 즉각적인 액세스를 보장합니다.

XCUITest 및 XCTest 아키텍처

XCUITest 아키텍처는 두 가지 주요 클래스를 기반으로 합니다: XCUIApplication(실행된 테스트 대상 애플리케이션)과 XCUIElement(인터페이스 요소)입니다. XCTest 테스트 러너는 setUp, 테스트 메서드, tearDown의 테스트 수명 주기를 관리합니다. XCUITest는 접근성 브리지를 통해 애플리케이션을 제어하는 별도의 프로세스로 실행됩니다.

요소 계층 구조

각 UI 요소는 상태(exists, isHittable, label, value) 및 동작(tap, pressForDuration, swipeUp, typeText)을 위한 메서드를 포함하는 XCUIElement 객체로 표현됩니다. 요소는 쿼리 체인(app.buttons[].staticTexts[].tables[])을 통해 계층 구조로 구성됩니다. 이를 통해 화면의 모든 요소를 유연하게 찾을 수 있습니다.

접근성 및 로케이터

XCUITest는 요소를 식별하기 위해 접근성 속성을 사용합니다: accessibilityIdentifier(프로그래매틱 식별자)와 accessibilityLabel(VoiceOver용 설명)입니다. 애플리케이션 코드에서 accessibilityIdentifier를 설정하는 것이 좋습니다. 이렇게 하면 지역화 및 레이아웃에 관계없이 테스트가 안정적으로 유지됩니다.

XCUITest로 UI 테스트 작성

XCUITest 테스트는 XCTest 구문을 사용하여 Swift로 작성됩니다. 각 테스트 클래스는 XCTestCase를 상속하고 test로 시작하는 메서드를 포함합니다. setUp 메서드에서는 필요한 구성으로 애플리케이션이 시작되고, tearDown에서는 정리 및 세션 종료가 수행됩니다.

기본 테스트 시나리오

일반적인 테스트: 요소 찾기 → 동작 수행 → 결과 확인. 요소 검색은 XCUIElementQuery 하위 쿼리(app.buttons["loginButton"], app.textFields["email"])를 통해 수행됩니다. 동작: .tap(), .typeText("text"), .swipeUp(). 확인: XCTAssertTrue(element.exists) 또는 XCTAssertEqual(element.label, "expected").

swift
import XCTest

class LoginTests: XCTestCase {
    let app = XCUIApplication()

    override func setUp() {
        continueAfterFailure = false
        app.launch()
    }

    func testLoginWithValidCredentials() {
        let emailField = app.textFields["emailInput"]
        emailField.tap()
        emailField.typeText("user@test.com")

        let passwordField = app.secureTextFields["passwordInput"]
        passwordField.tap()
        passwordField.typeText("password123")

        app.buttons["loginButton"].tap()

        let homeLabel = app.staticTexts["homeTitle"]
        XCTAssertTrue(homeLabel.exists)
    }
}

대기 및 동기화

XCUITest는 XCTWaiter 및 NSPredicate 조건자를 통한 명시적 대기를 지원합니다. 예를 들어, 5초 이내에 요소가 나타날 때까지 대기: XCTWaiter().wait(for: [expectation], timeout: 5). Detox와 달리 XCUITest에는 네트워크 요청에 대한 자동 동기화 기능이 없습니다.

swift
// 타임아웃으로 요소가 나타날 때까지 대기
let expectedElement = app.staticTexts["welcomeMessage"]
let existsPredicate = NSPredicate(format: "exists == true")
let expectation = XCTNSNotificationExpectation(object: expectedElement)
let result = XCTWaiter().wait(
    for: [expectation], timeout: 5
)
XCTAssertEqual(result, .completed)

XCUITest 고급 기능

XCUITest는 복잡한 시나리오 테스트를 지원합니다: 멀티터치 제스처, 푸시 알림, 딥 링크, SFSafariViewController 및 앱 간 상호 작용. Siri 인텐트도 Siri Remote 시뮬레이션을 사용하여 XCUITest를 통해 테스트할 수 있습니다.

제스처 테스트

XCUITest는 tap, doubleTap, pressForDuration, swipeUp/Down/Left/Right, pinch, rotate, twoFingerTap 등 모든 일반적인 제스처를 지원합니다. 복잡한 시나리오의 경우 사용자 정의 좌표와 지속 시간을 가진 XCUIGesture가 사용됩니다. 이를 통해 그리기 또는 드래그 앤 드롭과 같은 사용자 정의 제스처를 테스트할 수 있습니다.

네트워크 요청 가로채기

Xcode 12부터 XCUITest는 XCTestExpectation 및 URLProtocol을 통한 네트워크 요청 가로채기를 지원합니다. 이를 통해 애플리케이션 코드를 수정하지 않고도 오프라인 모드 또는 모의 서버 응답으로 애플리케이션을 테스트할 수 있습니다.

CI/CD에서의 XCUITest

XCUITest는 test 플래그와 함께 xcodebuild를 통해 CI 환경에서 실행됩니다. 여러 시뮬레이터에서 병렬 실행을 위해 Xcode 스키마에서 병렬 실행 구성과 함께 xcodebuild -testPlan이 사용됩니다. GitHub Actions, Bitrise 및 Jenkins에는 XCUITest에 대한 기본 지원이 있습니다.

CI 구성

CI를 위해서는 코드 서명, 프로비저닝 프로필 및 대상(시뮬레이터 또는 기기)을 구성해야 합니다. 시뮬레이터에서의 iOS 테스트에는 인증서가 필요하지 않습니다. 실제 기기의 경우 Xcode Cloud 또는 Fastlane을 통한 자동 서명이 필요합니다.

bash
# xcodebuild를 통해 시뮬레이터에서 XCUITest 실행
xcodebuild test \
  -project MyApp.xcodeproj \
  -scheme MyApp \
  -destination 'platform=iOS Simulator,name=iPhone 15,OS=17.5' \
  -resultBundlePath ./TestResults \
  -parallel-testing-enabled YES \
  -parallel-testing-worker-count 4

XCUITest로 접근성 테스트

XCUITest는 Apple의 접근성 API와 밀접하게 연결되어 있습니다. 요소 검색이 접근성 속성을 기반으로 하기 때문입니다. 접근성 테스트는 요소를 찾는 방법일 뿐만 아니라 장애가 있는 사람들을 위한 애플리케이션의 접근성을 확인하는 방법이기도 합니다. XCUITest는 accessibilityLabel, traits 및 hints를 확인할 수 있습니다.

VoiceOver 확인

VoiceOver는 시각 장애가 있는 사용자를 위한 Apple의 스크린 리더입니다. XCUITest는 다음을 확인할 수 있습니다: accessibilityLabel(요소가 명확한 텍스트로 설명되었는지), accessibilityTraits(요소 유형이 일치하는지: 버튼, 제목, 이미지), accessibilityHint(동작 결과에 대한 힌트를 제공하는지). 이러한 확인은 App Store 출시에 필수이며, XCUITest는 회귀 테스트의 일부로 이를 자동화합니다.

자동 접근성 검사

Xcode 15부터 XCUITest는 accessibilityAudit 유형의 XCTAttachment를 통한 내장 접근성 검사를 지원합니다. 테스트는 대비가 충분하지 않은 요소, 레이블이 없는 이미지 및 잘못된 traits를 자동으로 보고합니다. 이는 수동 접근성 검사기를 대체합니다.

swift
// XCUITest에서 접근성 감사
func testAccessibilityAudit() {
    let app = XCUIApplication()
    app.launch()

    let audit = XCTAttachment(accessibilityAudit: app)
    add(audit)

    // 특정 요소 확인
    let button = app.buttons["submitButton"]
    XCTAssertTrue(button.label.count > 0)
    XCTAssertTrue(button.isAccessibilityElement)
}

XCUITest의 성능 테스트

XCUITest는 XCTOSSignpostMetric 및 XCUIApplication.metrics를 통한 UI 성능 측정을 지원합니다. 애플리케이션 시작 시간, 탐색 속도 및 제스처 응답 시간을 측정할 수 있습니다. 성능 테스트는 기준선 측정으로 실행되며 임계값을 초과하면 자동으로 실패합니다. 이는 릴리스 빌드에서 사용자에게 도달하기 전에 성능 저하를 방지하는 데 도움이 됩니다.

기준선 구성

기준선(baseline)은 테스트의 참조 실행 시간입니다. Xcode는 특정 기기 모델 및 iOS 버전에서 각 테스트의 기준선을 기억합니다. 새 실행이 기준선을 지정된 백분율(기본값 10%) 초과하면 테스트는 실패한 것으로 간주됩니다. 기준선을 업데이트하려면 테스트 리포트에서 Edit Baseline 명령을 사용합니다. iOS 버전을 업데이트하거나 CI 팜의 기기 모델을 변경할 때 기준선을 다시 계산하는 것이 중요합니다.

테스트 안정성 모니터링

XCUITest 테스트의 안정성을 모니터링하기 위해 플래그가 사용됩니다: continueAfterFailure(첫 번째 실패 후 테스트를 계속할지 여부) 및 재시도 구성이 있는 Xcode 테스트 계획. 실패한 테스트의 자동 재시작(retry)을 구성하는 것이 좋습니다. 애니메이션 타이밍 또는 네트워크 지연과 관련된 불안정한 테스트의 경우 최대 3회 시도합니다.

푸시 알림 및 딥 링크 테스트

XCUITest는 springboard 및 launchArguments를 통한 푸시 알림 및 딥 링크 테스트를 지원합니다. 푸시 알림의 경우 -UNUserNotificationCenter 매개변수와 함께 XCUIApplication().launchArguments를 사용하고 XCTest를 통해 전송합니다. 딥 링크는 사용자 정의 스키마를 사용한 open URL을 통해 테스트됩니다. XCUITest는 시스템 대화 상자를 가로채고 애플리케이션이 올바른 화면으로 열렸는지 확인합니다. 알림 응답 시나리오를 테스트하기 위해 XCUIApplication().springboard가 사용되며, iOS 알림 센터에서 알림 배너를 탭하는 것을 시뮬레이션합니다. 이러한 시나리오는 딥 링크 및 푸시 캠페인이 있는 애플리케이션에 중요하며, 외부 호출의 올바른 처리를 확인해야 합니다.

Instruments와의 통합

상세한 성능 프로파일링을 위해 XCUITest는 Instruments와 통합됩니다. 테스트 중 XCTMetric을 통해 Time Profiler, Core Animation 또는 Leaks의 프로파일링을 시작할 수 있습니다. 프로파일링 결과는 리포트에 저장되며 Xcode에서 분석할 수 있습니다. 이는 애플리케이션 시작 시간, 화면 간 탐색 및 애니메이션 성능(iOS 애플리케이션의 일반적인 병목 현상)을 최적화하는 데 특히 유용합니다.

자주 묻는 질문

XCUITest와 XCTest의 차이점은 무엇인가요?

XCTest는 단위 테스트 및 성능 테스트를 포함한 모든 유형의 Apple 테스트를 위한 일반 프레임워크입니다. XCUITest는 UI 테스트를 위해 XCTest 위에 구축된 확장으로, 인터페이스와 상호 작용하기 위한 XCUIApplication, XCUIElement 및 XCUIElementQuery 클래스를 추가합니다.

XCUITest를 Objective-C와 함께 사용할 수 있나요?

네, XCUITest는 Swift와 Objective-C를 모두 지원합니다. 그러나 대부분의 Apple 예제와 문서는 Swift로 작성되어 있습니다. Objective-C 프로젝트는 추가 설정 없이 XCUITest를 사용할 수 있습니다. 프레임워크는 @import XCTest를 통해 사용할 수 있습니다.

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

XCUITest는 Apple의 접근성 API를 사용합니다. 요소는 accessibilityIdentifier, accessibilityLabel, 유형(button, textField, staticText) 또는 계층 구조 내 위치로 찾을 수 있습니다. 애플리케이션 코드에서 접근성 속성이 정확할수록 테스트가 더 안정적입니다.

XCUITest는 테스트 녹화를 지원하나요?

네, Xcode에는 UI 테스트용 내장 레코더가 포함되어 있습니다. 녹화 모드로 테스트를 실행하면 Xcode가 인터페이스와의 모든 상호 작용을 캡처하고 Swift 코드를 생성합니다. 녹화된 코드는 확인 추가, Page Objects로 추출, 매개변수화 등을 통해 개선할 수 있습니다.

실제 기기에서 XCUITest를 실행하려면 어떻게 해야 하나요?

실제 기기에서 실행하려면: 기기를 Mac에 연결하고, Apple Developer Program에 추가하고, 프로비저닝 프로필을 구성하고, 개발 인증서로 애플리케이션에 서명하고, xcodebuild에서 기기를 대상으로 선택해야 합니다.

요약

  • XCUITest는 iOS, iPadOS 및 macOS 애플리케이션을 위한 Apple의 네이티브 UI 테스트 프레임워크입니다
  • Xcode 통합은 테스트 녹화, 병렬 실행 및 내장 리포트를 제공합니다
  • XCUIApplication과 XCUIElement는 애플리케이션과 상호 작용하기 위한 주요 클래스입니다
  • 접근성 속성은 신뢰할 수 있는 로케이터로 사용되며 레이아웃 변경에도 안정적입니다
  • 대기는 XCTWaiter 및 NSPredicate를 통해 구현됩니다(자동 동기화 없음)
  • CI/CD는 시뮬레이터에서 병렬 실행과 함께 xcodebuild를 통해 지원됩니다
  • 고급 시나리오에는 멀티터치, Siri Intents, 네트워크 요청 가로채기 및 딥 링크가 포함됩니다

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

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

프로젝트 논의

더 읽어보기