Communityライティング&編集github.com

DartおよびFlutterアプリケーションのテスト

`package:test` を使用して、関数、メソッド、クラスのユニットテストを作成し整理します。新しいロジックを作成するときやバグを修正するときに使用し、コードの正確性とリグレッションの防止を実現します。

DartおよびFlutterアプリケーションのテスト とは?

このスキルは、Dart および Flutter プロジェクト向けのユニットテストを作成・整理するための包括的なガイドです。`package:test` を標準テスティングライブラリとして使用し、テストファイルは `lib` ディレクトリ構成を反映して整理します。テストの作成、グループ化、期待値の検証、非同期テスト、セットアップ/ティアダウン、さらに `package:mockito` を使ったモックオブジェクトの生成方法までカバーしています。実行は `dart test` や `flutter test` コマンドで行い、統合テストは `integration_test` ディレクトリで管理します。ワークフローは段階的なチェックリスト形式で提供され、テストの実行 → 失敗箇所の確認 → 修正 → 再実行というフィードバックループを推奨しています。このスキルにより、開発者は新機能の追加やバグ修正のたびに、安定した回帰防止策を効率的に実装できます。

対応~Claude Code~Codex CLI~Cursor✓Gemini CLI
npx skills add https://github.com/photoeven2-netizen/astronusa/tree/HEAD/.agents/skills/dart-add-unit-test

Installed? Explore more ライティング&編集 skills: steipete/notion, langchain-ai/langchain, bytedance/podcast-generation · View all 6 →

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

DartおよびFlutterアプリケーションのテスト は何をしますか?

目次

テストファイルの構成

予測可能性を維持するため、lib ディレクトリ構造を反映するようにテストファイルを整理します。

  • すべてのテストコードは、パッケージルートの test ディレクトリ内に配置します。
  • すべてのテストファイル名の末尾に _test.dart を追加します(例:lib/src/utils.dart は test/src/utils_test.dart でテストします)。
  • 統合テストを作成する場合は、パッケージルートの integration_test ディレクトリに配置します。

テストの作成

Dart アプリケーションの標準テスティングライブラリとして package:test を利用します。

  • package:test/test.dart(Flutter の場合は package:flutter_test/flutter_test.dart)をインポートします。
  • group() 関数を使用して関連するテストをグループ化し、共有コンテキストを提供します。
  • test() 関数を使用して個々のテストケースを定義します。
  • expect() 関数とマッチャー(例:equals()、isTrue、throwsA())を使用して結果を検証します。
  • 非同期テストは標準の async/await 構文を使用して記述します。テストランナーは自動的に Future の完了を待機します。
  • setUp() および tearDown() コールバックを使用してテストのセットアップとクリーンアップを管理します。
  • 依存性注入に依存するコードをテストする場合は、package:mockito を package:test と組み合わせて使用し、モックオブジェクトを生成し、固定シナリオを設定し、相互作用を検証します。

テストの実行

プロジェクトの種類とテストの場所に基づいて、適切なテストランナーを選択します。

  • 純粋な Dart プロジェクトの場合は、dart test コマンドを使用してテストを実行します。
  • Flutter プロジェクトの場合は、flutter test コマンドを使用してテストを実行します。
  • 統合テストを実行する場合は、ディレクトリパスを明示的に指定します。デフォルトのランナーは統合テストを無視するためです:dart test integration_test または flutter test integration_test。

テスト実装ワークフロー

新しいテストスイートを実装する際は、次の順次ワークフローに従います。チェックリストをコピーして進捗を追跡してください。

タスクの進捗

  • 1. test/ ディレクトリにテストファイルを作成し、_test.dart サフィックスを付与します。
  • 2. package:test/test.dart とターゲットライブラリをインポートします。
  • 3. main() 関数を定義します。
  • 4. setUp() を使用して共有リソースまたはモックを初期化します。
  • 5. group() を使用して機能ごとにグループ化された test() ケースを作成します。
  • 6. 適切な CLI コマンドを使用してテストスイートを実行します。
  • 7. フィードバックループ: テストを実行 → 失敗のスタックトレースを確認 → 実装またはアサーションを修正 → 成功するまで再実行。

例

標準ユニットテストスイート

グループ化、セットアップ、同期テスト、非同期テストを示します。

import 'package:test/test.dart';
import 'package:my_package/calculator.dart';

void main() {
  group('Calculator', () {
    late Calculator calc;

    setUp(() {
      calc = Calculator();
    });

    test('2つの数値を正しく加算する', () {
      expect(calc.add(2, 3), equals(5));
    });

    test('非同期操作を処理する', () async {
      final result = await calc.fetchRemoteValue();
      expect(result, isNotNull);
      expect(result, greaterThan(0));
    });
  });
}

Mockito を使用したモック

依存性注入テストのためのモックオブジェクトの設定を示します。

import 'package:test/test.dart';
import 'package:mockito/mockito.dart';
import 'package:mockito/annotations.dart';
import 'package:my_package/api_client.dart';
import 'package:my_package/data_service.dart';

// build_runner を使用してモックを生成: dart run build_runner build
@GenerateNiceMocks([MockSpec<ApiClient>()])
import 'data_service_test.mocks.dart';

void main() {
  group('DataService', () {
    late MockApiClient mockApiClient;
    late DataService dataService;

    setUp(() {
      mockApiClient = MockApiClient();
      dataService = DataService(apiClient: mockApiClient);
    });

    test('API呼び出しが成功した場合、パースされたデータを返す', () async {
      // モックを設定
      when(mockApiClient.get('/data')).thenAnswer((_) async => '{"id": 1}');

      // テスト対象のシステムを実行
      final result = await dataService.fetchData();

      // 結果と相互作用を検証
      expect(result.id, equals(1));
      verify(mockApiClient.get('/data')).called(1);
    });
  });
}

Individual skills in this repo

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

関連スキル