Truthのメリット、特徴について

TruthはGoogleが開発をしているテストアサーションライブラリです。

従来のJUnitスタイルのアサーションに比べ、大きく2つの利点があります。

それぞれについて説明していきます。

readableにアサーションが書ける

ドキュメントのbenefitにあるサンプルを取り上げ説明します。 http://google.github.io/truth/benefits

まず従来のJUnitスタイルを使って書きます。

Optional<String> middleName = user.getMiddleName();
assertFalse(middleName.isPresent());

assertFalse、isPresentを使っており、否定のアサーションなので直感的でなく理解するのに少し時間がかかります。(個人差はあります)

これがTruthを使うと次のようになります。

Optional<String> middleName = user.getMiddleName();
assertThat(middleName).isAbsent();

assertThatはTruthに定義されているメソッドです。middleNameがabsent、値が存在しないことをテストしていることが、JUnitスタイルより強く伝わります。

上記のisAbsentはOptionalのために用意されたアサーションメソッドです。assertThatに渡した引数に適したアサーションを使うことが出来ます。 例えばIterableには、containsAnyInisEmptyなどが用意されています。型ごとに一般的なテストで行うであろうアサーションが用意されており、readableにconciseに書くことが出来ます。

失敗メッセージがわかりやすい

こちらもbenefitにあるサンプルを取り上げます。

まずは従来にJUnitスタイルから。

assertTrue(googleColors.contains(PINK));

この場合、失敗メッセージは特にありません。「trueを表明してる部分にfalseが来た」程度のものしかなく、原因特定するのが大変です。 失敗メッセージをカスタムすることは出来ますが、すべてのアサーションに対して定義するのは骨が折れます。

次にTruthスタイルです。

assertThat(googleColors).contains(PINK);

<[BLUE, RED, YELLOW, BLUE, GREEN, RED]> should have contained <PINK> のようなメッセージが出ます。インスタンス情報や、こうなるべきというメッセージが含まれており原因特定がしやすくなっています。デフォルトの段階でかなり見やすい、わかりやすい失敗メッセージを出力してくれます。

以上がTruthのメリットになります。

補足

Truth-Androidライブラリ

JetPackにTruth + Android用のライブラリが追加されました。これを使うことでBundle、IntentなどのAndroid固有のクラスのテストが書きやすくなります。 例えば、Intentには以下のアサーションメソッドを使うことが出来ます。

hasComponent
hasComponentClass
hasComponentPackage
hasPackage
hasAction
hasNoAction
hasData
hasType
extras
categories
hasFlags

Intentの中身を確認する便利メソッドが定義されています。Truth-Androidを使うことで、よりAndroid環境でテストが書きやすくなることが期待出来ます。

AssertJとの比較

これも公式ドキュメントにまとめてあります。http://google.github.io/truth/comparison

現状の主だった差分は次のようになっています。

多少の差異はあれど、AssertJとTruthはとても似ているライブラリです。どちらか一方を使っているなら、乗り換えるメリットはおそらくないだろうという旨の内容です。

まとめ

Written by
あんどろいどでぃべろっぱぁー🍎