【Flutter】テストについて

はじめに

Flutterのテストについて書いていこうと思います。テストを書いておくと、仕様通りの動作が、現在のコードで正常に動作することを担保できるようになります。(テストがただしければ)
またテストの自動化を行っておくことで、1箇所の修正内容が他の箇所に影響していないかなど全体的にチェックすることもできます。

Flutterのテストの種類

Flutterには3種類のテストがあります。

  • 単体テスト

  • Widgetテスト

  • 統合テスト

以下、公式にあるテストの特徴になります。

テストの特徴

単体テスト

単体テストでは、メソッドやクラスについてテストをします。
単体テストをすることで、その処理が予想通りになっているかをテストすることができます。
小さな処理をどんどんテストしていくことにより、テストした処理は考慮せずにより上位のテストを行っていくことができます。
また、外部に依存している処理(DBからデータを取得する処理など)を含んでいるユースケースなどは、モックパッケージ(mockitなど)を利用しながらテストすることができます。

widgetテスト

Widgetテストはプロジェクトを作成後のサンプルプログラムの中に例が含まれています。

// This is a basic Flutter widget test.
//
// To perform an interaction with a widget in your test, use the WidgetTester
// utility in the flutter_test package. For example, you can send tap and scroll
// gestures. You can also use WidgetTester to find child widgets in the widget
// tree, read text, and verify that the values of widget properties are correct.

import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';

import 'package:flutter_study/main.dart';

void main() {
  testWidgets('Counter increments smoke test', (WidgetTester tester) async {
    // Build our app and trigger a frame.
    await tester.pumpWidget(const MyApp());

    // Verify that our counter starts at 0.
    expect(find.text('0'), findsOneWidget);
    expect(find.text('1'), findsNothing);

    // Tap the '+' icon and trigger a frame.
    await tester.tap(find.byIcon(Icons.add)); // widgetがタップされている
    await tester.pump();

    // Verify that our counter has incremented.
    expect(find.text('0'), findsNothing); 
    expect(find.text('1'), findsOneWidget); // タップで表示内容が変化したかテスト
  });
}

widgetのテストでは画面内にあるWidgetの表示や動作についてテストします。
widgetインスタンスを生成して、そのwidgetが操作された場合の変化をテスト内で起こして、表示内容のテストなどをすることができます。

結合テスト

結合テストは、全体的にwidgetや内部処理が予想通りに動作しているかをテストします。テストは、実機もしくはエミュレータで実行されます。
パッケージにflutter_driverが必要になります。
ビジネスロジックやユーザーインターフェースのテストを自動化できて、操作のユースケースをテストすることができます。

おわりに

今回はFlutterのテストについて書きました。
適切なテストを増やして、動作を担保できるようにしていくことで品質向上や変更に強くなると思います。
テストを行いやすいようなクラスの分け方や、テスト開発駆動なども勉強していきたいです。


この記事が気に入ったらサポートをしてみませんか?