개발/Flutter & Dart
Flutter Test 03. Widget Test
차파랑
2025. 5. 6. 18:34
1. testWidgets() 기본 구조
testWidgets()
는 Flutter 위젯을 테스트할 때 사용하는 함수- 내부에 전달되는
tester
객체를 이용해 위젯을 렌더링하고 상호작용 가능 async
키워드 필수
2. tester 주요 메서드
1. tester.pumpWidget()
- 테스트할 위젯 트리를 최초로 렌더링할 때 사용
- 실제 앱처럼 전체 구조를 주입해야 하므로 보통
MaterialApp
으로 감싼다
예시:
await tester.pumpWidget(
MaterialApp(
home: MyWidget(),
),
);
2. tester.pump()
- 이미 렌더링된 위젯 트리에서 화면을 다시 그려야 할 때 호출
setState
, 애니메이션 시작, 값 변경 등 상태 변화가 발생한 이후에 호출해야 UI 반영됨- 한 프레임만 렌더링, 즉시 완료
예시:
await tester.tap(find.text('버튼'));
await tester.pump(); // UI 갱신
3. tester.pumpAndSettle()
- 애니메이션 또는 비동기 작업이 모두 끝날 때까지 대기
- 내부적으로
pump()
를 여러 번 반복하여 모든 작업이 완료될 때까지 기다린다 - 애니메이션, 로딩 표시, 전환 효과 등을 포함한 테스트에 적합
pumpAndSettle()
은 모든 비동기 작업이 끝날 때까지 반복적으로 pump
예시:
await tester.tap(find.byIcon(Icons.close));
await tester.pumpAndSettle(); // 전환 효과 끝날 때까지 대기
- 빠른 테스트에는
pump()
, 안정성을 위해선pumpAndSettle()
을 사용하는 것이 좋음
3. 위젯 찾기 (find 객체)
find
를 사용하여 특정 위젯을 탐색- 예: 텍스트, 아이콘, 특정 위젯 타입 등
예시:
find.text('Hello')
find.byType(Icon)
find.byKey(ValueKey('my-widget'))
4. 상태 검증 (expect + matcher)
expect()
와 matcher를 함께 사용해 UI가 의도한 대로 나타났는지 검증- 자주 사용하는 matcher:
findsOneWidget findsNothing findsWidgets
5. 전체 테스트 예시
testWidgets('HomeScreen UI 테스트', (WidgetTester tester) async {
// given: 앱 실행
await tester.pumpWidget(
const MaterialApp(
home: HomeScreen(title: 'T', message: 'M'),
),
);
// then: 텍스트가 화면에 잘 나타나는지 확인
expect(find.text('T'), findsOneWidget);
expect(find.text('M'), findsOneWidget);
});
MaterialApp
으로 감싸야 context 관련 오류 없이 정상 실행 가능