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 老项目迁移系列,持续更新中。

相关推荐
天河归来3 小时前
第三方接口不稳定,如何让核心任务继续完成
java·大数据
好的佩奇3 小时前
蓝牙之通信架构
android·flutter·蓝牙
FlightYe4 小时前
视界原理之3D视频(四):裸眼、眼镜和头显
android·linux·c++·3d·ffmpeg·音视频
Knight_AL4 小时前
Java 文件下载时文件名中的 `#` 被转换成 `%23`?一次 URL 编码与解码问题排查
java·开发语言
诸神黄昏EX5 小时前
Android fw BatteryService
android
alexhilton5 小时前
提升 Android Compose 页面的流畅度
android·kotlin·android jetpack
砚底藏山河5 小时前
python量化自定义周期 K 线合成
java·开发语言·数据库·python·金融
猿究院_夏燊6 小时前
MySQL 的四种隔离级别
java·数据库·mysql
码流子6 小时前
移动收费怎么做?手持终端+App+收费中心的架构实践
java·开发语言·架构
撩得Android一次心动6 小时前
Android中Gradle网络下载超时、更改存放位置(解决方案)
android·gradle