标签: android-jetpack-compose-testing

编写Android测试惰性列未检测到所有孩子

我在可组合项中有一个 LazyColumn,我想检查该 LazyColumn 中的每个项目是否存在。

这是我的可组合项:(注意:实际上在我的实际情况中,每个项目都有不同的组件,我只是使其相似以简化问题)

@Composable
fun HomeScreen(){
    LazyColumn(){
        item {
            HomeBanner()
            Text("Test1",Modifier.testTag("tag1"))
        }
        item {
            HomeBanner()
            Text("Test2",Modifier.testTag("tag2"))
        }
        item {
            HomeBanner()
            Text("Test3",Modifier.testTag("tag3"))
        }
        item {
            HomeBanner()
            Text("Test4",Modifier.testTag("tag4"))
        }
        item {
            HomeBanner()
            Text("Test5",Modifier.testTag("tag5"))
        }
        item {
            HomeBanner()
            Text("Test6",Modifier.testTag("tag6"))
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

这就是它的样子:

在此输入图像描述

这是我的测试课:


@ExperimentalCoroutinesApi
@ExperimentalMaterialApi
@ExperimentalPagerApi
@HiltAndroidTest
@RunWith(AndroidJUnit4::class)
class HomeScreenTest {
    @get:Rule(order = 0)
    val hiltRule = HiltAndroidRule(this)

    @ExperimentalMaterialApi
    @get:Rule(order = 1)
    val composeTestRule = createAndroidComposeRule<MainActivity>()

    @Inject
    lateinit var mainRepository: MainRepository

    @Before
    fun setup() {
        hiltRule.inject()
    }

    @Test
    fun property_list_is_displayed() …
Run Code Online (Sandbox Code Playgroud)

android android-testing android-jetpack-compose lazycolumn android-jetpack-compose-testing

5
推荐指数
2
解决办法
3757
查看次数

如何通过 UI 测试读取 Jetpack Compose TextField 的语义值?

我是 Jetpack Compose 测试的新手,并试图弄清楚如何访问 an 的值OutlinedTextField以对它们执行 Instrumentation 测试:

我无法弄清楚访问和检查 EditField 的 SemanticsNode 中的某些值的语法。

我正在使用以下仪器测试:

@Test
fun NameTextField_LongInput_CompleteStatusAndLabelCorrect() {
    composeTestRule.setContent {
        ComposeTemplateTheme {
            NameTextInput(name = "RandomName123", onNameInfoValid = { isComplete = it })
        }
        assertEquals(isComplete, true)

        // This is accessing the label text 
        composeTestRule.onNodeWithText("Name").assertIsDisplayed()
        //How do I access the Editable text?
        //composeTestRule.onNodeWithEditableText("RandomName123") // How do I do something like this?!?!123
    }
}
Run Code Online (Sandbox Code Playgroud)

我想弄清楚如何访问这棵树中的各个项目:

printToLog:
 Printing with useUnmergedTree = 'false'
 Node #1 at (l=0.0, t=110.0, r=1080.0, b=350.0)px
  |-Node #2 at …
Run Code Online (Sandbox Code Playgroud)

android android-testing android-espresso android-jetpack-compose android-jetpack-compose-testing

4
推荐指数
1
解决办法
5912
查看次数

如何断言 android jetpack 撰写测试中的文本不包含特定字符?

我正在尝试为我的撰写功能编写一些测试用例。我有一个轮廓文本字段,最大值为 16 个字符。所以我想测试一下这个功能。这是测试:

    @Test
    fun checkMaxTaxCodeLength_16Character() {
        val taxCode = composeRule.onNodeWithTag(testTag = AUTHENTICATION_SCREEN_TAX_CODE_EDIT_TEXT)
        for (i in 'A'..'Z')
            taxCode.performTextInput(i.toString())
        taxCode.assertTextEquals("ABCDEFGHIJKLMNOP")
    }
Run Code Online (Sandbox Code Playgroud)

但是,虽然我可以看到输入是正确的,但测试失败,并且似乎assertTextEquals无法正常工作。所以:

  • 首先,我做错了什么?
  • 其次,有没有办法不检查相等性,而检查文本不包含特定字符?

这是文本字段的代码:

                OutlinedTextField(
                    value = state.taxCode,
                    maxLines = 1,
                    onValueChange = { string ->
                        viewModel.onEvent(
                            AuthenticationEvent.TaxCodeChanged(string)
                        )
                    },
                    label = {
                        Text(text = stringResource(id = R.string.tax_code))
                    },
                    modifier = Modifier
                        .fillMaxWidth()
                        .testTag(TestingConstant.AUTHENTICATION_SCREEN_TAX_CODE_EDIT_TEXT)
                )
Run Code Online (Sandbox Code Playgroud)

最大长度在视图模型中处理。如果用户添加的字符超过 16 个,视图模型将不会更新状态并保留旧值。

testing android android-jetpack-compose android-jetpack-compose-testing

4
推荐指数
1
解决办法
3015
查看次数

如何使用 Coil + Compose 来单元测试图像是否已加载

我正在使用Coil for Compose加载图像,如下所示。

@Composable
fun SvgImageSample() {
    val painter = rememberAsyncImagePainter(
        model = ImageRequest.Builder(LocalContext.current)
            .decoderFactory(SvgDecoder.Factory())
            .data("https://someserver.com/SVG_image.svg")
            .size(Size.ORIGINAL)
            .build()
    )
    Image(
        painter = painter,
        modifier = Modifier.size(100.dp).testTag("myImg"),
        contentDescription = null
    )
}
Run Code Online (Sandbox Code Playgroud)

图像已正确加载。现在,我想编写一个测试来检查图像是否已加载。有没有现成的断言

像这样的东西:

class MyTest {
    @get:Rule
    val composeTestRule = createComposeRule()

    @Test
    fun checkIfTheImageLoads() {
        composeTestRule.setContent {
            MyAppThemeTheme {
                SvgImageSample()
            }
        }
        composeTestRule.onNodeWithTag("myImg")
            .assertCoilImageIsLoaded() // <- this is what I want
    }
}
Run Code Online (Sandbox Code Playgroud)

android android-jetpack-compose coil android-jetpack-compose-testing

3
推荐指数
1
解决办法
1793
查看次数