Flutter의 유닛 테스트(Unit Testing) 방법과 활용
Flutter 앱 개발에서 유닛 테스트(Unit Testing)는 코드의 기능을 개별적으로 검증하는 중요한 과정입니다. 유닛 테스트를 통해 버그를 조기에 발견하고, 코드의 신뢰성을 높이며, 리팩토링 시 기존 기능이 정상적으로 동작하는지 확인할 수 있습니다.
이 글에서는 Flutter에서 유닛 테스트를 작성하고 실행하는 방법을 설명하고, 효과적인 테스트 전략을 소개하겠습니다.
1. 유닛 테스트(Unit Testing)란?
유닛 테스트(Unit Testing)는 코드의 개별 단위를 검증하는 테스트 방법으로, 주로 함수나 클래스의 메서드가 올바르게 동작하는지 확인하는 데 사용됩니다.
Flutter에서 유닛 테스트를 수행하면 다음과 같은 장점이 있습니다.
- 코드 안정성 증가: 새로운 기능을 추가해도 기존 코드가 정상적으로 동작하는지 검증
- 디버깅 시간 단축: 오류 발생 시 빠르게 원인을 파악
- 자동화 테스트 가능: CI/CD 파이프라인에서 자동 테스트 실행
이제 Flutter에서 유닛 테스트를 설정하는 방법을 살펴보겠습니다.
2. Flutter 유닛 테스트 환경 설정
Flutter 프로젝트에서 유닛 테스트를 실행하려면 test
패키지를 추가해야 합니다.
(1) 테스트 패키지 설치
Flutter 프로젝트에 test
패키지가 기본적으로 포함되어 있지만, 최신 버전이 필요한 경우 다음 명령어를 실행합니다.
flutter pub add test --dev
(2) 테스트 폴더 구조
유닛 테스트 파일은 test/
디렉토리에 위치해야 합니다.
lib/
├── main.dart
├── services/
│ ├── calculator.dart
test/
├── calculator_test.dart
이제 실제로 유닛 테스트를 작성해 보겠습니다.
3. 유닛 테스트 작성 방법
(1) 간단한 계산기 클래스 테스트
다음은 덧셈과 뺄셈을 수행하는 간단한 Calculator
클래스를 정의한 예제입니다.
// lib/services/calculator.dart
class Calculator {
int add(int a, int b) => a + b;
int subtract(int a, int b) => a - b;
}
(2) 테스트 파일 작성
이제 Calculator
클래스의 기능을 검증하는 테스트를 작성합니다.
// test/calculator_test.dart
import 'package:flutter_test/flutter_test.dart';
import 'package:my_app/services/calculator.dart';
void main() {
group('Calculator 테스트', () {
final calculator = Calculator();
test('1 + 2 = 3', () {
expect(calculator.add(1, 2), 3);
});
test('5 - 2 = 3', () {
expect(calculator.subtract(5, 2), 3);
});
});
}
이제 이 테스트를 실행해 보겠습니다.
4. 유닛 테스트 실행
Flutter에서 유닛 테스트를 실행하는 방법은 다음과 같습니다.
(1) 모든 테스트 실행
flutter test
(2) 특정 파일의 테스트 실행
flutter test test/calculator_test.dart
(3) 특정 테스트만 실행
특정 테스트만 실행하려면 testWidgets
대신 test
함수를 사용하고 --plain-name
옵션을 추가하면 됩니다.
flutter test --plain-name "1 + 2 = 3"
테스트가 성공하면 콘솔에 다음과 같은 메시지가 출력됩니다.
00:01 +2: All tests passed!
이제 비동기 함수 테스트 방법을 살펴보겠습니다.
5. 비동기 함수 테스트
Flutter에서는 API 요청과 같은 비동기 함수를 테스트할 수도 있습니다.
(1) 비동기 함수 작성
// lib/services/api_service.dart
class ApiService {
Future<String> fetchData() async {
await Future.delayed(Duration(seconds: 2));
return "데이터 로드 완료";
}
}
(2) 비동기 테스트 작성
// test/api_service_test.dart
import 'package:flutter_test/flutter_test.dart';
import 'package:my_app/services/api_service.dart';
void main() {
test('API 데이터 가져오기', () async {
final apiService = ApiService();
expect(await apiService.fetchData(), "데이터 로드 완료");
});
}
(3) 테스트 실행
flutter test test/api_service_test.dart
비동기 함수 테스트에서는 async
와 await
를 반드시 사용해야 합니다.
6. Mocking을 활용한 유닛 테스트
Flutter에서 API 요청을 포함하는 유닛 테스트를 실행하려면 mocktail
패키지를 활용할 수 있습니다.
(1) mocktail 패키지 설치
flutter pub add mocktail --dev
(2) Mock API 테스트 작성
import 'package:flutter_test/flutter_test.dart';
import 'package:mocktail/mocktail.dart';
import 'package:my_app/services/api_service.dart';
class MockApiService extends Mock implements ApiService {}
void main() {
test('Mock API 데이터 테스트', () async {
final mockApiService = MockApiService();
when(() => mockApiService.fetchData())
.thenAnswer((_) async => "Mock 데이터 로드 완료");
expect(await mockApiService.fetchData(), "Mock 데이터 로드 완료");
});
}
이제 네트워크 요청 없이도 유닛 테스트를 실행할 수 있습니다.
결론
Flutter에서 유닛 테스트를 활용하면 앱의 안정성을 높이고, 유지보수를 쉽게 할 수 있습니다.
- 기본 테스트:
test
와expect()
활용 - 비동기 테스트:
async/await
사용 - Mocking:
mocktail
로 가짜 데이터 테스트
이제 유닛 테스트를 활용하여 더욱 안정적인 Flutter 앱을 개발해 보세요!
'Flutter' 카테고리의 다른 글
Flutter의 위젯 테스트(Widget Testing) 방법과 활용 (0) | 2025.03.29 |
---|---|
Flutter의 통합 테스트(Integration Testing) 방법과 활용 (0) | 2025.03.29 |
Flutter의 오류 보고(Error Reporting) 방법과 활용 (0) | 2025.03.28 |
Flutter의 로깅(Logging) 방법과 활용 (0) | 2025.03.28 |
Flutter의 Dart DevTools 사용법과 활용 방법 (0) | 2025.03.28 |