Instrumentation → Compose Testing

Instrumentation 测试(老写法)→ Compose Testing

老写法(Java --- Espresso Instrumentation)

java 复制代码
@Test
public void clickButton_showsResult() {
    onView(withId(R.id.btn_search)).perform(click());
    onView(withId(R.id.tv_result)).check(matches(withText("结果")));
}

问题在哪里

Espresso 测试需要运行在设备/模拟器上,慢(每次至少几十秒)。ViewMatcher 的 withId + withText 嵌套查询对于复杂 UI 可读性很差。测试执行依赖 View 层级,UI 的任何改动都会影响测试。

新写法(Compose Testing)

kotlin 复制代码
@Test
fun `click button shows result`() = runTest {
    composeTestRule.setContent {
        MyScreen(viewModel = fakeViewModel)
    }

    composeTestRule
            .onNodeWithTag("btn_search")
            .performClick()

    composeTestRule
            .onNodeWithTag("tv_result")
            .assertTextEquals("结果")
}

一句话注意

Compose Testing 不依赖真实设备 View 层级,可以直接运行在 JVM 上(不需要模拟器),一秒内就能跑完。SemanticsNode 替代了 View,通过 testTag 定位元素比 Espresso 的 withId 更快更稳定。

如果项目是 View 和 Compose 混用,可以两者一起用------Compose 部分用 composeTestRule,View 部分用 Espresso。但新写的 Compose 页面直接用 Compose Testing 测试即可,不需要 Espresso。


Java Android 老项目迁移系列,持续更新中。

相关推荐
dd聊技术5 小时前
Prompt 从代码常量搬进数据库:改一句话,不用再发一次版
java·后端
ly76896 小时前
Spring Data MongoDB 批量写入实践:BulkOperations 批大小与写关注权衡
java·mongodb·spring·批量写入·bulkoperations·写关注·mongotemplate
TAKETODAY6 小时前
Netty 是怎么把 HTTP 请求交给 MVC 的?一个请求的完整链路
java·netty
蚰蜒螟6 小时前
从内核启动到 Java NIO:一次 socket accept 的源码串联之旅
java·python·nio
知之则吱吱6 小时前
Android 开发者验证机制迎来新变化:核心要求、实施时间与开发者应对指南
android·google
会编程的吕洞宾6 小时前
Spring AI 2.0 自校正结构化输出实战:让大模型稳定吐出合格 JSON
java·人工智能·后端·spring
bmxy小明同学6 小时前
2026-10-09-token与成本
java·前端·数据库
微笑的曙光7 小时前
第八期 · 情绪闯关挑战盒:一个「无惩罚」成就系统的数据建模
java·微信小程序
墨天梦7 小时前
D09_Retrofit接口与数据转换
android·kotlin·retrofit
java资料站7 小时前
七、Spring AI Alibaba · Skills
java·后端·spring