标签: android-jetpack-compose-testing

Compose UI 测试 - 如何断言文本颜色?

我正在尝试Text在我的组件上测试我可以用不同的颜色打印它,所以在我的测试中我正在验证它是否获得了预期的颜色。我正在寻找一种返回颜色的方法,但没有找到。

从现在开始,我断言文本是正确的,可见性是正确的,但是当试图找到获取颜色的方法时,我变得太深了,我正在寻找一个更简单的解决方案。

composeTestRule.onNode(hasTestTag("testTagForButton"), true)
            .assertExists()
            .assertTextEquals("Testing")
Run Code Online (Sandbox Code Playgroud)

我已经检查过我可以做一些类似.fetchSemanticsNode().layoutInfo.getModifierInfo()进入的事情Modifier,也许从那里我可以得到颜色,但它可能太多了。我还发现.captureToImage()也许我可以在上面得到颜色,但由于我必须放置像素,所以我认为这不是方法。

有什么简单的方法可以得到它吗?

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

20
推荐指数
1
解决办法
4445
查看次数

如何获取 Compose UI 测试的代码覆盖率?

由于广泛的Android 文档,我现在对 Jetpack Compose 中的 UI 测试有些熟悉,但我无法让 Android Studio 运行具有覆盖范围的 Compose 测试。我们目前使用 Jacoco 作为覆盖率工具来生成报告,但根据此Github 问题, Compose 的覆盖率看起来并不是团队的优先事项(遗憾的是:S)。

由于我们不想在评估代码覆盖率时将 UI 测试放在一边,因此有什么方法可以使用 Android Studio 或外部工具/库在 Android Studio 中启用代码覆盖率以进行 Compose 测试?

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

18
推荐指数
0
解决办法
1665
查看次数

如何使用 Firebase 测试实验室进行 UI 测试 Jetpack Compose?

为了测试撰写布局,我们有一个默认库。

要运行Firebase 测试实验室(FTL),它表示您需要EspressoUI Automator框架。

但我不确定这是否已经过时。

将我的 APK (使用 jetpack compose 和 compose 测试框架)放在 FTL 上进行测试适用于真实设备,但不适用于虚拟设备。

我的问题是,预期的方法是什么?

  • 将 Espresso 添加到我的所有 UI 测试中,并在 Jetpack Compose 上使用 Espresso(这可能吗?)
  • 仅使用真实物理设备运行 FTL。虚拟可能会到来吗?
  • 有一种方法可以在虚拟设备上运行组合测试,但我没有找到。?

谢谢!

android firebase firebase-test-lab android-jetpack-compose android-jetpack-compose-testing

11
推荐指数
0
解决办法
453
查看次数

Jetpack compose 测试记录器

我想在我的 jetpack compose 项目中记录UI 测试,就像记录 Espresso 测试一样

我想按照以下步骤操作:
  1. 开始录音

  2. 打开应用程序

  3. 单击对象(按钮等...)

  4. 完成录音

  5. 获取生成的 kotlin 代码,就像 Espresso 录音一样

看来我们不能在 jetpackCompose 项目中使用 Espresso。

在此输入图像描述

但在这个项目中我仍然没有完全迁移到 JetpackCompose。但它会将其识别为 Jetpack Compose 项目

android kotlin android-espresso-recorder android-jetpack-compose android-jetpack-compose-testing

10
推荐指数
1
解决办法
1264
查看次数

Jetpack Compose 在自动化测试中按下后退按钮

在jetpack compose测试(在真实设备上运行)中触发后退按钮按下的推荐方法是什么?

我想:

@get:Rule()
val composeTestRule = createAndroidComposeRule(MyActivity::class.java)

@Test
fun test() {
    // Here would be some setup code, assertions and navigating into a second screen
     
    // Navigate back to previous screen
    composeTestRule.onRoot().performKeyPress(KeyEvent(NativeKeyEvent(0, KeyEvent.KEYCODE_BACK)))

    // continue... 
}
Run Code Online (Sandbox Code Playgroud)

但我收到错误:

java.lang.IllegalStateException: KeyEvent can't be processed because this key input node is not active.
Run Code Online (Sandbox Code Playgroud)

我没有任何特殊的按键/导航逻辑,仅使用导航撰写库的开箱即用功能。

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

8
推荐指数
2
解决办法
2919
查看次数

如何像flow Turbine一样测试android compose mutableStateOf

我遵循新的谷歌指南并以此结束以表示视图模型中的状态,就像 tis

var uiState: AccountSettingUiState by
    mutableStateOf(AccountSettingUiState.Initial)
        private set
Run Code Online (Sandbox Code Playgroud)

然后我有这个功能

 fun resetPasswordUseCase(context: Context) {
         resetPasswordUseCase.execute(context)
            .subscribeOn(rxSchedulers.io)
            .doOnSubscribe {
               uiState  = AccountSettingUiState.Loading
            }
            .observeOn(rxSchedulers.ui)
            .subscribe {
               uiState  = AccountSettingUiState.Result

  }
}
Run Code Online (Sandbox Code Playgroud)

我想通过断言发出加载然后结果来测试这个函数,但是我如何捕获这些值

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

7
推荐指数
1
解决办法
1685
查看次数

如何在 Android Jetpack Compose UI 测试中迭代元素(节点)列表?

我正在使用 Jetpack Compose 测试库实现一些仪器测试。我对 Kotlin / Android 开发还不太熟悉,但我有多年使用 Selenium 和其他测试库的经验,所以我缺少一些基本的东西,并且不知道如何实现它们。

我想做的事:

  1. 迭代元素(节点)列表。我有这个列表,所有项目都由相同的测试标签“项目”标识。我需要点击其中的每一项。

在 Selenium 上我可以轻松做到这一点:

elements = driver.find_elements("item")
elements.each do |element|
  element.click
end
Run Code Online (Sandbox Code Playgroud)

但在具有组合测试框架的 Kotlin 上,我不知道如何做到这一点。下面的方法(负责返回节点列表)不支持forEach

composeTestRule.onAllNodes(hasTestTag("item")
Run Code Online (Sandbox Code Playgroud)
  1. 我还想检索列表大小。

在 Selenium 上,以下方法返回找到的项目数量:

driver.find_elements("item").size 
Run Code Online (Sandbox Code Playgroud)

但是,再一次,没有什么可以与写作相提并论:

composeTestRule.onAllNodes(hasTestTag("item")
Run Code Online (Sandbox Code Playgroud)

我已经阅读了官方的JetPack Compose 测试教程,但它没有提供太多细节

automated-tests gui-testing kotlin instrumented-test android-jetpack-compose-testing

7
推荐指数
2
解决办法
3065
查看次数

将 Compose 语义树打印到日志

我正在关注Jetpack Compose Codelab 中的测试,但无法使用节点上的函数打印语义树。printToLog我在包内使用此代码androidTest

import androidx.compose.ui.test.printToLog 

...

    //testing function
    @Test
    fun rallyTopAppBarTest() {
    
        val allScreen = RallyScreen.values().toList()
        testRule.setContent {
            //the component be tested in isolation goes here
            RallyTopAppBar(
                allScreens = allScreen,
                onTabSelected = {},
                currentScreen = RallyScreen.Accounts
            )
        }
        
        testRule.onRoot().printToLog("currentLabelExists")
        
            ....
    }
Run Code Online (Sandbox Code Playgroud)

我已使用标签检查了我的 LogCat 的调试详细过滤"currentLabelExists",但语义树未打印在日志上。

关于我可能会错过什么的任何想法。

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

6
推荐指数
1
解决办法
5195
查看次数

IllegalStateException:在 Jetpack Compose 测试期间未初始化 FocusRequester

我有一个屏幕,带有TextFields. 我需要第一个TextField在屏幕显示时自动聚焦。

缩小的示例代码

@Composable
fun ScreenView(
    data: ScreenViewData,
) {
    val focusManager = LocalFocusManager.current
    val focusRequester = remember {
        FocusRequester()
    }

    LaunchedEffect(
        key1 = Unit,
    ) {
        focusRequester.requestFocus()
    }

    Scaffold() { innerPadding ->
        Column {
            OutlinedTextField(
                modifier = Modifier.focusRequester(focusRequester),
            )
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

该代码可以正常运行,没有任何问题。

但是,在撰写 UI 测试时,我收到以下错误。

java.lang.IllegalStateException:
FocusRequester 未初始化。以下是一些可能的修复方法:

  1. 记住 FocusRequester: val focusRequester = Remember { FocusRequester() }
  2. 您是否忘记添加 Modifier.focusRequester() ?
  3. 您是否试图在构图​​过程中要求焦点?
    应针对某些事件发出焦点请求。例如 Modifier.clickable { focusRequester.requestFocus() }

测试代码

@ExperimentalAnimationApi
class ScreenViewTest {

    @get:Rule
    val composeTestRule …
Run Code Online (Sandbox Code Playgroud)

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

6
推荐指数
1
解决办法
2434
查看次数

如何在jetpack compose测试中关闭软键盘?

我正在为jetpack 撰写屏幕编写测试,该屏幕上有一个文本字段。在我的测试中,我想在字段中输入一些文本,然后关闭软键盘,然后单击隐藏在软键盘下方的按钮。不过,我找不到在 jetpack 撰写测试中关闭软键盘的方法。我尝试了“performImeAction”,但这并没有关闭键盘,即使您在实际与此文本字段交互时按下软键盘上的 IME 键,它也会关闭键盘。

我希望能够做到这一点,但在组合测试中:

onView(withId(R.id.text_field)).perform(typeText("100"), closeSoftKeyboard())
Run Code Online (Sandbox Code Playgroud)

我当前的撰写代码在字段中输入“100”然后抛出错误:

composeTestRule
    .onNodeWithTag(TEXT_FIELD_TAG)
    .performTextInput("100")
composeTestRule
    .onNodeWithTag(TEXT_FIELD_TAG)
    .performImeAction() <------------- This fails
Run Code Online (Sandbox Code Playgroud)

报告错误:

java.lang.AssertionError: Failed to perform IME action as current node does not specify any.
Semantics of the node:
Node #48 at (l=0.0, t=748.0, r=788.0, b=1141.0)px, Tag: 'TEXT_FIELD_TAG'
ImeAction = 'Default'
EditableText = '100'
TextSelectionRange = 'TextRange(3, 3)'
Focused = 'true'
Actions = [GetTextLayoutResult, SetText, SetSelection, OnClick, OnLongClick, PasteText]
MergeDescendants = 'true'
Has 7 siblings
Run Code Online (Sandbox Code Playgroud)

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

5
推荐指数
1
解决办法
1988
查看次数