Skip to content

テストとデバッグ

公開日:January 31, 2025更新日:January 31, 2025
FlutterDartCoding📄

アプリの開発において、テストとデバッグは非常に重要なプロセスです。テストを行うことで、アプリが仕様通りに動作することを確認し、バグを早期に発見できます。デバッグは、発見されたバグの原因を特定し、修正するプロセスです。

Flutterでは、主に以下のようなテスト手法が用いられます。

  • ユニットテスト
  • ウィジェットテスト
  • 統合テスト

また、Flutterには強力なデバッグツールが用意されており、効率的にデバッグ作業を行うことができます。

1. ユニットテストの実施

ユニットテストは、個々の関数やクラス(ユニット)が正しく動作することを確認するためのテストです。Flutterでは、flutter_test パッケージを使ってユニットテストを記述します。

1.1 flutter_testパッケージの利用

ユニットテストを記述するには、まず pubspec.yaml ファイルの dev_dependenciesflutter_test パッケージを追加する必要があります。

yaml
dev_dependencies:
  flutter_test:
    sdk: flutter
  flutter_lints: ^2.0.0

1.2 テストケースの作成

テストコードは、test ディレクトリに配置します。テストファイルのファイル名は、_test.dart で終わる必要があります。

例えば、_calculate メソッドのテストを記述する場合は、test/calculator_test.dart というファイルを作成します。

dart
import 'package:flutter_test/flutter_test.dart';
import 'package:my_app/main.dart'; // テスト対象のファイルをインポート

void main() {
  test('足し算のテスト', () {
    expect(_calculate(2, 3, '+'), 5);
    expect(_calculate(0, 0, '+'), 0);
    expect(_calculate(-2, 3, '+'), 1);
  });

  test('引き算のテスト', () {
    expect(_calculate(5, 3, '-'), 2);
    expect(_calculate(0, 0, '-'), 0);
    expect(_calculate(3, -2, '-'), 5);
  });

  test('掛け算のテスト', () {
    expect(_calculate(2, 3, 'x'), 6);
    expect(_calculate(0, 5, 'x'), 0);
    expect(_calculate(-2, 3, 'x'), -6);
  });

  test('割り算のテスト', () {
    expect(_calculate(6, 3, '/'), 2);
    expect(_calculate(5, 0, '/'), double.infinity);
    expect(_calculate(-6, 3, '/'), -2);
  });
}

test 関数を使って、テストケースを記述します。expect 関数を使って、実際の値と期待値を比較します。

1.3 アサーションによる検証

expect 関数は、アサーション(検証)を行うための関数です。第1引数に実際の値、第2引数に期待値を渡します。

dart
expect(actual, expected);

expect 関数には、さまざまなマッチャー(検証用の関数)を渡すことができます。例えば、以下のようなマッチャーがあります。

  • equals: 値が等しいことを検証する
  • isNot: 値が等しくないことを検証する
  • isA: 値が特定の型であることを検証する
  • throwsA: 関数が例外を投げることを検証する
  • isNull: 値がnullであることを検証する
  • isNotNull: 値がnullでないことを検証する
  • isEmpty: 値が空であることを検証する
  • isNotEmpty: 値が空でないことを検証する

1.4 テストの実行

テストを実行するには、ターミナルで以下のコマンドを実行します。

bash
flutter test

このコマンドにより、test ディレクトリ内のすべてのテストが実行されます。

2. ウィジェットテストの実施

ウィジェットテストは、ウィジェットのUIが正しく表示され、ユーザーの操作に正しく反応することを確認するためのテストです。ウィジェットテストでも、flutter_test パッケージを使用します。

2.1 testWidgets関数の利用

ウィジェットテストを記述するには、testWidgets 関数を使用します。testWidgets 関数は、WidgetTester オブジェクトを引数に取るコールバック関数を引数に取ります。

dart
testWidgets('Calculator ウィジェットのテスト', (WidgetTester tester) async {
  // テストコードを記述
});

2.2 ウィジェットの操作と検証

WidgetTester オブジェクトを使って、ウィジェットの操作や検証を行います。

例えば、Calculator ウィジェットのボタンをタップして、結果表示エリアのテキストを検証するテストは、以下のように記述できます。

dart
testWidgets('Calculator ウィジェットのテスト', (WidgetTester tester) async {
  // Calculator ウィジェットをビルド
  await tester.pumpWidget(const MaterialApp(home: Calculator()));

  // '7' のボタンをタップ
  await tester.tap(find.text('7'));
  await tester.pump();

  // 結果表示エリアのテキストが '7' であることを検証
  expect(find.text('7'), findsOneWidget);

  // '+' のボタンをタップ
  await tester.tap(find.text('+'));
  await tester.pump();

  // '8' のボタンをタップ
  await tester.tap(find.text('8'));
  await tester.pump();

  // 結果表示エリアのテキストが '8' であることを検証
  expect(find.text('8'), findsOneWidget);

  // '=' のボタンをタップ
  await tester.tap(find.text('='));
  await tester.pump();

  // 結果表示エリアのテキストが '15' であることを検証
  expect(find.text('15'), findsOneWidget);
});

tester.pumpWidget でウィジェットをビルドし、tester.tap でボタンをタップします。tester.pump で、ウィジェットの状態を更新します。find.text で、指定したテキストを持つウィジェットを検索します。expectfindsOneWidget を組み合わせて、ウィジェットが1つだけ存在することを検証します。

3. デバッグ方法

Flutterには、強力なデバッグツールが用意されています。ここでは、主なデバッグ方法について説明します。

3.1 デバッガの利用

VS CodeやAndroid StudioなどのIDEには、デバッガが組み込まれています。デバッガを使うと、コードの実行を一時停止したり、ステップ実行したり、変数の値を確認したりできます。

デバッグを開始するには、まずブレークポイントを設定します。ブレークポイントを設定するには、コードの行番号の左側をクリックします。

次に、IDEのデバッグボタンをクリックして、デバッグモードでアプリを実行します。

3.2 ブレークポイントの設定

ブレークポイントを設定すると、その行でコードの実行が一時停止します。ブレークポイントは、複数設定することができます。

3.3 ステップ実行

コードの実行が一時停止したら、ステップ実行を使って、コードを1行ずつ実行できます。ステップ実行には、以下の種類があります。

  • ステップオーバー: 現在の行を実行し、次の行に移動します。関数呼び出しがある場合、関数の中には入りません。
  • ステップイン: 現在の行を実行し、次の行に移動します。関数呼び出しがある場合、関数の中に入ります。
  • ステップアウト: 現在の関数の残りを実行し、関数の呼び出し元に戻ります。

3.4 変数の確認

コードの実行が一時停止しているときに、変数の値を確認できます。IDEのデバッグウィンドウに変数の値が表示されます。

3.5 ログの出力

print 関数を使って、ログを出力することもできます。ログは、コンソールウィンドウに表示されます。

dart
print('$_currentValue');

ただし、本番環境では print 関数は動作しないため、デバッグ目的でのみ使用してください。

4. Flutter DevTools

Flutter DevToolsは、Flutterアプリのデバッグとパフォーマンス分析のためのツールスイートです。DevToolsを使うと、以下のようなことができます。

  • ウィジェットツリーのインスペクション
  • レイアウトのデバッグ
  • パフォーマンスのプロファイリング
  • メモリ使用量の分析
  • ネットワークトラフィックの監視
  • ログの表示

DevToolsを使用するには、まずアプリをデバッグモードで実行します。次に、ターミナルで以下のコマンドを実行します。

bash
flutter pub global run devtools

またはVS Codeのコマンドパレットから「Dart: Open DevTools」を選択します。

ブラウザでDevToolsが開きます。

DevToolsの各タブで、アプリのさまざまな側面を調査できます。