用途:在编写、修复或重构 Android/KMP 的 Kotlin 代码时,提供以测试先行(RED-GREEN-REFACTOR)为基础的 Android 专项测试参考,重点覆盖 Compose 测试与 KMP 中容易出错的陷阱,而非三层测试、fake 替代 mock、runTest 或 Given-When-Then 命名等基础内容。
主要能力:强调没有失败测试就不写生产代码,先写测试看其失败(RED),再写最小实现通过(GREEN),然后重构;缺陷只有在因该缺陷变红的测试转绿后才算修复。该技能可叠加在专门的 TDD 技能之上,但不依赖它们。
KMP 命名限制:commonTest 会按每个声明目标分别编译,jvmTest 通过不代表 iOS 编译通过。反引号本身各目标都可用,但 Kotlin/Native 前端拒绝其中的 24 个字符:. ; , ( ) [ ] { } / < > : \ $ & ~ * ? # | § % @;Kotlin/JVM 仅禁止 . ; [ ] / < > : \。逗号是两者差异所在,空格则都不禁止,因此带逗号的 Given-When-Then 命名会在原生目标编译失败而 CI 仍绿。规则是:commonTest 声明名中避免 , . ( ) : ?,且用 allTests 或 <target>Test 验证 KMP 测试,不要只用 jvmTest;仅设备目标需显式编译测试二进制(如 linkDebugTestIosArm64)。
Compose 测试:createComposeRule() / runComposeUiTest {} 默认使用 StandardTestDispatcher,由 ComposeUiTestFlags.isStandardTestDispatcherSupportEnabled 控制(默认 true),没有单独的 v2 包;可通过 createComposeRule(effectContext = StandardTestDispatcher()) 固定调度器。注意 MainDispatcherRule 的 TestDispatcher 与 runTest 创建的调度器拥有各自独立的 TestCoroutineScheduler,应把 mainRule.dispatcher 传入 runTest(mainRule.dispatcher)。
选择器优先级:优先用户可见语义,其次 testTag。顺序为 onNodeWithText、onNodeWithContentDescription、角色/状态匹配器(hasClickAction()、isSelected()、isFocused()、isEnabled()),仅当没有稳定可见文本或文本重复/歧义时才用 onNodeWithTag。
测试形态:纯 UI Compose 测试验证文本渲染、条件内容、加载/错误分支与回调接线;焦点导航用 performKeyInput 与 assertIsFocused();视觉契约用截图测试;状态持有者用单元测试加一个接线冒烟测试;生命周期、导航或 DI 集成用集成测试。Compose 状态条件用 mainClock.advanceTimeUntil(ms) { … },非 Compose 条件才用 rule.waitUntil(ms) { … }。动画测试需在 setContent 前设 mainClock.autoAdvance = false。截图需固定状态数据、冻结时钟与动画进度,并使用假图片加载器。
限制:资料未提供安装命令、收费、价格或平台支持等具体信息。