flutter-add-widget-test
`WidgetTester` を使用してUIのレンダリングやユーザー操作(タップ・スクロール・テキスト入力)を検証するコンポーネントレベルのテストを実装します。特定のウィジェットが正しいデータを表示し、イベントに期待通り応答するかを確認したいときに使用してください。
description の原文を見る
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.
SKILL.md 本文
Flutter ウィジェットテストの作成
目次
セットアップと構成
ウィジェットテストを作成する前に、テスト環境が正しく構成されていることを確認します。
pubspec.yamlのdev_dependenciesセクションにflutter_test依存関係を追加します。- すべてのテストファイルをプロジェクトのルートの
test/ディレクトリに配置します。 - すべてのテストファイル名に
_test.dartサフィックスを付けます (例:widget_test.dart)。
コアコンポーネント
ウィジェットツリーをインタラクトして検証するために、以下の flutter_test コンポーネントを使用します:
WidgetTester: テスト環境でウィジェットをビルドしてインタラクトするためのプライマリインターフェース。testWidgets()関数によって自動的に提供されます。Finder: テスト環境内でウィジェットを検索します (例:find.text('Submit')、find.byType(TextField)、find.byKey(Key('submit_btn')))。Matcher:Finderによって検索されたウィジェットの存在または状態を検証します (例:findsOneWidget、findsNothing、findsNWidgets(2)、matchesGoldenFile)。
ワークフロー: ウィジェットテストの実装
新しいウィジェットテストを実装するときに進行状況を追跡するために、以下のチェックリストをコピーしてください。
タスク進行状況
- ステップ 1: テストを定義します。
testWidgets('description', (WidgetTester tester) async { ... })を使用します。 - ステップ 2: ウィジェットをビルドします。
await tester.pumpWidget(MyWidget())を呼び出して UI をレンダリングします。継承されたテーマデータまたは方向データが必要な場合は、ウィジェットをMaterialAppまたはDirectionalityウィジェットでラップします。 - ステップ 3: 要素を検索します。 ターゲットウィジェットの
Finderオブジェクトをインスタンス化します。 - ステップ 4: 初期状態を検証します。
expect(finder, matcher)を使用して初期レンダリングを検証します。 - ステップ 5: インタラクションをシミュレートします。 ジェスチャーまたは入力を実行します (例:
await tester.tap(buttonFinder))。 - ステップ 6: ツリーをリビルドします。
await tester.pump()またはawait tester.pumpAndSettle()を呼び出して状態変更を処理します。 - ステップ 7: 更新された状態を検証します。 インタラクション後の UI を検証するために
expect()を使用します。 - ステップ 8: 実行して検証します。
flutter test test/your_test_file_test.dartを実行します。 - ステップ 9: フィードバックループ。 テスト出力を確認 → 失敗したマッチャーを特定 → ウィジェットロジックまたはテストアサーションを調整 → パスするまで再実行します。
インタラクションと状態管理
テストするインタラクションまたは状態変更のタイプに基づいて、以下の条件ロジックを適用します:
- 静的レンダリングをテストする場合:
await tester.pumpWidget()を 1 回呼び出してから、すぐにexpect()アサーションを実行します。 - 標準的な状態変更をテストする場合 (例: ボタンタップ):
await tester.tap(finder)を呼び出します。await tester.pump()を呼び出して単一フレームのリビルドをトリガーします。
- アニメーション、トランジション、または非同期 UI 更新をテストする場合:
- アクションをトリガーします (例:
await tester.drag(finder, Offset(500, 0)))。 await tester.pumpAndSettle()を呼び出してフレームが予定されなくなるまで繰り返しポンプします (アニメーション完了)。
- アクションをトリガーします (例:
- テキスト入力をテストする場合:
await tester.enterText(textFieldFinder, 'Input string')を呼び出します。 - 動的またはロングリスト内のアイテムをテストする場合:
await tester.scrollUntilVisible(itemFinder, 500.0, scrollable: listFinder)を呼び出して、ターゲットウィジェットがレンダリングされていることを確認してからインタラクトします。
例
高忠実度ウィジェットテスト実装
ターゲットウィジェット (lib/todo_list.dart):
import 'package:flutter/material.dart';
class TodoList extends StatefulWidget {
const TodoList({super.key});
@override
State<TodoList> createState() => _TodoListState();
}
class _TodoListState extends State<TodoList> {
final todos = <String>[];
final controller = TextEditingController();
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: Column(
children: [
TextField(controller: controller),
Expanded(
child: ListView.builder(
itemCount: todos.length,
itemBuilder: (context, index) {
final todo = todos[index];
return Dismissible(
key: Key('$todo$index'),
onDismissed: (_) => setState(() => todos.removeAt(index)),
child: ListTile(title: Text(todo)),
);
},
),
),
],
),
floatingActionButton: FloatingActionButton(
onPressed: () {
setState(() {
todos.add(controller.text);
controller.clear();
});
},
child: const Icon(Icons.add),
),
),
);
}
}
テスト実装 (test/todo_list_test.dart):
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:my_app/todo_list.dart';
void main() {
testWidgets('Add and remove a todo item', (WidgetTester tester) async {
// 1. Build the widget
await tester.pumpWidget(const TodoList());
// 2. Verify initial state
expect(find.byType(ListTile), findsNothing);
// 3. Enter text into the TextField
await tester.enterText(find.byType(TextField), 'Buy groceries');
// 4. Tap the add button
await tester.tap(find.byType(FloatingActionButton));
// 5. Rebuild the widget to reflect the new state
await tester.pump();
// 6. Verify the item was added
expect(find.text('Buy groceries'), findsOneWidget);
// 7. Swipe the item to dismiss it
await tester.drag(find.byType(Dismissible), const Offset(500, 0));
// 8. Build the widget until the dismiss animation ends
await tester.pumpAndSettle();
// 9. Verify the item was removed
expect(find.text('Buy groceries'), findsNothing);
});
}
ライセンス: BSD-3-Clause(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- flutter
- リポジトリ
- flutter/skills
- ライセンス
- BSD-3-Clause
- 最終更新
- 不明
Source: https://github.com/flutter/skills / ライセンス: BSD-3-Clause
関連スキル
hugging-face-trackio
Trackioを使用してMLトレーニング実験を追跡・可視化できます。トレーニング中のメトリクスログ記録(Python API)、トレーニング診断のアラート発火、ログされたメトリクスの取得・分析(CLI)が必要な場合に活用してください。リアルタイムダッシュボード表示、Webhookを使用したアラート、HF Space同期、自動化向けのJSON出力に対応しています。
btc-bottom-model
ビットコインのサイクルタイミングモデルで、加重スコアリングシステムを搭載しています。日次パルス(4指標、32ポイント)とウィークリー構造(9指標、68ポイント)の2カテゴリーにわたる13の指標を追跡し、0~100のマーケットヒートスコアを算出します。ETFフロー、ファンディングレート、ロング/ショート比率、恐怖・貪欲指数、LTH-MVRV、NUPL、SOPR(LTH+STH)、LTH供給率、移動平均倍率(365日MA、200週MA)、週次RSI、出来高トレンドに対応します。市場サイクル全体を通じて買いと売りの両方の推奨を提供します。ビットコインの底値拾い、BTCサイクルポジション、買い時・売り時、オンチェーン指標、MVRV、NUPL、SOPR、LTH動向、ETFの流出入、ファンディングレート、恐怖指数、ビットコインが過熱状態か、マイナーコスト、暗号資産市場のセンチメント、BTCのポジションサイジング、「今ビットコインを買うべきか」「BTCが天井をつけているか」「オンチェーン指標は何を示しているか」といった質問の際にこのスキルを活用します。
protein_solubility_optimization
タンパク質の溶解性最適化 - タンパク質の溶解性を最適化します。タンパク質の特性を計算し、溶解性と親水性を予測し、有効な変異を提案します。タンパク質配列の特性計算、タンパク質機能の予測、親水性計算、ゼロショット配列予測を含むタンパク質エンジニアリング業務に使用できます。3つのSCPサーバーから4つのツールを統合しています。
research-lookup
Parallel Chat APIまたはPerplexity sonar-pro-searchを使用して、最新の研究情報を検索できます。学術論文の検索にも対応しています。クエリは自動的に最適なバックエンドにルーティングされるため、論文の検索、研究データの収集、科学情報の検証に活用できます。
tree-formatting
ggtree(R)またはiTOL(ウェブ)を使用して、系統樹の可視化とフォーマットを行います。系統樹を図として描画する際、ツリーレイアウトの選択、分類学に基づく枝やラベルの色付け、クレードの折りたたみ、サポート値の表示、またはツリーへのオーバーレイ追加が必要な場合に使用してください。系統推定(protein-phylogenyスキルを使用)やドメイン注釈(今後の独立したスキル)には使用しないでください。
querying-indonesian-gov-data
インドネシア政府の50以上のAPIとデータソースに接続できます。BPJPH(ハラール認証)、BOM(食品安全)、OJK(金融適正性)、BPS(統計)、BMKG(気象・地震)、インドネシア中央銀行(為替レート)、IDX(株式)、CKAN公開データポータル、pasal.id(第三者法MCP)に対応しています。インドネシア政府データを活用したアプリ開発、.go.idウェブサイトのスクレイピング、ハラール認証の確認、企業の法的適正性の検証、金融機関ステータスの照会、またはインドネシアMCPサーバーへの接続時に使用できます。CSRF処理、CKAN API使用方法、IP制限回避など、すぐに実行可能なPythonパターンを含んでいます。