테스트 전략 — E2E·네이티브·비주얼
Maestro·Detox E2E, 네이티브 모듈 유닛 테스트, 비주얼 리그레션
핵심 요약
- SDK 56 앱은 Hermes V1·native module·Expo UI·EAS Update·Observe가 함께 움직여 JS 테스트만으로는 부족하므로 TypeScript→Component→E2E→Native→Visual→Release 6계층 피라미드를 둡니다.
- PR gate는
expo-doctor·expo install --check·test·lint이며, SDK 업그레이드 PR엔install --fixlockfile 반영, Router codemod, iOS 16.4+ QA matrix, Node 22.13.x CI, 양 플랫폼 preview build를 추가로 요구합니다. - E2E는 cold launch, OTA relaunch, 딥링크, offline 복귀, 결제·인증, MDM config 변경을 SDK 56 변경점과 연결해 시나리오화합니다.
- Expo UI·Widgets는 실제 네이티브 컨트롤이라 snapshot만으로는 부족하니 Dynamic Type·dark mode·RTL·screen reader·실기기 캡처를 matrix에 넣습니다.
- Release gate는 preview→production binary→OTA 1%·10%·100%로 단계화하고 crash-free 99.5%·TTI P95 악화 10% 미만을 통과 기준으로 둡니다.
테스트 피라미드
SDK 56 앱은 JS만 테스트해서는 부족합니다. Hermes V1, native module, Expo UI, EAS Update, Observe instrumentation이 함께 맞물려 돌아가기 때문입니다.
| 계층 | 도구 | 검증 대상 |
|---|---|---|
| TypeScript | Vitest/Jest | domain logic, route helper, native wrapper fallback |
| Component | React Native Testing Library | state, accessibility label, pending UI |
| E2E | Maestro 또는 Detox | login, purchase, offline, deep link |
| Native | XCTest, JUnit/Robolectric | Expo Modules API wrapper, entitlement, permission |
| Visual | screenshot diff | Expo UI, widgets, Dynamic Type, dark mode |
| Release | EAS Build/Update/Observe | binary, OTA, rollout health |
PR gate
npx expo-doctor
npx expo install --check
pnpm test
pnpm lintSDK 업그레이드 PR에는 추가로 아래 항목을 요구합니다.
npx expo install --fix결과가 lockfile에 반영됨- Expo Router SDK 55 to 56 codemod 실행 또는 수동 import audit 완료
- iOS 16.4+ 최소 버전으로 QA matrix 재정의
- Node 22.13.x 이상 CI 이미지 사용
- EAS preview build 양 플랫폼 성공
E2E 시나리오
| 시나리오 | 이유 |
|---|---|
| 첫 설치 후 cold launch | Hermes V1과 Observe TTR/TTI baseline |
| OTA 수신 후 relaunch | bytecode diff·runtimeVersion 호환성 |
| 딥링크 진입 | Expo Router import migration 영향 |
| offline 후 online 복귀 | Observe event dispatch, update check, cache |
| 앱 내 결제·인증 | native SDK wrapper와 secure storage |
| MDM managed config 변경 | enterprise distribution 대상 |
Expo UI·Widgets 회귀 테스트
- Expo UI는 실제 iOS/Android 네이티브 컨트롤이라 snapshot만으로는 부족합니다.
- Dynamic Type, dark mode, RTL, screen reader, hardware keyboard를 최소 matrix에 넣습니다.
- iOS Widgets와 Live Activities는 simulator와 실제 기기에서 각각 캡처합니다.
- API reference 상태 표기와 changelog가 어긋날 수 있으니 package version을 테스트 로그에 남깁니다.
Release gate
| 단계 | 통과 기준 |
|---|---|
| preview build | QA install, smoke E2E, native permission prompt 확인 |
| production binary | store metadata, signing, crash symbol upload 확인 |
| OTA 1% | crash-free 99.5% 이상, TTI P95 악화 10% 미만 |
| OTA 10% | support ticket·backend error 정상 |
| OTA 100% | rollback point 기록, changelog 업데이트 |