Open1

ナビゲーションテスト

るるすたるるすた

依存関係追加

ナビゲーションに必要な依存関係を追加していきます。
日々反省なのですが、nabGraphの依存関係を追加するときに
ついでに設定すべきですね。。。

build.gradle.kts(Module:app)

testingがエラーになるけど一旦気にしない。

dependencies {
    androidTestImplementation(libs.androidx.navigation.testing)

libs.versions.toml

バージョンとライブラリを設定。
[versions]

navigationTesting = "2.9.0"

[libraries]

androidx-navigation-testing = { module = "androidx.navigation:navigation-testing", version.ref = "navigationTesting" }

テストファイル作成

テストを作る場所はandroidTestの中です。
今回はNavTest.ktというファイル名にしてみました。

テストのセットアップ

ルール作成

ナビゲーションのテストは、Jetpack ComposeのUIテストです。
最初に、Jetpack ComposeのUIテストを行うためのRuleを作成すること。
作成するための関数がcreateAndroidComposeRule()
テストで、Compose UIにアクセスさせてくれるためのもの。

class NavTest {
    @get:Rule
    val composeTestRule = createAndroidComposeRule<ComponentActivity>()
}

TestNavControllerの設定

ここから先は、特に指定がない限り、NavTestクラスの中で記述していきます。
navControllerを変数を用意して、setupの中で値を設定。
テストルールのコンテンツを設定。
コンテンツは今回テストするナビゲーショングラフ。

    private lateinit var navController: TestNavHostController
    @Before
    fun setup() {
        navController = TestNavHostController(composeTestRule.activity)
        navController.navigatorProvider.addNavigator(ComposeNavigator())

        composeTestRule.setContent {
            NoToreNavGraph(
                navController = navController,
                onDrillStart = {},
                onDrillEnd = {}
            )
        }
    }

テストする!

最初に表示される画面のテストと、ボタンをクリックしたときに遷移する画面のテストを実施。
各画面のModifierにtestTagを仕込んでおき、onNodeWithTagで呼び出す。
assertIsDisplayed()で表示されたかどうかの評価をする。

    @Test
    fun 最初の画面はHomeScreen() {
        composeTestRule.onNodeWithTag("HomeScreen").assertIsDisplayed()
    }

    @Test
    fun 計算どりるボタンをクリックしたらDrillSelectScreenに遷移() {
        composeTestRule.onNodeWithTag("DrillSelectButton").performClick()
        composeTestRule.onNodeWithTag("DrillSelectScreen").assertIsDisplayed()
    }

    @Test
    fun DrillSelectScreenから戻るボタンを押すとHomeScreenに遷移() {
        composeTestRule.onNodeWithTag("DrillSelectButton").performClick()
        composeTestRule.activityRule.scenario.onActivity {
            navController.popBackStack()
        }
        composeTestRule.onNodeWithTag("HomeScreen").assertIsDisplayed()
    }

ナビゲーションテストは簡単でいいなぁ😄