Flutter

Flutter의 자동화 테스트(Automated Testing) 방법과 활용

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

Flutter의 자동화 테스트(Automated Testing) 방법과 활용

Flutter 앱 개발에서는 자동화 테스트(Automated Testing)를 통해 코드의 품질을 유지하고, 앱의 기능이 예상대로 동작하는지 검증할 수 있습니다. 자동화 테스트를 적용하면 버그를 조기에 발견하고, CI/CD 환경에서 지속적인 테스트를 실행할 수 있습니다.

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


1. Flutter에서 자동화 테스트가 중요한 이유

Flutter 앱에서 자동화 테스트를 수행하면 다음과 같은 장점이 있습니다.

  • 버그 조기 발견: 코드 변경 시 기존 기능이 정상적으로 동작하는지 검증
  • 반복적인 테스트 자동화: 수동 테스트 없이 빠르게 검증 가능
  • 코드 품질 유지: 기능 추가 및 리팩토링 시 안정성 보장
  • CI/CD 환경에서 실행: 지속적인 배포 및 테스트 가능

이제 Flutter에서 지원하는 자동화 테스트 유형을 살펴보겠습니다.


2. Flutter의 자동화 테스트 유형

Flutter는 자동화 테스트를 다음과 같이 세 가지 유형으로 나눌 수 있습니다.

테스트 유형 설명 사용 예
유닛 테스트(Unit Test) 함수 또는 클래스의 개별 동작을 검증 API 요청 결과 검증, 데이터 변환 테스트
위젯 테스트(Widget Test) UI 요소의 동작을 검증 버튼 클릭, 텍스트 입력 테스트
통합 테스트(Integration Test) 앱 전체의 흐름을 검증 로그인 → 대시보드 이동 → 로그아웃

이제 각각의 테스트를 작성하는 방법을 살펴보겠습니다.


3. 유닛 테스트(Unit Testing) 작성

(1) 유닛 테스트 대상 코드

아래는 간단한 계산기 클래스입니다.


// lib/services/calculator.dart
class Calculator {
  int add(int a, int b) => a + b;
  int subtract(int a, int b) => a - b;
}

(2) 유닛 테스트 파일 작성


// 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);
    });
  });
}

(3) 유닛 테스트 실행


flutter test test/calculator_test.dart

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


00:01 +2: All tests passed!

4. 위젯 테스트(Widget Testing) 작성

(1) 위젯 코드


// lib/widgets/counter_widget.dart
import 'package:flutter/material.dart';

class CounterWidget extends StatefulWidget {
  @override
  _CounterWidgetState createState() => _CounterWidgetState();
}

class _CounterWidgetState extends State<CounterWidget> {
  int _counter = 0;

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

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        Text('카운터 값:', key: Key("counter_text")),
        Text('$_counter', key: Key("counter_value"), style: TextStyle(fontSize: 24)),
        ElevatedButton(
          key: Key("increment_button"),
          onPressed: _incrementCounter,
          child: Text("증가"),
        ),
      ],
    );
  }
}

(2) 위젯 테스트 파일 작성


// test/counter_widget_test.dart
import 'package:flutter_test/flutter_test.dart';
import 'package:flutter/material.dart';
import 'package:my_app/widgets/counter_widget.dart';

void main() {
  testWidgets('카운터 증가 테스트', (WidgetTester tester) async {
    await tester.pumpWidget(MaterialApp(home: CounterWidget()));

    expect(find.text('0'), findsOneWidget);

    await tester.tap(find.byKey(Key("increment_button")));
    await tester.pump();

    expect(find.text('1'), findsOneWidget);
  });
}

(3) 위젯 테스트 실행


flutter test test/counter_widget_test.dart

5. 통합 테스트(Integration Testing) 작성

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


// 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);
  });
}

(2) 통합 테스트 실행


flutter test integration_test/app_test.dart

6. CI/CD 환경에서 자동화 테스트 실행

GitHub Actions 설정 예제


name: Flutter Tests

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

결론

Flutter에서 자동화 테스트를 활용하면 앱의 품질을 보장할 수 있습니다.

  • 유닛 테스트: 개별 함수 검증
  • 위젯 테스트: UI 요소 동작 검증
  • 통합 테스트: 전체 앱 흐름 검증
  • CI/CD 자동화: 지속적인 테스트 실행

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

728x90
반응형