개발/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 관련 오류 없이 정상 실행 가능