Flutter 테스트 완벽 가이드 유닛 테스트부터 통합 테스트까지

Flutter 테스트 완벽 가이드 유닛 테스트부터 통합 테스트까지
Cozy CodingPosted On Jun 21, 20245 min read

플러터 앱 품질 확보를 위한 포괄적 가이드

테스트는 소프트웨어 개발 주기의 중요한 부분으로, 애플리케이션이 예상대로 작동하고 높은 수준의 품질을 유지하도록 보장합니다. Flutter에서는 다양한 도구와 실천 방법을 통해 편리하고 효과적인 테스트를 수행할 수 있습니다. 이 안내서에서는 Flutter에서 사용 가능한 다양한 유형의 테스트를 안내하고 예제를 제공하며 효과적인 테스트 작성을 위한 모범 사례를 공유합니다.

이미지

1. 유닛 테스트

단위 테스트는 기능을 독립적으로 확인하는 데 사용됩니다. 함수나 클래스와 같은 개별 구성 요소의 동작을 검증합니다. 이는 견고한 테스트 전략의 기반입니다.

단위 테스트 설정하기

플러터에서 단위 테스트를 설정하려면 pubspec.yaml 파일에 test 종속성을 추가하세요:

dev_dependencies:
  test: ^1.16.0Writing Unit Tests

유닛 테스트 작성

다트 언어로 작성된 간단한 함수와 해당하는 유닛 테스트의 예시가 있습니다:

// math_utils.dart
int add(int a, int b) => a + b;

// math_utils_test.dart
import 'package:test/test.dart';
import 'math_utils.dart';

void main() {
  test('두 숫자의 덧셈', () {
    expect(add(2, 3), 5);
    expect(add(-1, 1), 0);
  });
}

유닛 테스트 실행

다음 명령을 사용하여 단위 테스트를 실행할 수 있어요:

flutter test

2. 위젯 테스트

위젯 테스트는 개별 위젯 및 상호 작용의 동작을 확인합니다. 통합 테스트보다 빠르게 실행되며 실제 장치 또는 에뮬레이터가 필요하지 않아요.

위젯 테스트 설정하기

새로운 플러터 프로젝트를 생성할 때 기본으로 포함되어 있는 flutter_test 종속성을 추가해주세요.

위젯 테스트 작성하기

간단한 카운터 앱을 위한 위젯 테스트 예시입니다:

// main.dart
import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: CounterPage(),
    );
  }
}

class CounterPage extends StatefulWidget {
  @override
  _CounterPageState createState() => _CounterPageState();
}

class _CounterPageState extends State<CounterPage> {
  int _counter = 0;

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Counter App'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headline4,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}
// counter_page_test.dart
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:my_app/main.dart';

void main() {
  testWidgets('Counter increments smoke test', (WidgetTester tester) async {
    await tester.pumpWidget(MyApp());

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

    await tester.tap(find.byIcon(Icons.add));
    await tester.pump();

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

Running Widget Tests

Use the same command as for unit tests:

플러터 테스트

3. 통합 테스트

통합 테스트는 앱의 모든 부분이 예상대로 함께 작동하는지 확인합니다. 실제 기기나 에뮬레이터에서 실행되며 실제 사용자 상호작용을 시뮬레이션합니다.

통합 테스트 설정하기

pubspec.yaml 파일에 integration_test dependency를 추가해주세요:

dev_dependencies:
  integration_test: ^1.0.2
  flutter_test:
    sdk: flutter

통합 테스트 작성

다음은 카운터 앱을 위한 통합 테스트의 예시입니다:

// counter_app_test.dart
import 'package:flutter_test/flutter_test.dart';
import 'package:integration_test/integration_test.dart';
import 'package:my_app/main.dart' as app;

void main() {
  IntegrationTestWidgetsFlutterBinding.ensureInitialized();

  testWidgets('Counter increments test', (WidgetTester tester) async {
    app.main();
    await tester.pumpAndSettle();

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

    await tester.tap(find.byIcon(Icons.add));
    await tester.pumpAndSettle();

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

통합 테스트 실행

다음 명령을 사용하여 통합 테스트를 실행할 수 있습니다:

flutter drive --target=test_driver/integration_test.dart

Flutter 테스팅을 위한 Best Practices

  • 명료하고 간결한 테스트 작성: 테스트가 쉽게 읽히고 이해되도록 합니다.
  • 외부 의존성을 모의(Mocking)화: 테스트 중인 구성 요소를 격리하기 위해 모킹을 사용합니다.
  • 테스트 자동화: 테스트를 CI/CD 파이프라인에 통합하여 문제를 빨리 파악합니다.
  • 여러 기기에서 테스트: 앱이 다양한 화면 크기와 OS 버전에서 작동하는지 확인합니다.
  • 테스트를 빠르게 유지: 빠른 피드백을 제공하는 테스트 작성에 주력하여 개발 프로세스를 효율적으로 유지합니다.

결론

테스트는 고품질의 Flutter 애플리케이션을 개발하는 중요한 부분입니다. 단위 테스트, 위젯 테스트, 통합 테스트를 이해하고 활용하여 앱이 믿을 수 있고 성능이 우수하며 훌륭한 사용자 경험을 제공하는지 확인할 수 있습니다. 이러한 테스트 전략을 개발 워크플로에 구현하여 버그를 초기에 잡고 코드 품질의 높은 기준을 유지하세요. 즐거운 테스팅 되세요!