피드로 돌아가기
Dev.toFrontend
원문 읽기
Stateless UI 설계를 통한 Screenshot 및 Benchmark 테스트의 결정론적 안정성 확보
Stable Screenshot Tests and Flow Benchmarks in KMP
AI 요약
Context
모바일 테스트 환경에서 네트워크 데이터, 시스템 시간, 애니메이션 등 비결정적 요소로 인한 Screenshot Test의 Flakiness와 Benchmark 지표의 심한 변동성 발생. 도구의 문제가 아닌 테스트 대상에 누출된 Non-determinism이 원인임을 식별.
Technical Solution
- Screen을 UiState에 의존하는 Pure Function으로 설계하여 ViewModel이나 Clock 등 외부 의존성 접근을 완전히 차단
- CoreLib의 Port 패턴을 활용하여 ForecastService, LocationService, Clock을 추상화하고 테스트 시 Frozen State와 FixedClock 주입
- 애니메이션 클럭을 일시 중지하여 프레임 캡처 시점의 불확실성을 제거하고 정적 렌더링 보장
- User Flow 테스트 시 실제 UI 조작 대신 가능한 모든 상태(Loading, Loaded, Empty, Error)를 열거하여 개별 Golden Image로 검증
- Benchmark 실행 시 네트워크 계층을 Canned Fixture Adapter로 대체하여 I/O Jitter를 제거하고 순수 연산 및 렌더링 성능 측정
실천 포인트
1. Composable 내부에서 ViewModel 직접 참조나 시스템 시간/날짜 호출 여부 검토
2. 외부 의존성을 Port 인터페이스 뒤로 숨기고 테스트 환경 전용 Fixed/Fake 구현체 제공
3. CI 환경을 단일 Canonical Environment로 설정하여 폰트 및 덴시티 차이로 인한 Diff 방지
4. ArchUnit 등을 활용해 UI 패키지가 Port/Use-case에 직접 의존하지 않도록 강제하는 규칙 적용