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 테스트
실제 문제
- 느림
- 한 케이스 실행에 수십 초
- CI에서 병렬 돌리기 어려움
- 불안정
- 애니메이션
- 네트워크 타이밍
- iOS 버전/기기별 차이
- 원인 파악이 어려움
- 실패해도
→ 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 회귀 방지 |
결론
- 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. 이 구조의 실제 장점
- CI 속도 대폭 개선
- UI 변경에 대한 자신감
- SwiftUI 리팩토링이 쉬워짐
- 테스트 실패 원인 추적이 즉각적
9. 한 문장으로 요약
요즘 iOS 테스트는
“행동 검증은 UI Test,
화면 검증은 Snapshot,
로직은 Unit Test”로 역할을 철저히 분리한다.
다음 단계로는 아래 주제들이 자연스럽습니다.
- Snapshot 테스트를 언제 깨뜨리는 게 정상인지
- 디자이너 협업 시 Snapshot 운영 전략
- CI에서 Snapshot diff 리뷰 방식
어디까지 더 파고들지 말씀 주시면 그 레벨로 설명하겠습니다.
/****/
뭐 어디까지 믿어야할지 모르겠지만 대강 내가 디톡스로 만들때랑 비슷한 답변으로보임.
이유가 좀 다르긴한데 그때도 화면에 구성에 대한 테스트만 집중적으로 하고 통신들어가는 플로우는 줄여야했고(서버 부담문제)
목업데이터를 중심으로 했기에 비슷하긴하다
TODO: 나중에 저 포인트 프리라는게 진짜 있는지 살펴보고 좋아보이면 테스트한번 해볼것.
'메모' 카테고리의 다른 글
| 앱 소유권 이전에 대한 카톡대화 (0) | 2025.12.17 |
|---|---|
| 위젯 연속애니메이션 꼼수 (0) | 2025.08.28 |
| tuya smart app sdk 관련내용? (0) | 2025.08.22 |
| highlight 적용하기! 무료! (0) | 2022.10.11 |
| StyleShare팀이 쓰는 Swift Coding Convention (0) | 2022.06.19 |