Flutter

Flutter의 통합 테스트(Integration Testing) 방법과 활용

wsstar 2025. 3. 29. 07:00
728x90
반응형

Flutter의 통합 테스트(Integration Testing) 방법과 활용

Flutter 앱의 품질을 보장하기 위해서는 통합 테스트(Integration Testing)가 필요합니다. 통합 테스트를 통해 개별 기능이 아닌 앱 전체의 흐름을 검증하고, UI 요소가 올바르게 동작하는지 확인할 수 있습니다.

이 글에서는 Flutter에서 통합 테스트를 설정하고 실행하는 방법을 설명하고, 효과적인 테스트 전략을 소개하겠습니다.


1. 통합 테스트(Integration Testing)란?

통합 테스트(Integration Testing)는 여러 개의 모듈이 올바르게 동작하는지 검증하는 테스트 방법으로, 보통 UI 테스트 및 사용자 흐름을 포함합니다.

Flutter에서 통합 테스트를 수행하면 다음과 같은 장점이 있습니다.

  • UI 요소의 정상 작동 여부 확인
  • 실제 사용자 경험(User Experience) 테스트
  • 버그 조기 발견: 기능이 올바르게 연동되는지 확인
  • 자동화 테스트 가능: CI/CD 환경에서 테스트 실행

이제 Flutter에서 통합 테스트를 설정하는 방법을 살펴보겠습니다.


2. 통합 테스트 환경 설정

(1) Flutter 통합 테스트 패키지 설치

Flutter에서는 integration_test 패키지를 사용하여 통합 테스트를 실행할 수 있습니다.


flutter pub add integration_test --dev
flutter pub add flutter_test --dev

(2) 테스트 폴더 구조

통합 테스트 파일은 integration_test/ 디렉토리에 위치해야 합니다.


lib/
 ├── main.dart
 ├── screens/
 │   ├── home_screen.dart
integration_test/
 ├── app_test.dart

이제 실제로 통합 테스트를 작성해 보겠습니다.


3. 통합 테스트 작성 방법

Flutter에서는 WidgetTester를 사용하여 UI 상호작용을 테스트할 수 있습니다.

(1) 간단한 UI 테스트

아래는 버튼을 눌렀을 때 카운터 값이 증가하는지 테스트하는 예제입니다.


// lib/screens/home_screen.dart
import 'package:flutter/material.dart';

class HomeScreen extends StatefulWidget {
  @override
  _HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("Flutter 통합 테스트 예제")),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text('카운터 값:', key: Key("counter_text")),
            Text('$_counter', key: Key("counter_value"), style: TextStyle(fontSize: 24)),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        key: Key("increment_button"),
        onPressed: _incrementCounter,
        child: Icon(Icons.add),
      ),
    );
  }
}

(2) 통합 테스트 파일 작성

이제 integration_test/ 폴더에 테스트 파일을 추가합니다.


// integration_test/app_test.dart
import 'package:flutter_test/flutter_test.dart';
import 'package:integration_test/integration_test.dart';
import 'package:flutter/material.dart';
import 'package:my_app/main.dart';

void main() {
  IntegrationTestWidgetsFlutterBinding.ensureInitialized();

  testWidgets('카운터 증가 테스트', (WidgetTester tester) async {
    // 앱 실행
    await tester.pumpWidget(MyApp());

    // 초기 카운터 값 확인
    expect(find.text('0'), findsOneWidget);

    // 버튼 클릭
    await tester.tap(find.byKey(Key("increment_button")));
    await tester.pump();

    // 카운터 값 증가 확인
    expect(find.text('1'), findsOneWidget);
  });
}

이제 이 테스트를 실행해 보겠습니다.


4. 통합 테스트 실행

Flutter에서 통합 테스트를 실행하는 방법은 다음과 같습니다.

(1) 모든 테스트 실행


flutter test integration_test

(2) 특정 테스트 파일 실행


flutter test integration_test/app_test.dart

(3) 실제 디바이스에서 테스트 실행

통합 테스트는 에뮬레이터 또는 실제 디바이스에서도 실행할 수 있습니다.


flutter drive --driver=test_driver/integration_test.dart --target=integration_test/app_test.dart

테스트가 성공하면 다음과 같은 메시지가 출력됩니다.


00:01 +1: All tests passed!

5. 네트워크 요청(Mock API) 테스트

실제 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 데이터 로드 완료");
  });
}

이제 실제 네트워크 요청 없이도 통합 테스트를 실행할 수 있습니다.


6. CI/CD 환경에서 통합 테스트 실행

통합 테스트는 GitHub Actions, Bitrise, Firebase Test Lab 등에서 자동화할 수 있습니다.

GitHub Actions 예제


name: Flutter Integration Test

on:
  push:
    branches:
      - main

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: subosito/flutter-action@v2
        with:
          flutter-version: 3.0.0
      - run: flutter pub get
      - run: flutter test integration_test

결론

Flutter에서 통합 테스트를 활용하면 앱의 UI와 기능을 효과적으로 검증할 수 있습니다.

  • WidgetTester를 사용하여 UI 테스트 수행
  • integration_test 패키지를 활용하여 전체 앱 흐름 검증
  • mocktail을 사용하여 API 요청을 Mocking
  • CI/CD 환경에서 자동 테스트 실행

이제 통합 테스트를 활용하여 더욱 안정적인 Flutter 앱을 개발해 보세요!

728x90
반응형