Flutter 위젯 테스트: Finder 사용법 완벽 가이드
Flutter 애플리케이션 개발에서 위젯 테스트는 코드의 안정성과 품질을 보장하는 데 필수적입니다. 특히, Finder는 테스트 중 특정 위젯을 식별하고 상호작용하는 데 중요한 역할을 합니다. 이번 블로그에서는 Finder의 주요 기능과 사용 방법을 심도 있게 살펴보겠습니다.
참고. Find widgets
Finder란 무엇인가요?
Finder는 테스트 중 원하는 위젯을 찾기 위해 사용되는 Flutter의 도구입니다. 이를 통해 특정 위젯을 식별하고, 해당 위젯에 대한 다양한 테스트를 수행할 수 있습니다. 주요 Finder 메서드는 다음과 같습니다:
- findByType: 위젯의 타입을 기반으로 검색합니다.
- findByKey: 위젯에 할당된 키를 기반으로 검색합니다.
- findByWidget: 특정 위젯 인스턴스를 직접 검색합니다.
Finder의 주요 메서드와 사용법
1. find.text
텍스트 내용을 기반으로 위젯을 찾습니다. 예를 들어, "로그인"이라는 텍스트를 포함한 위젯을 찾으려면 다음과 같이 사용합니다:
find.text('로그인');
2. find.byType
위젯의 타입을 기반으로 검색합니다. 예를 들어, ElevatedButton
타입의 모든 위젯을 찾으려면 다음과 같이 사용합니다:
find.byType(ElevatedButton);
3. find.byKey
특정 키를 가진 위젯을 찾습니다. 키는 위젯에 고유하게 부여되므로, 이를 통해 정확한 위젯을 식별할 수 있습니다:
final key = Key('login_button');
find.byKey(key);
Finder를 활용한 테스트 예시
Finder를 활용하여 위젯을 찾은 후, 해당 위젯에 대한 다양한 테스트를 수행할 수 있습니다. 예를 들어, "로그인" 버튼을 찾아 탭하는 테스트는 다음과 같이 작성할 수 있습니다:
// '로그인' 텍스트를 가진 ElevatedButton 위젯을 찾습니다.
final loginButtonFinder = find.widgetWithText(ElevatedButton, '로그인');
// 해당 버튼이 실제로 존재하는지 확인합니다.
expect(loginButtonFinder, findsOneWidget);
// 버튼을 탭합니다.
await tester.tap(loginButtonFinder);
// 애니메이션이 완료될 때까지 기다립니다.
await tester.pumpAndSettle();
Finder 사용 시 주의사항
- 고유성 보장:
find.byKey
를 사용할 때, 키는 애플리케이션 내에서 고유해야 합니다. 이를 통해 정확한 위젯을 식별할 수 있습니다. - 위젯 계층 구조 이해: 복잡한 레이아웃에서는 위젯의 계층 구조를 정확히 파악하여 원하는 위젯을 정확하게 찾는 것이 중요합니다.
- 적절한 Finder 선택: 상황에 따라 가장 적합한 Finder 메서드를 선택하여 테스트의 정확성과 효율성을 높이세요.
결론
Flutter에서 Finder는 위젯 테스트의 핵심 도구로서, 다양한 메서드를 통해 원하는 위젯을 정확하게 찾고 상호작용할 수 있습니다. 이를 통해 애플리케이션의 품질을 높이고, 안정적인 코드를 유지할 수 있습니다. 위에서 소개한 Finder 메서드와 사용법을 숙지하여, 효과적인 테스트 코드를 작성해 보시기 바랍니다.
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
testWidgets('finds a Text widget', (tester) async {
// Build an App with a Text widget that displays the letter 'H'.
await tester.pumpWidget(const MaterialApp(
home: Scaffold(
body: Text('H'),
),
));
// Find a widget that displays the letter 'H'.
expect(find.text('H'), findsOneWidget);
});
testWidgets('finds a widget using a Key', (tester) async {
// Define the test key.
const testKey = Key('K');
// Build a MaterialApp with the testKey.
await tester.pumpWidget(MaterialApp(key: testKey, home: Container()));
// Find the MaterialApp widget using the testKey.
expect(find.byKey(testKey), findsOneWidget);
});
testWidgets('finds a specific instance', (tester) async {
const childWidget = Padding(padding: EdgeInsets.zero);
// Provide the childWidget to the Container.
await tester.pumpWidget(Container(child: childWidget));
// Search for the childWidget in the tree and verify it exists.
expect(find.byWidget(childWidget), findsOneWidget);
});
}