Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ユーザーのアクションを伴うWidgetのGoldenTest

Avatar for teamLab teamLab PRO
November 12, 2025

 ユーザーのアクションを伴うWidgetのGoldenTest

このスライドはFlutterKaigi 2025の登壇に使用したスライドのアーカイブになります。

チームラボでは、Flutterエンジニアを募集しています。
少しでも、チームラボにご興味をお持ち頂けましたら、採用ページをご覧頂けますと幸いです。
https://www.team-lab.com/recruit/

FlutterKaigi 2025とは
エンジニアが主役のFlutterカンファレンス。Flutter開発者有志による実行委員会が主催し、Flutter技術情報の共有とコミュニケーションを目的としている。
https://2025.flutterkaigi.jp/

Avatar for teamLab

teamLab PRO

November 12, 2025
Tweet

More Decks by teamLab

Other Decks in Programming

Transcript

  1. FlutterでのGoldenTest flutter_testでのGoldenTestの記述 testWidgets('HomePage VRT', (WidgetTester tester) async { // 描画

    await tester.pumpWidget( MaterialApp( theme: ThemeData(fontFamily: 'NotoSans'), home: const MyHomePage(title: 'title'), ), ); // 確認 await expectLater(find.byType(MyHomePage), matchesGoldenFile('goldens/my_home_page.png')); }); ※import・フォントの読み込み・画面サイズは省略
  2. Scrollが必要なGoldenTest Scrollが必要なGoldenTestの記述 testWidgets('ListPage section4', (WidgetTester tester) async { await tester.pumpWidget(...);

    // 描画 final targetFinder = find.text('セクション 4'); // 4番目のセクションを探す await tester.scrollUntilVisible( targetFinder, 200.0, ); // 該当箇所までスクロール await tester.pumpAndSettle(); // 安定するまで待つ await expectLater(find.byType(ListPage), matchesGoldenFile('goldens/scroll_list_page.png')); // 確認 });
  3. Scrollが必要なGoldenTest Scrollが必要なGoldenTestの記述:Sliver(ListView / GridView)を利用する場合のテスト失敗① testWidgets('ListPage section30', (WidgetTester tester) async {

    await tester.pumpWidget(...); // 描画 final targetFinder = find.text('セクション 30'); // 30番目のセクションを探す await tester.scrollUntilVisible( targetFinder, 200.0, ); // 該当箇所までスクロール await tester.pumpAndSettle(); // 安定するまで待つ await expectLater(find.byType(ListPage), matchesGoldenFile('goldens/scroll_list_page.png')); // 確認 }); Bad state: No element
  4. Scrollが必要なGoldenTest Scrollが必要なGoldenTestの記述:Sliver(ListView / GridView)を利用する場合のテスト成功 testWidgets('ListPage section30', (WidgetTester tester) async {

    await tester.pumpWidget(...); // 描画 final targetFinder = find.text('セクション 30'); // 30番目のセクションを探す await tester.scrollUntilVisible( targetFinder, 200.0, maxScrolls: 100, ); // 該当箇所までスクロール await tester.pumpAndSettle(); // 安定するまで待つ await expectLater(find.byType(ListPage), matchesGoldenFile('goldens/scroll_list_page.png')); // 確認 });
  5. Scrollが必要なGoldenTest testWidgets('ListPage section last', (WidgetTester tester) async { await tester.pumpWidget(...);

    // 描画 final targetFinder = find.textContaining('セクション'); // セクションを探す await tester.scrollUntilVisible( targetFinder, 200.0, ); // 該当箇所までスクロール await tester.pumpAndSettle(); // 安定するまで待つ await expectLater(find.byType(ListPage), matchesGoldenFile('goldens/scroll_list_page.png')); // 確認 }); Bad state: Too many elements Scrollが必要なGoldenTestの記述:Sliver(ListView / GridView)を利用する場合のテスト失敗②
  6. Scrollが必要なGoldenTest testWidgets('ListPage section last', (WidgetTester tester) async { await tester.pumpWidget(...);

    // 描画 final targetFinder = find.byKey(ValueKey('セクション30')); // セクションを探す await tester.scrollUntilVisible( targetFinder, 200.0,   maxScrolls: 100, ); // 該当箇所までスクロール await tester.pumpAndSettle(); // 安定するまで待つ await expectLater(find.byType(ListPage), matchesGoldenFile('goldens/scroll_list_page.png')); // 確認 }); Scrollが必要なGoldenTestの記述:Sliver(ListView / GridView)を利用する場合のテスト成功