なるようになるかも

力は多くの場合、その人の思いを超えない。

Android Kotlin のアサーションは Truth が良いのでは?

Android テスト全書を読んでたら、「Kotlin でアサーションを書くなら AssertJ」って感じだったので。

確かに AssertJ は堅実で、現実的な選択肢だと思うんですけれど、ちょっと気になったきっかけが P42 の AssertJ Android のコラムで、「サポートライブラリの進化への追従が難しかったから廃止された」とだけ書いてあって、もうひとつの理由については触れていないこと。

Additionally, we no longer think AssertJ's model for supporting alternate assertions is a good practice.

We recommend using Truth which has vastly superior extensibility model which, when coupled with things like Kotlin's apply method create a really nice assertion experience.

引用元: square/assertj-android

超ざっくりですが、「もはや AssertJ が代替アサーションを提供する良い手段だとは考えていない」「より優れた拡張を持ち、Kotlin との親和性が優れたアサーション体験をもたらす Truth を推奨する」みたいなことが書いてあります。

これを書いたのは Google 入社直後の Jake 神なので、Google 製の Truth を推しただけかもという可能性はありますが、かなりベタ褒めされてます。

で、Truth って何?

google truth」という単語の組み合わせでググっても、「グーグルの検閲によって真実が歪められている!」みたいなのが引っかかって、全然ライブラリの感想が出てこなくてぐったりしますが、Google の Guava 開発チームが作ってるアサーションライブラリです。

google.github.io

Android テストを書く上で Truth を採用するメリットは?

AndroidX Test Library が Truth 向けの拡張を用意している、というのが大きなメリットかなと思います。

AssertJ Android が突然の死を迎えたように、サードパーティの便利なライブラリは、依存しすぎると将来的にどうしようもない負債になるリスクがあるので、公式でサポートされている、というのは安心要素です。

とはいえ、現時点では対応しているコンポーネントはあまりないのですが、AndroidX Test Library はオープンソースなので、そのうちコントリビュートが殺到して充実するかもしれないし、そうでないかもしれないです。

どんな感じの書き方なの?

AssertJ と大体同じです。

大きな違いとしては、AssertJ だと method chain で複数の検証を連結させることができましたが、Truth ではこの方法を避けています。

Java だとやや冗長になるのですが、Kotlin には apply があるのですっきり書けます。

assertThat(actualIntent).apply {
    hasComponentClass(UserPageActivity::class.java)
    hasFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
}
assertThat(actualIntent.extras).apply {
    isNotNull()
    string("KEY_URL").matches("https://example.com/user/[a-z]{3,12}/")
}

拡張性は良いの?

AssertJ Android と AndroidX Test Library の実装を比較してみた感じ、より簡単に作れそうな感じはします。

IntentFlag 周りの実装が端折ってるので、出力されるエラーメッセージ自体は、AssertJ Android の方が親切ですね。

まだ安定版がないので導入は早いのでは?

現在のバージョンは 0.42 で、確かに安定版ではありません。

1.0 のリリースはいまは 2019 年の秋を予定しているらしいです。

こう聞くと AssertJ の後継として作られた、開発が活発な新しいライブラリなのかな? と思うところですが、そうではありません。

AssertJ とよく似た API をしているのは、AssertJ の fork 元である FEST に触発されて開発されたものだから……という理由らしく、2011 年から細々と存在しているみたいです。(AssertJ は 1.0 が 2013 年にリリースされたのですが、それより前からあるらしい)

なお、散発的にアップデートしていますが、お世辞にも活発とは言いがたく、1.0 が本当に 2019 年に出るのか怪しいと思ってます。

もっとも、1.0 に向けた開発のフォーカスは、主に拡張を作る人向けの部分らしいので、アサーション部分に破壊的変更が入る可能性はそれほど高くないのでは、と思います。

正直どっちでも大して変わらないのでは?

それはそうなんだけど人柱を増やしていきたい。