Community코딩 & 개발github.com

flutter/flutter-testing-apps

Flutter 앱에 단위, 위젯, 통합 테스트를 구현합니다. 코드 품질을 보장하고 자동화된 테스트를 통해 회귀를 방지할 때 사용하세요.

flutter-testing-apps란 무엇인가요?

이 스킬은 Flutter 애플리케이션의 코드 품질을 보장하고 회귀(regression)를 방지하기 위한 단위(unit), 위젯(widget), 통합(integration) 테스트를 구현하는 방법을 제공합니다. Flutter의 기본 테스트 프레임워크와 `flutter_test`, `integration_test` 패키지를 활용하여 개발자와 AI 에이전트가 체계적으로 테스트 코드를 작성할 수 있도록 도와줍니다. 주요 기능으로는 모의 객체(mock) 생성, 테스트 더블(test double) 활용, 비동기 위젯 테스트, 그리고 CI/CD 파이프라인과 통합 가능한 통합 테스트 설정이 포함됩니다. 또한 테스트 커버리지 측정과 테스트 실행 자동화를 지원하여 지속적인 품질 관리를 가능하게 합니다.

지원 대상~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/flutter/skills/tree/main/skills/flutter-testing-apps

Installed? Explore more 코딩 & 개발 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

flutter-testing-apps은(는) 무엇을 하나요?

Flutter 앱에 단위, 위젯, 통합 테스트를 구현합니다. 코드 품질을 보장하고 자동화된 테스트를 통해 회귀를 방지할 때 사용하세요.

개요

이 SKILL은 Flutter 애플리케이션을 위한 포괄적인 테스트 전략을 제공합니다. 테스트는 세 가지 주요 수준으로 나뉩니다:

  1. 단위 테스트(Unit Tests): 개별 함수, 클래스, 또는 메서드를 독립적으로 테스트합니다.
  2. 위젯 테스트(Widget Tests): 위젯의 UI 렌더링과 상호작용을 테스트합니다.
  3. 통합 테스트(Integration Tests): 앱의 전체 흐름과 사용자 시나리오를 종단 간 테스트합니다.

시작하기

의존성 추가

pubspec.yaml 파일에 다음 의존성을 추가하세요:

dev_dependencies:
  flutter_test:
    sdk: flutter
  integration_test:
    sdk: flutter
  mockito: ^5.4.0
  build_runner: ^2.4.0

테스트 디렉토리 구조

lib/
  ...
test/
  unit/
    model_test.dart
    service_test.dart
  widget/
    my_widget_test.dart
  integration/
    app_test.dart

단위 테스트 작성하기

test/unit/service_test.dart 예제:

import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/mockito.dart';
import 'package:my_app/services/api_service.dart';

class MockApiService extends Mock implements ApiService {}

void main() {
  group('ApiService', () {
    late MockApiService mockService;

    setUp(() {
      mockService = MockApiService();
    });

    test('fetchData returns data on success', () async {
      when(mockService.fetchData()).thenAnswer((_) async => 'data');
      final result = await mockService.fetchData();
      expect(result, 'data');
    });

    test('fetchData throws exception on failure', () async {
      when(mockService.fetchData()).thenThrow(Exception('Network error'));
      expect(() async => await mockService.fetchData(), throwsException);
    });
  });
}

위젯 테스트 작성하기

test/widget/my_widget_test.dart 예제:

import 'package:flutter_test/flutter_test.dart';
import 'package:my_app/widgets/my_button.dart';

void main() {
  testWidgets('MyButton displays correct label', (WidgetTester tester) async {
    await tester.pumpWidget(
      MaterialApp(
        home: Scaffold(
          body: MyButton(label: 'Press Me', onPressed: () {}),
        ),
      ),
    );

    expect(find.text('Press Me'), findsOneWidget);
  });

  testWidgets('MyButton responds to tap', (WidgetTester tester) async {
    var tapped = false;
    await tester.pumpWidget(
      MaterialApp(
        home: Scaffold(
          body: MyButton(
            label: 'Press Me',
            onPressed: () => tapped = true,
          ),
        ),
      ),
    );

    await tester.tap(find.byType(ElevatedButton));
    expect(tapped, isTrue);
  });
}

통합 테스트 작성하기

test/integration/app_test.dart 예제:

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

void main() {
  IntegrationTestWidgetsFlutterBinding.ensureInitialized();

  testWidgets('end-to-end test', (WidgetTester tester) async {
    app.main();
    await tester.pumpAndSettle();

    // 로그인 화면 확인
    expect(find.text('Login'), findsOneWidget);

    // 텍스트 필드 입력
    await tester.enterText(find.byType(TextField).at(0), '[email protected]');
    await tester.enterText(find.byType(TextField).at(1), 'password123');

    // 로그인 버튼 탭
    await tester.tap(find.text('Login'));
    await tester.pumpAndSettle();

    // 대시보드 확인
    expect(find.text('Welcome'), findsOneWidget);
  });
}

테스트 실행하기

단위 및 위젯 테스트

flutter test

특정 테스트 파일 실행

flutter test test/unit/service_test.dart

통합 테스트 실행

flutter test integration_test/app_test.dart -d <device_id>

테스트 커버리지 측정

flutter test --coverage

커버리지 보고서는 coverage/lcov.info에 생성됩니다.

CI/CD 통합

GitHub Actions 예제 (.github/workflows/test.yml):

name: Run Tests
on: [push, pull_request]
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: subosito/flutter-action@v2
        with:
          flutter-version: '3.x'
      - run: flutter pub get
      - run: flutter test --coverage
      - uses: codecov/codecov-action@v3

모범 사례

  • 테스트는 독립적이어야 함: 각 테스트는 상태를 공유하지 않고 독립적으로 실행되어야 합니다.
  • 행동 검증: 구현 세부 사항보다는 예상되는 동작을 검증하세요.
  • Mock 활용: 외부 의존성(네트워크, 데이터베이스 등)은 Mock 객체로 대체하세요.
  • 일관된 명명 규칙: testDescription_expectedBehavior 패턴을 사용하세요.
  • AAA 패턴 따르기: Arrange (준비), Act (실행), Assert (검증) 단계를 명확히 구분하세요.

참고 자료

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

flutter/flutter-accessibility

Configure your Flutter app to support assistive technologies like Screen Readers

flutter/flutter-accessibility-audit

Triggers an accessibility scan through the widget_inspector and automatically adds Semantics widgets or missing labels to the source code.

flutter/flutter-adding-home-screen-widgets

Adds home screen widgets to a Flutter app for Android and iOS. Use when providing glanceable app information or quick actions on the device home screen.

flutter/flutter-add-integration-test

Configures Flutter Driver for app interaction and converts MCP actions into permanent integration tests. Use when adding integration testing to a project, exploring UI components via MCP, or automating user flows with the integration_test package.

flutter/flutter-add-widget-preview

Adds interactive widget previews to the project using the previews.dart system. Use when creating new UI components or updating existing screens to ensure consistent design and interactive testing.

flutter/flutter-add-widget-test

Implement a component-level test using `WidgetTester` to verify UI rendering and user interactions (tapping, scrolling, entering text). Use when validating that a specific widget displays correct data and responds to events as expected.

flutter/flutter-animating-apps

Implements animated effects, transitions, and motion in a Flutter app. Use when adding visual feedback, shared element transitions, or physics-based animations.

flutter/flutter-animation

Add animated effects to your Flutter app

flutter/flutter-apply-architecture-best-practices

Architects a Flutter application using the recommended layered approach (UI, Logic, Data). Use when structuring a new project or refactoring for scalability.

flutter/flutter-app-size

Measure and reduce the size of the Flutter app bundle, APK, or IPA

flutter/flutter-architecting-apps

Architects a Flutter application using the recommended layered approach (UI, Logic, Data). Use when structuring a new project or refactoring for scalability.

flutter/flutter-architecture

Use the Flutter team's recommended app architecture

flutter/flutter-building-forms

Builds Flutter forms with validation and user input handling. Use when creating login screens, data entry forms, or any multi-field user input.

flutter/flutter-building-layouts

Builds Flutter layouts using the constraint system and layout widgets. Use when creating or refining the UI structure of a Flutter application.

flutter/flutter-building-plugins

Builds Flutter plugins that provide native interop for other apps to use. Use when creating reusable packages that bridge Flutter with platform-specific functionality.

flutter/flutter-build-responsive-layout

Use `LayoutBuilder`, `MediaQuery`, or `Expanded/Flexible` to create a layout that adapts to different screen sizes. Use when you need the UI to look good on both mobile and tablet/desktop form factors.

flutter/flutter-caching

Cache data in a Flutter app

flutter/flutter-caching-data

Implements caching strategies for Flutter apps to improve performance and offline support. Use when retaining app data locally to reduce network requests or speed up startup.

flutter/flutter-concurrency

Execute long-running tasks in a background thread in Flutter

flutter/flutter-databases

Work with databases in a Flutter app

관련 스킬