Flutterでは、ウィジェットや画面の見た目が意図せず変わっていないかを確認するために、Golden Testを利用できます。
flutter_test_goldens は、FlutterのGolden Testをより扱いやすくするためのツールキットです。
単純なスクリーンショット比較だけではなく、複数のGolden画像をまとめて確認するギャラリーや、アニメーション・ユーザー操作の状態を記録するタイムラインなど、より高度なGolden Testを構築できます。
flutter_test_goldensとは
は、FlutterでGolden Testを書くためのツールキットです。flutter_test_goldens
Golden Testでは、ウィジェットを描画した結果を画像として保存し、後から実行した結果と比較することで、UIに意図しない変更が発生していないか確認できます。
では、従来のGolden Testを拡張し、複数の状態をまとめて確認したり、アニメーションの途中経過を記録したりできます。flutter_test_goldens
現在のバージョンは 0.1.0 です。
主な特徴
| 機能 | 内容 |
|---|---|
| Single Shot Galleries | 複数のGolden画像をギャラリーとして確認 |
| Multi-Golden Galleries | 複数のGoldenをまとめて扱える |
| Magazine Galleries | 複数のUI状態を一覧で確認 |
| Animation Timelines | アニメーションの状態をタイムラインとして記録 |
| Interaction Timelines | ユーザー操作による状態変化を記録 |
| FlutterCamera | ウィジェットの状態を撮影 |
| FlutterScreenshot | スクリーンショットを取得 |
| ScreenshotCollection | 複数のスクリーンショットを管理 |
| FakeScreen | テスト用の画面環境を構築 |
| PixelSnap | ウィジェットのピクセル位置を調整 |
| Font loading | Golden Test用のフォント読み込み |
| Failure Scenes | Golden Test失敗時の状態を確認 |
| Metadata | Golden Sceneにメタデータを保存 |
基本的な使い方
まず、開発用依存関係に flutter_test_goldens を追加します。
YAML
dev_dependencies:
flutter_test_goldens: any
その後、Golden Testを作成します。
Dart
import 'package:flutter_test_goldens/flutter_test_goldens.dart';
void main() {
testGoldenScene("my golden test", (tester) async {
// Golden Testを実装
});
}
testGoldenScene()を利用することで、Golden Sceneとしてテストを定義できます。
Golden Scene
flutter_test_goldensでは、Golden Testを「Scene」として扱うことができます。
単純に1枚の画像を比較するだけではなく、テスト対象のUIや状態をまとめて扱えるのが特徴です。
例えば、同じウィジェットについて以下のような状態をGoldenとして確認できます。
- 初期状態
- ボタンを押した状態
- フォーカスされた状態
- エラー状態
- アニメーション中の状態
- 複数の画面サイズでの状態
UIの状態が多いアプリでは、通常のGolden Testだけで管理するよりもテスト結果を整理しやすくなります。
Galleryで複数の状態を確認
Galleryを利用すると、複数のGoldenをギャラリーとしてまとめて扱えます。
例えば、コンポーネントの状態を一覧化するようなテストに利用できます。
Dart
Gallery(
children: [
// テスト対象のWidget
],
);
ボタンやフォームなど、状態によって見た目が変わるUIコンポーネントの確認に向いています。
Animation Timeline
flutter_test_goldensでは、アニメーションの状態をタイムラインとして扱うこともできます。
通常のGolden Testでは、特定の時点におけるUIを画像として比較するケースが一般的です。
Animation Timelineを利用すると、アニメーションの進行に伴うUIの変化を確認できます。
例えば、以下のようなUIのテストに利用できます。
- ページ遷移
- ダイアログの表示
- 展開・折りたたみアニメーション
- ローディングアニメーション
- UIコンポーネントのアニメーション
Interaction Timeline
ユーザー操作によるUIの変化をテストするためのInteraction Timelineも用意されています。
例えば、
- 画面を表示
- ボタンをタップ
- UIが変化
- 別のボタンをタップ
- 表示内容が変化
といった一連の操作をテスト対象として扱えます。
インタラクティブなUIでは、最終状態だけではなく操作途中の状態も重要になるため、このようなテスト方法が役立ちます。
FlutterCamera
FlutterCameraは、GalleryなどでFlutterのUIを撮影するために利用できます。
Golden Testでは、テスト対象のウィジェットを決められた環境で描画し、その結果を画像として比較します。
FlutterCameraを利用することで、撮影対象となるUIを扱いやすくできます。
FlutterScreenshot
FlutterScreenshotは、Flutterの画面をスクリーンショットとして扱うための機能です。
スクリーンショットを単純に1枚だけ扱うのではなく、ScreenshotCollectionと組み合わせて複数のスクリーンショットを管理できます。
ScreenshotCollection
ScreenshotCollectionでは、複数のスクリーンショットをコレクションとして扱えます。
複数のUI状態をGoldenとして管理する場合に利用できます。
FakeScreen
FakeScreenは、Golden Testでテスト用の画面環境を構築するための機能です。
実際のアプリ画面とは分離して、テストに必要な画面状態を再現できます。
PixelSnap
flutter_test_goldensには、ピクセル単位の位置調整を行うためのPixelSnap関連ウィジェットも用意されています。
代表的なものとして以下があります。
PixelSnapCenterPixelSnapColumnPixelSnapFlexPixelSnapRowPixelSnapAlign
Golden Testでは、わずかなピクセル位置の違いが画像比較の差分になることがあります。
PixelSnapを利用することで、ウィジェットの配置をピクセル境界に合わせることができます。
フォントの読み込み
Golden Testでは、フォントの違いによって画像比較の結果が変わる場合があります。
flutter_test_goldensでは、アプリで使用するフォントをテスト環境に読み込むための機能が用意されています。
例えば、loadAppFonts()を利用できます。
Dart
await loadAppFonts();
テスト全体でフォントを読み込む場合は、flutter_test_config.dartを利用できます。
Dart
import 'dart:async';
import 'package:flutter_test_goldens/flutter_test_goldens.dart';
Future<void> testExecutable(
FutureOr<void> Function() testMain,
) async {
await loadAppFonts();
await testMain();
}
これにより、Golden Test実行時にアプリで使用するフォントを読み込めます。
Golden Test失敗時の確認
Golden Testでは、期待する画像と実際に生成された画像に差分があるとテストが失敗します。
flutter_test_goldensでは、失敗時の情報を確認しやすくするためのFailure Sceneや詳細なFailure Reportが用意されています。
また、Golden SceneのメタデータをPNGに保存する機能もあります。
これにより、単純な画像比較だけでは確認しにくいテスト情報を扱いやすくできます。
Golden画像の抽出
flutter_test_goldensには、Golden Sceneから画像を抽出するためのCLIも用意されています。
まずCLIを有効化します。
Bash
dart pub global activate flutter_test_goldens
Golden Sceneの抽出は以下のコマンドで実行できます。
Bash
golden-scene extract [scene/file/path.png]
実際に画像を生成せず、処理内容だけ確認したい場合は--dry-runを利用できます。
Bash
golden-scene extract --dry-run [scene/file/path.png]
GitHub Actionsとの組み合わせ
Golden TestはCI環境でも実行できます。
例えば、GitHub ActionsからFlutterのテストを実行することで、Pull RequestなどでUIの変更を検出できます。
Bash
flutter test test_goldens
Golden Testが失敗した場合のPNGをCIのArtifactとして保存する構成にもできます。
これにより、コード変更によってUIに差分が発生していないかを開発チームで確認できます。
どのような場面で使える?
flutter_test_goldensは、特にUIの状態が多いFlutterアプリで利用しやすいパッケージです。
UIコンポーネントの確認
ボタン、カード、フォームなど、状態によって見た目が変化するコンポーネントをまとめてテストできます。
デザイン変更の検出
アプリのUIを変更した際に、意図しない見た目の変更が発生していないか確認できます。
アニメーションの確認
Animation Timelineを利用することで、アニメーションを含むUIの状態をテストできます。
インタラクションの確認
Interaction Timelineを利用して、ユーザー操作によって変化するUIを確認できます。
CIでのUIテスト
Flutter Testと組み合わせてCI上でGolden Testを実行し、UIの回帰を検出できます。
まとめ
flutter_test_goldens は、FlutterのGolden Testを拡張するためのツールキットです。
単純な画像比較だけではなく、
- Golden Scene
- Gallery
- Animation Timeline
- Interaction Timeline
- FlutterCamera
- FlutterScreenshot
- ScreenshotCollection
- FakeScreen
- PixelSnap
- フォント読み込み
- Failure Scene
- 詳細なFailure Report
- Golden Sceneのメタデータ
など、UIテストを整理するための機能が用意されています。
特に、画面やUIコンポーネントの状態が多いFlutterアプリでは、Golden Testをより体系的に管理するための選択肢となるパッケージです。

