😇

Jetpack Composeでの「戻るボタン」のUIテストしたい

2 min read

やりたいこと

戻るボタンを使った時に、前のページに思った通りに戻るかなどを検証したい。

どんなふうにやりたいか

この間、UI Testを始めた[1]ばかりで、このやり方に沿って出来ないかなと思って、以下のようなコードを書いた。

以下のコードは動きません

composeTestRule.onRoot().performKeyPress(
    KeyEvent(
	NativeKeyEvent(100, 100, ACTION_DOWN, KEYCODE_BACK, 1)
    )
)
composeTestRule.onRoot().performKeyPress(
    KeyEvent(
	NativeKeyEvent(100, 100, ACTION_UP, KEYCODE_BACK, 1)
    )
)

戻るのハードボタン(正式名称はメディアボタンらしい)をRootで押すというものである。しかし、このonRootはthe root semantics nodeを指しているので、上手く動かない。ViewのRootを指定できれば良いようだ。

どうやるか(動くコード)

今まで書いていたコードはComposeのUI TestのコードでJUnit4に依存しているはず。これでは、基本的にレイアウトやUnit Testの検証しか出来ないらしい。一方で、ページの遷移とか複数のViewに跨ぐものに関してはEspressoを用いる。Composeのテストでは「Espressoをガッツリ使う」というよりは相互運用という形で、今まで書いていたコードの中に埋められるらしい[2]。と入っても、Espressoの依存関係を入れないといけないので、AndroidのAndroidX Testに関する依存関係を記載しているページ[3]から依存関係を引っ張ってきて用意する。
その上で、Espressoを使った形で戻るボタンを実現できるコードと探したら、stackoverflowに記事[4]があり、それを、そのまま入れれば動いた。

onView(isRoot()).perform(ViewActions.pressBack())

注意として、onView()に引数として投げているisRootは2つライブラリが存在していてandroidx.test.espresso.matcher.ViewMatchersの方を選択しないと動かない。

おまけと感想

たかが「戻る」ボタンを実装するだけなのに、なかなか記事が見つからず(もしかしたら、この業界では、常識なのかもしれない)、さまよった過程がZennのScrap[5]にありますので、是非そちらもお楽しみください…
ページを跨ぐのはUnit Testじゃないな、JUnitってJavaのUnitテストするためのものなのか、などなど本当に初歩的なところに気づくのに恥ずかしながら時間がかかってしまいました…

脚注
  1. Android Jetpack ComposeでUI Testを体験してみた / Akira Kashihara https://zenn.dev/akira_kashihara/articles/d3e979d8714522 (2022-01-07閲覧) ↩︎

  2. Compose レイアウトのテスト / Android https://developer.android.com/jetpack/compose/testing?hl=ja (2022-01-07閲覧) ↩︎

  3. Set up project for AndroidX Test / Android https://developer.android.com/training/testing/instrumented-tests/androidx-test-libraries/test-setup#android-test-dependencies (2022-01-07閲覧) ↩︎

  4. Espresso.pressBack() does not call onBackPressed()/ stamanuel on stackoverflow https://stackoverflow.com/questions/42861182/espresso-pressback-does-not-call-onbackpressed (2022-01-07閲覧) ↩︎

  5. 検索の仕方、ググり方 〜検索に困った集〜 / Akira Kashihara https://zenn.dev/link/comments/87886e199bdd46 ↩︎

Discussion

ログインするとコメントできます