はじめに
こんにちは。アメリカに住みながら独学でエンジニアを目指しているTairaです。
テストを記述する際、assert_equal
と assert_match
という2つのアサーションを使う場面があります。
どちらも文字列(や数値など)に対してチェックを行う目的で使われますが、それぞれの使い方と目的は異なります。
以下では、Rails のテストフレームワーク(Minitest)を想定して、この2つのアサーションの違いについて説明します。
assert_equal(expected, actual)
-
完全一致かどうかを確認する
-
expected
(期待値) とactual
(実際の値)が等しいことをテストします。 - 等しいかどうかの判定には、Ruby における
==
演算子が使われます。
-
-
利用例
- 文字列や数値、配列など、「まったく同じ値かどうか」を比較したい場合に使います。
- 例えば、コントローラのアクションから返された値や、モデルの属性の値などが所望の値になっているかどうかをテストする際に便利です。
# 例: テストの一部
assert_equal "Hello", my_method # my_methodの戻り値が"Hello"であることを確認
assert_equal 100, my_number # my_numberが100であることを確認
assert_match(matcher, string)
-
部分一致かどうかを確認する
-
matcher
が正規表現や文字列の場合に、string
がそのパターンとマッチするかどうかをテストします。 - 一致とは「部分一致」でも良いため、全文が厳密に同じである必要はありません。
-
-
利用例
- 「メール本文やレスポンス本文に、特定の文字列が含まれているか」を簡単に確認したいときに便利です。
- たとえば、メール本文にパスワードリセット用のトークンが含まれているかどうかなど、ピンポイントで確認できます。
# 例: テストの一部
assert_match /Hello/, some_string # some_stringが"Hello"を含むか(正規表現)
assert_match "Hello", some_string # some_stringが"Hello"を含むか(単なる文字列)
使い分けのポイント
-
厳密に一致を求める場合(数値が正しいか、文字列が完全一致か確認したい場合など)は
assert_equal
を使いましょう。 -
部分一致や含まれているかどうかを確認したい場合、または 「正規表現でパターンマッチを行いたい場合」 は
assert_match
を使いましょう。
例
-
パスワード再設定メールのテスト
- 件名や送信先メールアドレスのように、決まった文字列をチェックしたい場合は
assert_equal
が便利。 - メール本文に含まれるトークンやURLをテストしたい場合は、メール本文が長いので全文を比較するのではなく、必要なキーワードが含まれているかを
assert_match
で確認するのが簡単です。
- 件名や送信先メールアドレスのように、決まった文字列をチェックしたい場合は
まとめ
-
assert_equal
: 値そのものが完全に一致しているかをテスト。厳密な一致判定。 -
assert_match
: 特定のパターン(文字列 or 正規表現)を文字列が含んでいるかをテスト。部分一致でもOK。
テストでは、何をどの程度チェックしたいのかに応じて、使い分けることが大切です。全く同じ文字列を期待するなら assert_equal
、含まれていればOKなら assert_match
を使えば、わかりやすいテストを実装できます。