실습환경
- 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 |