同步测试

使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。

默认情况下,Compose 测试会与界面同步。当您调用 断言或操作与 ComposeTestRule 相关联,则测试会同步 ,直到界面树空闲为止。

通常,您无需执行任何操作。但是,您应该了解一些极端情况。

同步测试时,您可以使用虚拟时钟将 Compose 应用的时间提前。这意味着 Compose 测试不会实时运行,从而能够尽快通过测试。

但是,如果您不使用同步测试的方法,则不会发生任何重组,并且界面会暂停。

        @Test

        fun
         
        counterTest
        ()
         
        {

           
         val
         
        myCounter
         
        =
         
        mutableStateOf
        (
        0
        )
         
        // State that can cause recompositions.

           
         var
         
        lastSeenValue
         
        =
         
        0
         
        // Used to track recompositions.

           
         composeTestRule
        .
        setContent
         
        {

               
         Text
        (
        myCounter
        .
        value
        .
        toString
        ())

               
         lastSeenValue
         
        =
         
        myCounter
        .
        value

           
         }

           
         myCounter
        .
        value
         
        =
         
        1
         
        // The state changes, but there is no recomposition.


           
     
                    // Fails because nothing triggered a recomposition.

                   
                 assertTrue
                (
                lastSeenValue
                 
                ==
                 
                1
                )
    


           
         // Passes because the assertion triggers recomposition.

           
         composeTestRule
        .
        onNodeWithText
        (
        "1"
        ).
        assertExists
        ()

        }

请注意,此要求仅适用于 Compose 层次结构,而不适用于 。

停用自动同步功能

通过 ComposeTestRule (如 assertExists() )调用断言或操作时,您的测试会与 Compose 界面同步。在某些情况下,您可能需要停止此同步并自行控制时钟。例如,您可以控制时间,以便在界面仍处于繁忙状态时对动画进行精确截图。如需停用自动同步功能,请将 mainClock 中的 autoAdvance 属性设置为 false

        composeTestRule
        .
        mainClock
        .
        autoAdvance
         
        =
         
        false

一般情况下,您需要自行将时间提前。您可以使用 advanceTimeByFrame() 仅提前一帧,或使用 advanceTimeBy() 提前一段特定时间:

        composeTestRule
        .
        mainClock
        .
        advanceTimeByFrame
        ()

        composeTestRule
        .
        mainClock
        .
        advanceTimeBy
        (
        milliseconds
        )

空闲资源

Compose 可以同步测试和界面,以便以空闲状态完成各项操作和断言,从而根据需要等待或将时钟提前。但是,某些影响界面状态的异步操作可在后台运行,而测试无法得知这些结果。

在测试中创建并注册这些空闲资源,以供系统使用 在确定被测应用处于忙碌状态还是空闲状态时考虑的因素。你不会 除非您需要注册其他空闲资源 例如,如果您运行的后台作业未与 Espresso 或 写邮件。

此 API 与 Espresso 的空闲资源 非常相似,用于指示 被测对象处于空闲或忙碌状态。使用 Compose 测试规则进行注册 IdlingResource 的实现。

        composeTestRule
        .
        registerIdlingResource
        (
        idlingResource
        )

        composeTestRule
        .
        unregisterIdlingResource
        (
        idlingResource
        )

手动同步

在某些情况下,您必须将 Compose 界面与测试的其他部分或您测试的应用同步。

waitForIdle() 函数会等待 Compose 空闲,但该函数 依赖于 autoAdvance 属性:

        composeTestRule
        .
        mainClock
        .
        autoAdvance
         
        =
         
        true
         
        // Default

        composeTestRule
        .
        waitForIdle
        ()
         
        // Advances the clock until Compose is idle.


        composeTestRule
        .
        mainClock
        .
        autoAdvance
         
        =
         
        false

        composeTestRule
        .
        waitForIdle
        ()
         
        // Only waits for idling resources to become idle.

请注意,在这两种情况下,waitForIdle() 还会等待待处理的绘制和布局 卡券

此外,您还可以将时钟提前,直到满足 advanceTimeUntil() 的特定条件为止。

        composeTestRule
        .
        mainClock
        .
        advanceTimeUntil
        (
        timeoutMs
        )
         
        {
         
        condition
         
        }

请注意,指定条件应检查可能受影响的状态 (仅适用于 Compose 状态)。

等待条件

任何依赖于外部工作的条件,例如数据加载或 Android 的 测量或绘制(即在 Compose 外部进行测量或绘制),应使用 更宽泛的概念,例如 waitUntil()

        composeTestRule
        .
        waitUntil
        (
        timeoutMs
        )
         
        {
         
        condition
         
        }

您也可以使用 waitUntil 帮助程序

        composeTestRule
        .
        waitUntilAtLeastOneExists
        (
        matcher
        ,
         
        timeoutMs
        )


        composeTestRule
        .
        waitUntilDoesNotExist
        (
        matcher
        ,
         
        timeoutMs
        )


        composeTestRule
        .
        waitUntilExactlyOneExists
        (
        matcher
        ,
         
        timeoutMs
        )


        composeTestRule
        .
        waitUntilNodeCount
        (
        matcher
        ,
         
        count
        ,
         
        timeoutMs
        )

其他资源

  • 在 Android 平台上测试应用 :主要的 Android 测试 着陆页让您更全面地了解测试基础知识和技术。
  • 测试基础知识 :了解详情 关于测试 Android 应用的核心概念。
  • 本地测试 :您可以运行一些测试 在您自己的工作站上运行
  • 插桩测试 :适合 来运行插桩测试也就是说, 。
  • 持续集成 : 借助持续集成,您可以将测试集成到部署中 流水线。
  • 测试不同的屏幕尺寸 :使用 您应针对不同的屏幕进行测试 尺寸。
  • Espresso :虽然适用于基于 View 的应用 界面、Espresso 知识对于 Compose 的某些方面仍然有帮助 测试。

本页面上的内容和代码示例受内容许可 部分所述许可的限制。Java 和 OpenJDK 是 Oracle 和/或其关联公司的注册商标。

最后更新时间 (UTC):2024-08-23。