🐥

【Flutter】ユニットテストを学ぶ

に公開

はじめに

プログラムを書いているとき、「このコードは本当に正しく動くのかな?」と思ったことはありませんか?機能を追加したり、既存の機能を変更したりするとき、アプリが引き続き正常に動作することを確認するには、テストを書くことが大切です。

この記事では、ユニットテストを書く方法をメモとして記しておきます。

参考

https://docs.flutter.dev/cookbook/testing/unit/introduction

1. テスト用のパッケージを追加する

まずは、テストに必要なパッケージを追加しましょう。Flutter でテストを書くには、testパッケージを使います。

ターミナルで以下のコマンドを実行します:

flutter pub add dev:test

このコマンドは、testパッケージを開発時のみ使う依存関係として追加します。

2. テストファイルを作成する

次に、テスト対象のクラスとテストファイルを作成します。

この例では、次の 2 つのファイルを作成します:

  • lib/counter.dart - テスト対象のクラスを含むファイル
  • test/counter_test.dart - テスト自体を含むファイル

フォルダ構造は以下のようになります:

counter_app/
  lib/
    counter.dart
  test/
    counter_test.dart

3. テスト対象のクラスを作成する

では、テスト対象となる「ユニット」を作成します。今回は、lib/counter.dartファイルの中にCounterクラスを作成します。

このクラスは、0 から始まる値を増やしたり減らしたりする機能を持ちます:

https://github.com/muranakar/flutter_unit_test/blob/main/lib/counter.dart#L1-L7

4. クラスのテストを書く

test/counter_test.dartファイルの中に、最初のユニットテストを書きましょう。

テストはtest関数を使って定義し、結果が正しいかどうかをexpect関数でチェックします。これらの関数は両方ともtestパッケージから提供されています。

// testパッケージとCounterクラスをインポート
import 'package:counter_app/counter.dart';
import 'package:test/test.dart';

void main() {
  // テストケースを定義
  test('Counterの値が増加するべき', () {
    // テスト用のCounterインスタンスを作成
    final counter = Counter();

    // テスト対象のメソッドを実行
    counter.increment();

    // 期待される結果と実際の結果を比較
    expect(counter.value, 1);
  });
}

このテストは、Counterクラスのincrementメソッドが値を 1 増やすことを確認しています。

5. 複数のテストをグループ化する

関連するテストを一緒に実行したい場合は、group関数を使ってテストをグループ化できます。

以下のように、複数のテストケースをグループ化してみましょう:

https://github.com/muranakar/flutter_unit_test/blob/main/test/counter_test.dart#L1-L23

このようにグループ化することで、関連するテストを一度に実行できます。

6. テストを実行する

これでテストを実行する準備ができました。テストを実行する方法はいくつかあります。

VSCode でテストを実行

  1. counter_test.dartファイルを開く
  2. 赤枠の虫アイコンを押す
  3. 「実行とデバッグを開始」を選択

F5 のショートカットにより、実行することも可能。

ファイル内容のテストコードの横のチェックアイコンを押すことでも、実行可能です。

ターミナルでテストを実行する

ターミナルからテストを実行することもできます。プロジェクトのルートディレクトリから以下のコマンドを実行します:

flutter test test/counter_test.dart

特定のグループのテストだけを実行したい場合は、以下のようにします:

flutter test --plain-name "カウンターのテスト"

テストコマンドのヘルプを表示するには:

flutter test --help

テストの基本的な考え方

ユニットテストを書くときは、次のような流れで考えるとわかりやすいです:

  1. 準備(Arrange): テストに必要なオブジェクトを準備します
  2. 実行(Act): テスト対象のメソッドを実行します
  3. 検証(Assert): 結果が期待通りかどうかを確認します

この「準備・実行・検証」の流れは、テストを書く際の基本的なパターンとして覚えておくと役立ちます。

// 準備(Arrange)
final counter = Counter();

// 実行(Act)
counter.increment();

// 検証(Assert)
expect(counter.value, 1);

まとめ

この記事では、Flutter でユニットテストを始める方法を紹介しました。ユニットテストを書くことで、アプリの品質を高め、バグを早期に発見できます。

基本的な手順をおさらいしましょう:

  1. テスト用のパッケージを追加する
  2. テストファイルを作成する
  3. テスト対象のクラスを作成する
  4. クラスのテストを書く
  5. 複数のテストをグループ化する
  6. テストを実行する

小さなテストから始めて、徐々にテストの範囲を広げていきましょう。

サンプルコード

https://github.com/muranakar/flutter_unit_test

Discussion