고급
Testing
unit, widget, integration test를 목적에 따라 작성합니다.
핵심 개념
Testing 주요 항목
테스트 종류
Unit test는 순수 Dart 로직을 빠르게 검증합니다.
언제 쓰나: Widget test는 특정 위젯이 주어진 상태에서 어떻게 보이는지 확인합니다.
Flutter에서: Integration test는 실제 앱 흐름을 기기나 브라우저에서 검증합니다.
testWidgets('테스트 종류', (tester) async {
await tester.pumpWidget(const MaterialApp(home: HomePage()));
expect(find.text('Flutter Wiki'), findsOneWidget);
});
Container(
padding: const EdgeInsets.all(20),
decoration: BoxDecoration(
color: Colors.white,
border: Border.all(color: const Color(0xFFDCE6EF)),
borderRadius: BorderRadius.circular(8),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 10),
decoration: BoxDecoration(
color: const Color(0xFFEEF7FB),
borderRadius: BorderRadius.circular(8),
),
child: const Text(
'Lesson',
style: TextStyle(fontSize: 20, fontWeight: FontWeight.w900),
),
),
Wrap(
spacing: 8,
runSpacing: 8,
children: [
Chip(label: Text('Widget')),
Chip(label: Text('build')),
Chip(label: Text('UI'))
],
),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text('화면에 표시되는 위젯 조각')
],
)
],
),
)
Lesson
WidgetbuildUI
화면에 표시되는 위젯 조각
테스트 전략
복잡한 비즈니스 규칙은 unit test로 먼저 보호합니다.
언제 쓰나: 중요한 화면 상태는 widget test로 검증합니다.
Flutter에서: 로그인, 결제, 등록 같은 핵심 사용자 여정은 integration test 후보입니다.
testWidgets('테스트 전략', (tester) async {
await tester.pumpWidget(const MaterialApp(home: HomePage()));
expect(find.text('Flutter Wiki'), findsOneWidget);
});
Container(
padding: const EdgeInsets.all(20),
decoration: BoxDecoration(
color: Colors.white,
border: Border.all(color: const Color(0xFFDCE6EF)),
borderRadius: BorderRadius.circular(8),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 10),
decoration: BoxDecoration(
color: const Color(0xFFEEF7FB),
borderRadius: BorderRadius.circular(8),
),
child: const Text(
'Lesson',
style: TextStyle(fontSize: 20, fontWeight: FontWeight.w900),
),
),
Wrap(
spacing: 8,
runSpacing: 8,
children: [
Chip(label: Text('Widget')),
Chip(label: Text('build')),
Chip(label: Text('UI'))
],
),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text('화면에 표시되는 위젯 조각')
],
)
],
),
)
Lesson
WidgetbuildUI
화면에 표시되는 위젯 조각
확장 개념
테스트 종류
- Unit test는 함수와 클래스의 순수 로직을 빠르게 검증합니다.
- Widget test는 특정 위젯이 기대한 UI와 상호작용을 제공하는지 확인합니다.
- Integration test는 실제 앱 흐름을 기기나 에뮬레이터에서 검증합니다.
코드
예제
testWidgets('제목이 보인다', (tester) async {
await tester.pumpWidget(const MaterialApp(home: HomePage()));
expect(find.text('Flutter Wiki'), findsOneWidget);
});
Container(
padding: const EdgeInsets.all(20),
decoration: BoxDecoration(
color: Colors.white,
border: Border.all(color: const Color(0xFFDCE6EF)),
borderRadius: BorderRadius.circular(8),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 10),
decoration: BoxDecoration(
color: const Color(0xFFEEF7FB),
borderRadius: BorderRadius.circular(8),
),
child: const Text(
'Lesson',
style: TextStyle(fontSize: 20, fontWeight: FontWeight.w900),
),
),
Wrap(
spacing: 8,
runSpacing: 8,
children: [
Chip(label: Text('Widget')),
Chip(label: Text('build')),
Chip(label: Text('UI'))
],
),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text('화면에 표시되는 위젯 조각')
],
)
],
),
)
Lesson
WidgetbuildUI
화면에 표시되는 위젯 조각
다음 단계
실습 체크리스트
unit test 작성widget test 작성integration test 대상 선정
- 출처세부 기준과 최신 변경 사항을 확인할 수 있습니다.
- Flutter API Reference클래스, 메서드, 생성자 세부 정의를 확인합니다.
- Dart languageDart 문법 자체가 궁금할 때 함께 봅니다.