flutter-add-integration-test
Flutter Driverを設定してアプリ操作を可能にし、MCPアクションを永続的なインテグレーションテストに変換します。プロジェクトへのインテグレーションテスト追加、MCP経由でのUIコンポーネント探索、またはintegration_testパッケージを使ったユーザーフローの自動化を行う際に使用します。
description の原文を見る
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.
SKILL.md 本文
Flutter インテグレーションテストの実装
目次
プロジェクトのセットアップと依存関係
インテグレーションテストと Flutter Driver 拡張をサポートするようプロジェクトを構成します。
- 必要な開発依存関係を
pubspec.yamlに追加します:flutter pub add 'dev:integration_test:{"sdk":"flutter"}' flutter pub add 'dev:flutter_test:{"sdk":"flutter"}' - アプリケーションのエントリーポイント (通常は
lib/main.dartまたは専用のlib/main_test.dart) で Flutter Driver 拡張を有効にします:package:flutter_driver/driver_extension.dartをインポートします。runApp()の前にenableFlutterDriverExtension();を呼び出します。
- アプリケーションコード内の重要なウィジェットに
Keyパラメーター (例:ValueKey('login_button')) を追加して、テスト中に確実にターゲットできるようにします。
MCP を介したインタラクティブな探索
Dart/Flutter MCP サーバーのツールを使用して、静的テストを作成する前にアプリケーションの状態をインタラクティブに探索および操作します。
- 起動:
launch_appをtarget: "lib/main_test.dart"で実行してアプリケーションを起動し、DTD URI を取得します。 - 検査:
get_widget_treeを実行して、利用可能なKey、Textノード、ウィジェットTypeを発見します。 - 操作:
tap、enter_text、scrollを実行してユーザーフローをシミュレートします。 - 待機: ナビゲーション中またはアニメーションをトリガーするときは、常に
waitForを実行するか、get_healthで状態を確認します。 - マウント解除されたウィジェットのトラブルシューティング: ウィジェットがツリーに見つからない場合、
SliverListまたはListViewで遅延ロードされている可能性があります。scrollまたはscrollIntoViewを実行してウィジェットを強制的にマウントしてから操作します。
テスト作成ガイドライン
flutter_test API パラダイムを使用してインテグレーションテストを構成します。
- プロジェクトルートに専用の
integration_test/ディレクトリを作成します。 - すべてのテストファイルに
<name>_test.dart命名規則を使用してください。 main()の開始時にIntegrationTestWidgetsFlutterBinding.ensureInitialized();を呼び出してバインディングを初期化します。await tester.pumpWidget(MyApp());を使用してアプリケーション UI をロードします。tester.tap()などのインタラクション後にawait tester.pumpAndSettle();を使用してフレームをトリガーし、アニメーションの完了を待機します。expect(find.byKey(ValueKey('foo')), findsOneWidget);またはfindsNothingを使用してウィジェットの表示を確認します。await tester.scrollUntilVisible(itemFinder, 500.0, scrollable: listFinder);を使用して、特定の画面外のウィジェットまでスクロールします。
レガシー flutter_driver の条件付きロジック:
- レガシー
flutter_driverテストを保守または移行する場合は、WidgetTesterAPI の代わりにdriver.waitFor()、driver.waitForAbsent()、driver.tap()、driver.scroll()を使用します。
実行とプロファイリング
flutter drive コマンドを使用してテストを実行します。test_driver/integration_test.dart に配置されたホストドライバースクリプトが integrationDriver() を呼び出す必要があります。
条件付き実行ターゲット:
- Chrome でテストする場合: 別のターミナルで
chromedriver --port=4444を起動してから、実行します:flutter drive --driver=test_driver/integration_test.dart --target=integration_test/app_test.dart -d chrome - ヘッドレス Web でテストする場合:
-d web-serverで実行します。 - Android (ローカル) でテストする場合:
flutter drive --driver=test_driver/integration_test.dart --target=integration_test/app_test.dartを実行します。 - Firebase Test Lab (Android) でテストする場合:
- デバッグ APK をビルドします:
flutter build apk --debug - テスト APK をビルドします:
./gradlew app:assembleAndroidTest - 両方の APK を Firebase Test Lab コンソールにアップロードします。
- デバッグ APK をビルドします:
ワークフロー: エンドツーエンドインテグレーションテスト
このチェックリストをコピーして、インテグレーションテストを実装および検証します。
- タスク進捗: セットアップ
-
integration_testとflutter_testをpubspec.yamlに追加します。 -
enableFlutterDriverExtension()をアプリエントリーポイントに挿入します。 - ターゲットウィジェットに
ValueKeyを割り当てます。
-
- タスク進捗: 探索
- MCP 経由で
launch_appを実行します。 -
get_widget_treeを使用してウィジェットツリーをマッピングします。 - MCP ツール (
tap,enter_text) を使用してインタラクションパスを検証します。
- MCP 経由で
- タスク進捗: 作成
-
integration_test/app_test.dartを作成します。 -
WidgetTesterAPI を使用してテストケースを記述します。 -
integrationDriver()を含むtest_driver/integration_test.dartを作成します。
-
- タスク進捗: 実行とフィードバックループ
-
flutter drive --driver=test_driver/integration_test.dart --target=integration_test/app_test.dartを実行します。 - フィードバックループ: テスト出力を確認 →
PumpAndSettleTimedOutExceptionが発生する場合は、無限アニメーションを確認 → ウィジェットが見つからない場合はscrollUntilVisibleを追加 → テストが成功するまで再実行します。
-
例
標準インテグレーションテスト (integration_test/app_test.dart)
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:integration_test/integration_test.dart';
import 'package:my_app/main.dart';
void main() {
IntegrationTestWidgetsFlutterBinding.ensureInitialized();
group('End-to-end test', () {
testWidgets('tap on the floating action button, verify counter', (tester) async {
// Load app widget.
await tester.pumpWidget(const MyApp());
// Verify the counter starts at 0.
expect(find.text('0'), findsOneWidget);
// Find the floating action button to tap on.
final fab = find.byKey(const ValueKey('increment'));
// Emulate a tap on the floating action button.
await tester.tap(fab);
// Trigger a frame and wait for animations.
await tester.pumpAndSettle();
// Verify the counter increments by 1.
expect(find.text('1'), findsOneWidget);
});
});
}
ホストドライバースクリプト (test_driver/integration_test.dart)
import 'package:integration_test/integration_test_driver.dart';
Future<void> main() => integrationDriver();
パフォーマンスプロファイリングドライバースクリプト (test_driver/perf_driver.dart)
テストアクションを binding.traceAction() でラップしてパフォーマンスメトリクスをキャプチャする場合は、このドライバースクリプトを使用します。
import 'package:flutter_driver/flutter_driver.dart' as driver;
import 'package:integration_test/integration_test_driver.dart';
Future<void> main() {
return integrationDriver(
responseDataCallback: (data) async {
if (data != null) {
final timeline = driver.Timeline.fromJson(
data['scrolling_timeline'] as Map<String, dynamic>,
);
final summary = driver.TimelineSummary.summarize(timeline);
await summary.writeTimelineToFile(
'scrolling_timeline',
pretty: true,
includeSummary: true,
);
}
},
);
}
ライセンス: BSD-3-Clause(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- flutter
- リポジトリ
- flutter/skills
- ライセンス
- BSD-3-Clause
- 最終更新
- 不明
Source: https://github.com/flutter/skills / ライセンス: BSD-3-Clause
関連スキル
nano-banana-2
inference.sh CLIを通じてGoogle Gemini 3.1 Flash Image Preview(Nano Banana 2)で画像を生成します。テキストから画像を生成する機能、画像編集、最大14枚の複数画像入力、Google Searchグラウンディング機能に対応しています。トリガーワード:「nano banana 2」「nanobanana 2」「gemini 3.1 flash image」「gemini 3 1 flash image preview」「google image generation」
octocode-slides
洗練されたマルチファイル形式のHTMLプレゼンテーションを生成します。6段階のフロー(概要 → リサーチ → アウトライン → デザイン → 実装 → レビュー)で構成されています。各スライドは独立したHTMLファイルとなり、iframeで読み込まれます。「スライドを作成してほしい」「プレゼンテーションを作ってほしい」「HTMLスライドを生成してほしい」「デックを構築してほしい」といった依頼や、ノート・ドキュメント・コードを洗練されたプレゼンテーションに変換する際に使用できます。
gpt-image2-ppt
OpenAIのgpt-image-2を使用して、視覚的に優れたPPTスライドを生成します。Spatial Glass、Tech Blue、Editorial Monoなど10種類のキュレーション済みスタイルに対応し、ユーザーが提供したPPTXファイルを模倣するテンプレートクローンモードも搭載しています。HTMLビューアと16:9形式のPPTXファイルを出力します。プレゼンテーション、スライド、ピッチデック、投資家向けPPT、雑誌風PPTの作成依頼などで活用してください。
nano-banana
Nano Banana PRO(Gemini 3 Pro Image)およびNano Banana(Gemini 2.5 Flash Image)を使用したAI画像生成機能です。以下の場合に活用できます:(1)テキストプロンプトからの画像生成、(2)既存画像の編集、(3)インフォグラフィックス、ロゴ、商品写真、ステッカーなどのプロフェッショナルなビジュアルアセット制作、(4)複数画像での人物キャラクターの一貫性保持、(5)正確なテキスト描画を含む画像生成、(6)AI生成ビジュアルが必要なあらゆるタスク。「画像を生成」「画像を作成」「写真を作る」「ロゴをデザイン」「インフォグラフィックスを作成」「AI画像」「nano banana」またはその他の画像生成リクエストをトリガーとして機能します。
oiloil-ui-ux-guide
モダンでクリーンなUI/UXガイダンス・レビュースキルです。新機能や既存システム(Webアプリ)に対して、実行可能なUI/UX改善提案、デザイン原則、デザインレビューチェックリストが必要な場合に活用できます。CRAP(コントラスト・反復・配置・近接)をベースに、タスクファーストなUX、情報設計、フィードバック・システムステータス、一貫性、affordances、エラー防止・復旧、認知負荷を重視します。モダンミニマルスタイル(クリーン・余白・タイポグラフィ主導)を強制し、不要なテキストを削減、アイコンとしての絵文字を禁止し、統一されたアイコンセットから直感的で洗練されたアイコンを推奨します。
axiom-hig-ref
Apple Human Interface Guidelines リファレンス — 色(セマンティックカラー、カスタムカラー、パターン)、背景(マテリアル階層、ダイナミック背景)、タイポグラフィ(標準スタイル、カスタムフォント、Dynamic Type)、SF Symbols(レンダリングモード、色、多言語対応)、ダークモード、アクセシビリティ、プラットフォーム固有の考慮事項を網羅したガイドラインです。