📏

Flutter UnitTest

2023/03/18に公開

単体テストに入門してみた

個人開発をしていて、テストコードを書いていなかったことに疑問を持つようになった。今回は良いアプリを作りたいので、正規表現を使ってテストコードを書くことにした。
Dart Pad使ってビジネスロジックを考えることが多かったのですが、師匠のこんぶさんから、Flutterのプロジェクトのテストコードを書く場所でできるとのことで、やってみました。

メールアドレスのテストをしてみる

testディレクトリにロジックを定義した関数を持っているクラスを作成して、その後にファイル名にtestという名前が含まれているファイルを作成します。

こちらがテストコードです

test/test_class/auth/email_check.dart
// @が含まれているかチェックするテストコード
class EmailCheck {
  // 実行する関数
  static bool hasAtSymbol(String email) {
    final RegExp regex = RegExp(r'@');
    return regex.hasMatch(email);
  }
}

こちらはテストを実行するファイル
最初のは、@が含まれていないので、テストが失敗します!

test/unit_test/auth_check_test.dart
// ignore_for_file: prefer_const_declarations, unused_local_variable

import 'package:flutter_test/flutter_test.dart';

import '../test_class/auth/email_check.dart';

void main() {
  // チェックをする変数
  final email = 'hogehogeco.jp';
  final emailCheck = EmailCheck.hasAtSymbol(email);
  test('email pattern check', () {
    expect(email, 'hogehoge@co.jp');
  });
}

実行結果
expectの右側に成功結果の値を書くのですが、hogehogeco.jpには、@が含まれていないので、エラーが発生しました!

Expected: 'hogehoge@co.jp'
  Actual: 'hogehogeco.jp'
   Which: is different.
          Expected: hogehoge.jp
            Actual: hogehogeco.jp
                            ^
           Differ at offset 8

package:test_api                                    expect

期待すること:「hogehoge@co.jp」。
実際のところ、「hogehogeco.jp」。
Which:が違う。
予想: hogehoge@co.jp
実際:hogehogeco.jp
^
オフセット8で異なる

package:test_api 期待する

@をつけて実行
先ほどは、@がついていなかったのでテストに失敗しましたが、今回は@がメールアドレスに含まれていたので、テストの結果と一致したのでテストが通って成功しました。

パスワードのチェックもテストしてみる

メールアドレスをやるなら、パスワードのチェックもやるべきなので書いてみました。
最初は一致してるので成功しますが、内容が違うとテストに失敗します。

失敗しましたね。入力フォームで使ってみて動作を確認しないと、こちらのコードだとあまり意味がないなと思いますが、テストを書くのは大事だなと普段から意識するようになるきっかになります。

追加したテストコード

test/test_class/test_class/password_check.dart
// パスワードが6桁以上で、アルファベットと数字がそれぞれ少なくとも1つ含まれているかどうかをチェックする
class PasswordCheck {
  static bool isPasswordValid(String password) {
    final RegExp regex = RegExp(r'^(?=.*[a-zA-Z])(?=.*\d).{6,}$');
    return regex.hasMatch(password);
  }
}
test/test_class/auth/auth_check_test.dart
// ignore_for_file: prefer_const_declarations, unused_local_variable

import 'package:flutter_test/flutter_test.dart';

import '../test_class/auth/email_check.dart';
import '../test_class/auth/password_check.dart';

void main() {
  // チェックをする変数
  final email = 'hogehoge@co.jp';// 仮のメールアドレス
  final emailCheck = EmailCheck.hasAtSymbol(email);
  test('email pattern check', () {
    expect(email, 'hogehoge@co.jp'); // 右側にテストの成功結果を書く
  });

  final password = 'xe056';// 仮のパスワード
  final passwordCheck = PasswordCheck.isPasswordValid(password);
  test('password pattern check', () {
    expect(password, 'xe056477'); // 右側にテストの成功結果を書く
  });
}

最後に

いいコードを書きたいと思っていると、やはりテストコードは書かないといけないなと思いました。テストコードを書くきっかけを作ってくれたのは、Flutter別荘の合宿に参加してくれた、いおりさんというエンジニアの影響ですね。これからは、テストも書きながら開発をしていきたいと意識するようになりました。

Flutter大学

Discussion