Open5

Android Jetpack ComposeのUI Testの技(メモ)

Akira KashiharaAkira Kashihara

Q: Question) drawerContentのテストについて。同じ画面上のコードなのに、assertIsDisplayedは正常に機能するのか。

A: Answer) 正常に機能する

コード

例えば

Contents code
Scaffold(
        scaffoldState = drawerState,
        topBar = {
            TopAppBar(
                title = { Text(text = pagename.value) },
                navigationIcon = {
                    IconButton(onClick = {
                        scope.launch {
                            drawerState.drawerState.open()
                        }
                    }) {
                        Icon(Icons.Filled.Menu, contentDescription = "Open Menu Bar")
                    }
                }
            )
        },
        drawerContent = {
            Column() {
                Column(
                    Modifier
                        .fillMaxWidth()
                        .padding(0.dp, 20.dp)
                ) {
                    TextButton(onClick = {}, modifier = Modifier.fillMaxWidth().padding(0.dp, 0.dp, 0.dp, 20.dp)) {
                        Icon(Icons.Filled.SwitchAccount, contentDescription = "Switch Account")
                        Text(text = "Switch Account")
                    }
...

というコードがあったとき、以下のコードでdrawerContentsがOpenされたかどうかが正常に判断される。

Test code
    @Test
    fun pushMenuButton() {
        composeTestRule
            .onNodeWithContentDescription("Open Menu Bar")
            .performClick()
        composeTestRule.onNodeWithText("Switch Account").assertIsDisplayed()
    }

    @Test
    fun notPushMenuButton() {
        composeTestRule.onNodeWithText("Switch Account").assertIsDisplayed()
    }

結果

Test Result

Akira KashiharaAkira Kashihara

UIテストで、Enterキーを押したい。しかし、performKeyPressの中に何を入れて良いのかわからない。
苦肉の策で、以下のように、改行コードで代用したが上手くいかない。

        composeTestRule
            .onNode(hasContentDescription("Input Address")
                    and hasText(nameLabel))
            .performTextInput("akira@da.yo\n")

結局、以下の記事に書いた方法で出来た(全然、記事が落ちていなかったので、記事にしておきました。)
https://zenn.dev/akira_kashihara/articles/1b6cdb57e4c21d

Akira KashiharaAkira Kashihara

テストを値を変えて、繰り返し実行させたい。
以下のサイトのやり方で出来た。
http://y-anz-m.blogspot.com/2018/03/android-junit4-parameterized.html

Akira KashiharaAkira Kashihara

@Testアノテーションを付けない関数を呼び出す時に

val a = listOf(fun1("WAWA"), fun2(2), fu3())

のように、関数をリストで持たせたいと思っちゃうけど、これは出来ない。面倒でも、if文とかswitchとかで書くのがbetter。