블로그 목록
apps

Maestro로 React Native E2E 테스트 자동화하기 — Detox보다 세팅이 훨씬 쉬웠다

앱을 릴리스할 때마다 로그인 → 목록 → 상세로 들어가는 기본 플로우를 손으로 눌러보고 있었다. 화면 하나 고칠 때마다 매번 이걸 반복하니 슬슬 지쳤다. E2E 테스트를 붙이기로 하고 Detox를 먼저 봤는데, 네이티브 빌드 연동에 config가 너무 많아서 시작도 전에 진이 빠졌다.

그러다 Maestro를 알게 됐다. 테스트를 YAML로 쓰고, 네이티브 빌드에 손댈 필요가 거의 없다. 반나절 만에 핵심 플로우를 다 커버해서 좀 놀랐다.

설치

CLI 하나 깔면 끝이다.

curl -fsSL "https://get.maestro.mobile.dev" | bash

시뮬레이터나 실기기가 떠 있는 상태에서 앱을 한 번 빌드해두면 준비 끝. Expo라면 npx expo run:ios로 dev 빌드를 올려두면 된다.

첫 테스트 플로우

.maestro/login.yaml 파일을 하나 만든다. YAML 첫 줄에 앱 ID를 적고, 그 아래로 사용자가 하는 행동을 그대로 나열하면 된다.

appId: com.myapp.dev
---
- launchApp
- tapOn: '이메일'
- inputText: 'test@example.com'
- tapOn: '비밀번호'
- inputText: 'password123'
- tapOn: '로그인'
- assertVisible: '오늘의 할 일'

읽으면 그냥 시나리오다. tapOn에 넘긴 문자열은 화면에 보이는 텍스트나 접근성 라벨을 기준으로 알아서 요소를 찾아준다. testID가 있으면 tapOn: { id: 'login-button' }처럼 명시할 수도 있다.

실행은 이 한 줄이다.

maestro test .maestro/login.yaml

터미널에서 각 스텝이 초록불로 지나가는 걸 보고 있으면, 그동안 손으로 하던 게 뭐였나 싶다.

왜 편했나

Detox는 앱에 테스트용 네이티브 코드를 심고 동기화를 맞춰야 하는데, Maestro는 접근성 트리를 바깥에서 읽어서 조작한다. 그래서 앱 코드를 거의 안 건드린다. 게다가 요소가 아직 안 떴으면 기본적으로 몇 초 기다려주기 때문에, waitForsleep을 도배할 일이 확 줄었다. flaky 테스트의 주범이 이 대기 로직인데 그걸 프레임워크가 먹어준다.

CI에 붙일 때는 Maestro Cloud에 flow를 올리거나, GitHub Actions에서 에뮬레이터를 띄우고 maestro test .maestro/로 폴더 전체를 돌리면 된다.

정리

E2E 테스트는 "언젠가 해야지" 하고 계속 미루게 되는데, Maestro는 진입 장벽이 낮아서 그 미루기를 끊기 좋았다. 완벽한 커버리지를 노리기보다, 매번 손으로 확인하던 핵심 플로우 두세 개만 YAML로 옮겨도 릴리스 스트레스가 눈에 띄게 줄어든다. 일단 로그인 플로우 하나부터 적어보는 걸 추천한다.