【Flutter】ユニットテストの方法 | ヒヨコ プログラミング(ヒヨプロ)

【Flutter】ユニットテストの方法

Flutter

本記事では、Flutter でのユニットテスト(単体テスト)の方法について紹介します。

ユニットテストとは?

特定の関数やクラスなどの最小単位(ユニット)が独立して正しく動作しているかどうかを検証するテストです。ユニットテストを導入することで、コードの品質向上やバグの早期発見が可能になります。

ユニットテストの事前準備

パッケージのインストール

下記コマンドをターミナルに入力して、flutter_test パッケージをインストールします。

flutter pub add dev:test

テストファイルの用意

テスト対象のファイルとテスト自体のファイルを用意します。
今回は、例として、テスト対象のファイルである lib/calculator.dart と、テスト自体のファイルである test/calculator_test.dart を用意します。
このように、テスト自体のファイルは、test フォルダの中に作成します。

ユニットテストの実装方法

準備が整ったら、ユニットテストを実装していきましょう。
今回用意したテスト対象のファイルは以下のようになっています。そのため、Calculator クラスの add() メソッドを例にユニットテストを書いていきます。

class Calculator {
  static int add(int a, int b) {
    return a + b;
  }
}

基本の形

テスト実装の基本の形は以下のようになっています。
まず、テストしたい処理を実行します。次に、実行結果を検証し、正しく動作しているか確認する流れとなっています。
各テストには、テストの名前を設定します。どういったテストなのかわかるような名前にしておくと良いです。

test('テスト名', () {
  // テストしたい処理を実行
  …

  // 期待される結果と実際の結果を検証
  …
});

テスト実装例

今回の lib/calculator.dart のテスト実装例は、以下のようになっています。

import 'package:flutter_test/flutter_test.dart';
import 'package:sample_project/calculator.dart';

void main() {
  test('addメソッドが正しい和を出すかの確認', () {
    // テストしたい処理を実行
    final result = Calculator.add(2, 5);

    // 期待される結果と実際の結果を検証
    expect(result, 7);
  });
}

テストのグループ化

関連する一連のテストは、group() を使ってグループ化することができます。
グループ化することで、テストの構造が整理されて可読性が向上します。

import 'package:flutter_test/flutter_test.dart';
import 'package:sample_project/calculator.dart';

void main() {
  group('Calculator tests', () {
    test('addメソッドが正しい和を出すかの確認(正+正)', () {
      // テストしたい処理を実行
      final result = Calculator.add(2, 5);

      // 期待される結果と実際の結果を検証
      expect(result, 7);
    });

    test('addメソッドが正しい和を出すかの確認(負+負)', () {
      // テストしたい処理を実行
      final result = Calculator.add(-1, -3);

      // 期待される結果と実際の結果を検証
      expect(result, -4);
    });
  });
}

テストの前後処理

各テストの実行前後に必要な初期化やクリーンアップ処理は、以下のメソッドを使用することでコードの重複を減らし、効率的に管理できます。

  • setUp()
    各テストケースが実行される前に、共通の準備作業を行うための関数です。例えば、オブジェクトの初期化、モックデータのセットアップ、ファイルやリソースの読み込みなど、個々のテストケースに必要な処理をここで行います。
  • setUpAll()
    全てのテストの実行前に実行される、共通の準備作業を行うための関数です。非常にコストのかかる初期化処理や、全てのテストで共通の前処理を行いたい場合に便利です。
  • tearDown()
    各テストケースの実行後に、共通のクリーンアップ作業を行うための関数です。例えば、テスト中に生成されたリソースを解放したり、モックオブジェクトの状態をリセットしたりします。
  • tearDownAll()
    全てのテストケースの実行後に、共通のクリーンアップ作業を行うための関数です。非常にコストのかかるクリーンアップ処理や、全てのテストで共通の後処理を行いたい場合に便利です。

上記のメソッドの使用例を以下に示します。

void main() {
  Database database;

  // 全てのテスト前に1回だけデータベース接続を初期化
  setUpAll(() {
    database = Database();
    database.connect();
  });

  // 各テスト前にデータベースにテストデータを挿入
  setUp(() {
    database.insert('Test Data');
  });

  // 各テスト後にデータベースのデータをクリア
  tearDown(() {
    database.clear();
  });

  // 全てのテスト終了後に1回だけデータベース接続をクローズ
  tearDownAll(() {
    database.disconnect();
  });

  test('Database contains test data', () {
    // テストデータが挿入されていることを確認
    expect(database.contains('Test Data'), isTrue);
  });

  test('Fetch all data', () {
    // データベースに挿入されたデータが正しいことを確認
    expect(database.fetchAll(), ['Test Data']);
  });
}

テストの実行方法

以下の緑のボタンを押下すると、各テストを実行できます。
main の左横の緑ボタン:main 内に記載のテスト全てを実行
group の左横の緑ボタン:group 内に記載のテスト全てを実行
test の左横の緑ボタン:その test だけを実行

ユニットテストの実行方法

また、test フォルダを右クリックしたときに表示される「Run ‘tests in test’」から全てのテストを実行することもできます。

テスト全部の実行方法

まとめ

今回は、Flutter におけるユニットテストの方法について紹介しました!

  • flutter_test パッケージでユニットテストが可能
  • テストしたい処理を実行し、その結果と期待結果を検証
  • group() でテストのグループ化が可能
  • setUp()、setUpAll()、tearDown()、tearDownAll()でテストの前後処理を効率的に管理可能

以上で、【Flutter】ユニットテストの方法 は終わりです。

参考

おすすめ書籍

コメント

タイトルとURLをコピーしました