2023.11.17

System.assertEqualsはもう古い?

はじめに

Winter'23のリリースでAssert Classが導入されたことをご存知でしょうか?
このAssert Classはテストクラスで使用するものであり、これまで皆さんが使用していたSystemクラスのAssertメソッドやAssertEqualsメソッドと同様に、テストクラス内で結果を検証するためのメソッドが含まれています。

そしてなんとリリースノートには次の記載があり、既存のアサーションメソッドを新しいAssert Classに置き換えることが推奨されています。
チェックする条件に正確に適合する新しい System.Assert クラスのアサートメソッドを使用して、Apex コードを読みやすくします。既存の System クラスのアサートメソッドは引き続きサポートされます。ただし、すぐに新しいメソッドの使用を開始し、既存のコードを更新してそれらを使用することをお勧めします。
今回追加されたAssert Classはこれまで使用されていたテストメソッドと何が異なるのでしょうか。

新旧アサーションメソッドの比較

追加されたアサーションメソッドのうち、個人的に使用頻度が高いと思われるメソッドと同様の検証を実施する既存のメソッドを3点ピックアップし、記述方法と結果を比較をしてみました。
※2023年11月時点の情報で作成しています。

(1)同値であるかを検証

新/旧 記述方法 エラーメッセージ
 旧  System.assertEquals(expected, actual, 'msg'); System.AssertException: Assertion Failed: msg: Expected: expected, Actual: actual
 新  Assert.areEqual(expected, actual, ‘msg’); System.AssertException: Assertion Failed: msg: Expected: expected, Actual: actual
●結果
使用クラス、メソッドは異なるものの、引数やエラーメッセージに差異は見られませんでした。

(2)処理の成否を検証

新/旧 記述方法 エラーメッセージ
 旧  System.assert(false, 'msg'); System.AssertException: Assertion Failed: msg
 新  Assert.fail('msg'); System.AssertException: Assertion Failed: アサーションに失敗しました: msg
●結果
記述方法が異なりますが、新旧メソッドにおいてエラーメッセージに差異は見られませんでした。
テストコードを記述もしくは解読する際には新しいメソッドの方が検証内容を理解しやすく感じます。

(3)インスタンスが同一かを検証

新/旧 記述方法 エラーメッセージ
 旧  Object obj = new Account();
System.assert(obj instanceof Case, 'msg');
System.AssertException: Assertion Failed: msg
 新 
Object obj = new Account();
Assert.isInstanceOfType(obj, Case.class, 'msg');
System.AssertException: Assertion Failed: 指定されたオブジェクトはクラス Case のインスタンスではありません: msg
●結果
新メソッドでは検証したい値が第一引数となり、他のテストメソッドとは順序が異なります。
また、新メソッドの方がエラーメッセージがより詳細に出力されていて多少分かりやすい印象です。

null判定時のエラーメッセージの改善

新しいメソッドでは特にnull値を検証する際の判定結果が分かりやすくなっているようです。
新/旧 記述方法 エラーメッセージ
 旧  System.assertEquals(null, 'null', 'msg'); System.AssertException: Assertion Failed: Expected: null, Actual: null
 新  Assert.isNull('null', 'msg'); System.AssertException: Assertion Failed: 非 null 値を使用してアサートされた Null 可能オブジェクト: msg
旧メソッドの例外の結果としては正しいですが、エラーメッセージ上は想定の値(Expected)と実際の値(Actual)は同じように見えるため、一見実行結果が正しいと錯覚しかねません。
このように旧メソッドの結果からはnull値 と 文字列の'null'との関係が曖昧​で分かりづらくなっています。

それが新メソッドを使用することで、null値であることを明示的に表現するエラーメッセージになっており、曖昧な表現が改善されていることが分かるかと思います。

※補足
null値 と 文字列の'null'を判定するのは非常に稀なケースであり、その限られたケースでのエラーメッセージは便利ですが、一方で既存のエラーメッセージのように実際の値を見ることはできなくなっています。
そのため、新しいメソッドでは次のように記述することをおすすめします。

Assert.isNull(actualValue, '実際の値: ' + actualValue);

ぜひ参考にしてみてください。

まとめ

今回はテストクラスの新旧メソッドについて調査してみました。
リリースノートではこれまでのテストメソッドを新しいテストメソッドに置き換えることが推奨されていましたが、個人的な感想としては既存のテストコードをリファクタリングするに値するメリットは感じなかったというのが正直な感想です。
新メソッドの内容は既存のテストクラスで代替可能な機能であるため、新規作成時に取り入れてみるのが良いのではないでしょうか。

これからもより良いテスト作りを目指していきましょう!
25 件
     
  • banner
  • banner

関連する記事