You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AndroidTest中如何用单个Composable实现LazyColumn上下滚动测试?

验证LazyScrollColumn滚动行为的测试实现

为了验证LazyScrollColumn的上下滚动操作、滚动条移动及整体表现是否正常,我编写了如下测试代码,同时修正了原代码中的几处问题:

@RunWith(AndroidJUnit4::class)
class LazyScrollColumnTest {
    @get:Rule
    val rule = createComposeRule()

    private val focusableTag = "focusable"
    private val lazyScrollState = LazyListState(0)

    @Before
    fun before() {
        isDebugInspectorInfoEnabled = true
    }

    @After
    fun after() {
        isDebugInspectorInfoEnabled = false
    }

    @Test
    fun scrollDown() {
        rule.setContent {
            LazyScrollColumn (
                state = lazyScrollState,
                modifier = Modifier.fillMaxSize().testTag(focusableTag)
            ){
                items(30) {
                    Text(
                        text = "Item $it",
                        fontSize = 100.sp
                    )
                }
            }
        }
        requestFocusAndScrollToDown()
    }

    @Test
    fun scrollUp() {
        rule.setContent {
            LazyScrollColumn (
                state = lazyScrollState,
                modifier = Modifier.fillMaxSize().testTag(focusableTag)
            ){
                items(30) {
                    Text(
                        text = "Item $it",
                        fontSize = 100.sp
                    )
                }
            }
        }
        requestFocusAndScrollToTop()
    }

    private fun requestFocusAndScrollToTop() {
        requestFocus()
        scrollToTop()
    }

    private fun requestFocusAndScrollToDown() {
        requestFocus()
        scrollToDown()
    }


    private fun requestFocus(tag: String = focusableTag) {
        rule.onNodeWithTag(tag).performSemanticsAction(SemanticsActions.RequestFocus)
    }

    private fun scrollToTop() {
        rule.waitForIdle()
        // 由于请求焦点会触发滚动,这里重置滚动到顶部
        runBlocking {
            lazyScrollState.scrollToItem(0)
        }
    }

    private fun scrollToDown() {
        rule.waitForIdle()
        // 由于请求焦点会触发滚动,这里滚动到底部(30个item的索引范围是0-29,需传入29而非30)
        runBlocking {
            lazyScrollState.scrollToItem(29)
        }
    }
}

关键修正与说明

  • 修复scrollDown方法中的索引错误:原代码传入scrollToItem(30)会越界,30个item的最大索引是29,修正后才能正确滚动到最后一项
  • 补全scrollUp测试的状态绑定:原代码未给LazyScrollColumn传入lazyScrollState,导致scrollToTop无法控制该列的滚动状态,补充后状态控制生效
  • 启用isDebugInspectorInfoEnabled是为了在测试中获取更详细的Compose节点信息,测试完成后需关闭以避免影响其他测试

参考思路

基于官方滚动交互测试用例的核心思路:

  1. 用createComposeRule搭建Compose测试环境
  2. 通过LazyListState直接控制滚动位置,验证滚动行为的准确性
  3. 结合语义操作请求焦点,模拟真实用户交互场景下的滚动触发逻辑

内容的提问来源于stack exchange,提问作者c-an

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 20:32:37