본문 바로가기

Flutter

Flutter Widget Test

실습환경

 - Mac OS Big Sur

 - Android Studio

 - Flutter 2.0.5

 - Dart 2.12

 

Widget 테스팅 방법 소개

- widget 클래스를 테스트하기 위해서는 Flutter SDK 와 함께 제공되는 flutter_test 패키지가 필요하다.

 

flutter_test package

WidgetTester 프로그래밍적으로 Widget과 테스트 환경을 상호작용하는 클래스
testWidgets() 각 테스트 케이스를 위해 새로운 WidgetTester를 자동으로 생성하고, 일반 test() 함수 대신 사용된다.
Finder 테스트 환경에서 widget을 찾을 때 사용하는 클래스
Matcher Widget별 Matcher 상수는 Finder가 테스트 환경에서 위젯을 찾는 지 여러 위젯을 찾는지 확인하는데 도움을 준다.

 

 

1. flutter_test library 추가

 

pubspec.yaml 의 dev_dependencies 섹션에 flutter_test 종속성을 포함한다. Android Studio 의 Flutter Project로 생성했으면, 자동으로 추가되어 있다.

environment:
  sdk: ">=2.12.0 <3.0.0"

dependencies:
  flutter:
    sdk: flutter

 

2. my_widget.dart 생성

 

import 'package:flutter/material.dart';

class MyWidget extends StatelessWidget {
  const MyWidget ({
    Key? key,
    required this.title,
    required this.message
  }) : super(key: key);

  final String title;
  final String message;

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      home: Scaffold(
        appBar: AppBar(
          title: Text(title),
        ),
        body: Center(
          child: Text(message),
        ),
      ),
    );
  }
}

 

3. testWidgets 생성

 

flutter_test 패키지에서 제공하는 testWidgets() 함수를 사용하여 테스트를 정의한다. testWidgets() 함수는 widget test를 정의하고 같이 동작할 WidgetTester를 생성한다.

 

- test/widget_test.dart

void main() {
  testWidgets('MyWidget has a title and message', (WidgetTester tester) async {
    
  });
}

 

4. WidgetTester를 사용하여 Widget 빌드

pumpWidget() 메소드로 테스트 환경에서 MyWidget을 빌드한다. pumpWidget()은 Widget을 빌드, 렌더링한다.

 

void main() {
  testWidgets('MyWidget has a title and message', (WidgetTester tester) async {
    await tester.pumpWidget(const MyWidget(title: 'T', message: 'M'));
  });
}

 

pump()

  pumpWidget() 을 호출하면, WidgetTester 는 동일한 widget을 다시 빌드하는 추가 방법을 제공한다. StatefulWidget이나 animations을 작업할 때 유용하다.

  예를들어, 테스트 환경에서는 button을 눌러 setState() 메소드를 호출한다해도, widget을 다시 빌드하지 않는다. 아래 method 중 하나를 사용해야 Widget이 다시 빌드된다.

 

Method 설명
tester.pump(Duration duration) frame 을 스케줄링하고, widget 재 빌드를 발동한다.
Duration으로 설정한 시간이 지난 후에 발동시킨다.
Duration이 단일 프레임보다 길더라도, 여러 frame을 스케줄링 하지 않는다.
tester.pumpAndSettle() 더 이상 예약된 프레임이 없을 때까지 지정된 기간으로 pump()를 반복적으로 호출한다.
모든 애니메이션이 완료 될 때까지 기다린다.

 

5. Finder를 이용해 widget을 찾는다.

 

void main() {
  testWidgets('MyWidget has a title and message', (WidgetTester tester) async {
    await tester.pumpWidget(const MyWidget(title: 'T', message: 'M'));

    // Create the Finders.
    final Finder titleFinder = find.text('T');
    final Finder messageFinder = find.text('M');
  });
}

- find.text('T') : Widget Tree에서 값이 'T'로 설정된 Text 또는 EditableText Widget을 찾는다.

 

 

6. Matcher으로 Widget을 확인

void main() {
  testWidgets('MyWidget has a title and message', (WidgetTester tester) async {
    await tester.pumpWidget(const MyWidget(title: 'T', message: 'M'));

    // Create the Finders.
    final Finder titleFinder = find.text('T');
    final Finder messageFinder = find.text('M');

    expect(titleFinder, findsOneWidget);
    expect(messageFinder, findsOneWidget);
  });
}

Matcher으로 화면에 title, message Widget이 표시되고 있는지 확인한다.

 

Matchers 설명
findsNothing Widget이 없다는 것을 확인
findsWidgets Widget이 하나 이상이 존재함을 확인
findNWidgets Widget이 특정 숫자만큼 존재함을 확인
matchesGoldenFile 위젯이 특장 bitmap image을 렌더링하고 있음을 확인

 

- expect(dynamic actual, dynamic matcher)

  : actual 과 동일한 Widget이 Widget Tree에 있는지 확인하여 test case 를 성공/실패 표시한다.

 

 

출처 : https://flutter.dev/docs/cookbook/testing/widget/introduction

'Flutter' 카테고리의 다른 글

dart 유닛 테스트  (0) 2021.07.12
test_package.expect() 분석  (0) 2021.07.05
Null Safety  (0) 2021.06.02