iOS 앱 UI 테스트 관점에서 보면, Detox는 여전히 React Native 진영에서 강력하지만, 순수 iOS 혹은 최근 트렌드 기준으로는 선택지가 꽤 정리되었습니다. 현재(2025~2026) 실무에서 가장 많이 쓰이는 것들 중심으로 정리하겠습니다.


1. XCTest / XCUITest

(여전히 메인스트림, 특히 네이티브 iOS)

요즘 iOS 네이티브 앱의 표준

특징

  • Apple 공식 프레임워크
  • Swift 기반
  • Xcode에 완전히 통합
  • CI/CD 연계가 매우 안정적 (Xcode Cloud, GitHub Actions, Jenkins 등)

장점

  • OS/SDK 업데이트 대응이 가장 빠름
  • 접근성(Accessibility Identifier) 기반 → 안정성 높음
  • 디버깅 경험이 좋음 (Xcode Instruments 연계)

단점

  • 테스트 코드가 장황해지기 쉬움
  • 테스트 작성 속도는 느린 편
  • 선언적 UI(SwiftUI)에서는 초기 러닝커브 존재

📌 결론

“요즘 새로 iOS UI 테스트를 한다” → XCUITest가 기본값


2. Maestro

(최근 가장 빠르게 채택이 늘어나는 도구)

Detox 대체재로 가장 자주 언급됨

특징

  • YAML 기반 선언적 테스트
  • iOS + Android 공통
  • 설치/러닝이 매우 간단
  • 로컬 실행 속도가 빠름

예시

- launchApp
- tapOn: "로그인"
- inputText: "test@test.com"
 

장점

  • 테스트 작성 속도 매우 빠름
  • QA / 비개발자도 접근 가능
  • CI에서 안정적
  • Detox보다 유지보수 부담이 적다는 평가가 많음

단점

  • 복잡한 로직 테스트에는 한계
  • Apple 공식 도구는 아님
  • 커스텀 assertion은 제한적

📌 결론

“Detox가 너무 무겁다” → Maestro로 많이 이동 중


3. Appium

(크로스플랫폼이 필요한 경우)

특징

  • WebDriver 기반
  • JavaScript / Python / Java 등 지원
  • iOS + Android + Web 통합 테스트 가능

장점

  • 하나의 테스트 스택으로 여러 플랫폼 커버
  • 기존 QA 조직이 있으면 채택 쉬움

단점

  • 설정이 복잡
  • iOS에서는 XCUITest wrapper라 속도 느림
  • “iOS 전용”으로 쓰기엔 과함

📌 결론

iOS 단독 앱이라면 선택 빈도 낮음


4. SwiftUI 시대의 흐름 (중요)

요즘 실무에서는 UI 테스트 비중을 줄이고 아래로 이동하는 추세도 큽니다.

테스트 피라미드 변화

  • UI Test ↓
  • ViewModel / Domain Test ↑
  • Snapshot Test ↑

Snapshot Testing

  • **Point-Free**의 SnapshotTesting 라이브러리
  • SwiftUI View 단위 검증
  • UI Test보다 빠르고 안정적

📌 요즘 조합 예시

  • ViewModel: XCTest
  • UI 회귀: Snapshot Test
  • 핵심 플로우만 XCUITest or Maestro

5. 요약 – 지금 기준 추천 조합

상황추천
순수 iOS, SwiftUI XCUITest + Snapshot
Detox 사용 경험 있음 Maestro
크로스플랫폼 QA 조직 Appium
CI 안정성 최우선 XCUITest

현실적인 한 줄 정리

“요즘 iOS 앱에서 UI 테스트 새로 도입한다”면 XCUITest,
“Detox가 힘들어서 대체 찾는다”면 Maestro가 가장 많이 선택된다.

원하시면

  • Detox → Maestro 전환 전략
  • SwiftUI에서 UI 테스트 최소화 설계
  • CI 기준 실제 폴더/타깃 구성

같은 실무 쪽으로 더 깊게 설명해 드릴 수 있습니다.

 
이 부분좀 더 자세히 설명해줄래 아래에 적은 스냡샷테스팅부분하고도 같이
 
 

알겠습니다. 그럼 “테스트 피라미드 변화”를 왜 그렇게 가져가는지를 먼저 설명하고, Snapshot Testing이 그 안에서 어떤 역할을 하는지를 구조적으로 정리하겠습니다. iOS 실무 기준으로 설명하겠습니다.


1. 과거의 iOS 테스트 피라미드 (문제점부터)

전통적인 구조


UI Test (XCUITest / Detox)
-------------------------
Integration Test
-------------------------
Unit Test
 
 

당시 접근

  • “사용자 시나리오는 UI Test로 보장하자”
  • 버튼 → 화면 이동 → 네트워크 → 결과까지 전부 UI 테스트

실제 문제

  1. 느림
    • 한 케이스 실행에 수십 초
    • CI에서 병렬 돌리기 어려움
  2. 불안정
    • 애니메이션
    • 네트워크 타이밍
    • iOS 버전/기기별 차이
  3. 원인 파악이 어려움
    • 실패해도
      → UI 문제인지
      → ViewModel 문제인지
      → 서버 응답 문제인지
      바로 안 보임

결과적으로:

UI Test는 “신뢰도 낮고 유지비 높은 테스트”가 되기 쉬웠음


2. 요즘 iOS 테스트 피라미드가 바뀐 이유

핵심 배경 (SwiftUI + MVVM 확산)

  • View 로직이 단순해짐
  • 상태(State) → UI 결과가 명확해짐
  • ViewModel이 테스트 가능한 순수 로직이 됨

그래서 **“UI 테스트로 검증하던 것들을 아래로 끌어내리는 전략”**이 가능해졌습니다.


3. 현재 주류 테스트 피라미드 구조


(아주 적음)
End-to-End UI Test (XCUITest / Maestro)
---------------------------------------
Snapshot Test (View 단위)
---------------------------------------
ViewModel / Domain Unit Test
(아주 많음)
 

핵심 철학

  • 로직은 절대 UI 테스트로 검증하지 않는다
  • UI 테스트는 ‘연결 확인’만 한다
  • UI 모양 검증은 Snapshot으로 처리한다

4. Snapshot Testing이 맡는 역할 (중요)

Snapshot Testing이란?

“이 View가 이 상태일 때, 이렇게 보여야 한다”를 이미지(또는 구조)로 저장하고
다음 테스트에서 변경 여부만 비교하는 방식

주로 사용하는 라이브러리:

  • Point-Free SnapshotTesting

5. UI Test vs Snapshot Test (명확한 역할 분리)

구분UI TestSnapshot Test
실행 속도 매우 느림 매우 빠름
실패 원인 불명확 명확
네트워크 필요 필요 없음
애니메이션 문제 많음 없음
목적 플로우 연결 확인 UI 회귀 방지

결론

  • UI Test는 “된다 / 안 된다”
  • Snapshot은 “바뀌었다 / 안 바뀌었다”

6. 실전 예시 (SwiftUI 기준)

1️⃣ ViewModel 테스트 (로직 보장)


func testLoginSuccess() {
    let vm = LoginViewModel(authService: MockSuccessAuth())
    vm.login()

    XCTAssertTrue(vm.isLoggedIn)
}
 

→ 비즈니스 로직은 여기서 끝냄


2️⃣ Snapshot Test (UI 보장)


func testLoginView_loggedIn() {
    let view = LoginView(
        viewModel: .mockLoggedIn
    )

    assertSnapshot(
        matching: view,
        as: .image
    )
}
 

여기서 보장하는 것:

  • 버튼 색
  • 텍스트
  • 레이아웃
  • 다크모드
  • Dynamic Type

3️⃣ UI Test (최소화)


func testLoginFlow() {
    app.launch()
    app.buttons["로그인"].tap()
    XCTAssertTrue(app.staticTexts["홈"].exists)
}
 

이 테스트는 “로그인이 가능하다”만 확인

  • 상세 UI?
  • 에러 메시지?
    → 전부 Snapshot / Unit Test에서 이미 검증됨

7. 그래서 UI Test 개수가 줄어든다

예전

  • UI Test 50~100개
  • CI 불안정
  • 수정 시 공포

요즘

  • UI Test 5~10개 (핵심 플로우만)
  • Snapshot 수십~수백 개
  • Unit Test 다수

8. 이 구조의 실제 장점

  1. CI 속도 대폭 개선
  2. UI 변경에 대한 자신감
  3. SwiftUI 리팩토링이 쉬워짐
  4. 테스트 실패 원인 추적이 즉각적

9. 한 문장으로 요약

요즘 iOS 테스트는
“행동 검증은 UI Test,
화면 검증은 Snapshot,
로직은 Unit Test”로 역할을 철저히 분리한다.


다음 단계로는 아래 주제들이 자연스럽습니다.

  • Snapshot 테스트를 언제 깨뜨리는 게 정상인지
  • 디자이너 협업 시 Snapshot 운영 전략
  • CI에서 Snapshot diff 리뷰 방식

어디까지 더 파고들지 말씀 주시면 그 레벨로 설명하겠습니다.

 

 

 

 

 

 

/****/

뭐 어디까지 믿어야할지 모르겠지만 대강 내가 디톡스로 만들때랑 비슷한 답변으로보임.

이유가 좀 다르긴한데 그때도 화면에 구성에 대한 테스트만 집중적으로 하고 통신들어가는 플로우는 줄여야했고(서버 부담문제)

목업데이터를 중심으로 했기에 비슷하긴하다

 

TODO: 나중에 저 포인트 프리라는게 진짜 있는지 살펴보고 좋아보이면 테스트한번 해볼것.

 

반응형

+ Recent posts