用途
该技能帮助开发者以 androidx 自身的规范方式组织 Jetpack Compose UI 测试类。它针对的不是断言逻辑,而是测试结构:作者指出 Compose 测试失败或腐化往往源于结构错误,例如状态被困在 setContent { } 内无法从测试线程驱动、在 @Before 中调用 setContent 造成隐藏竞态、将 @get:Rule 与 runComposeUiTest { } 混用产生两个相互竞争的测试环境。该技能编码了 androidx.compose.material3 与 androidx.compose.foundation 使用的确切类骨架。
主要能力
技能给出了完整的工作流程:把测试文件放在与生产代码相同的包中并以 <ProductionFile>Test 命名;用 @MediumTest(默认)或 @LargeTest(长按、多秒动画等超时预算场景)与 @RunWith(AndroidJUnit4::class) 注解类;每个类只声明一个规则,推荐使用 v2 入口点;把可变状态提升到 setContent 之上;在 @Test 方法内调用 setContent;按 Test → Find → Assert → Act → Re-assert 的顺序组织。
同时提供多组正误对照模式:状态提升到 setContent 之上还是内部、setContent 放在 @Before 还是 @Test、每个类只用一个规则而不与 runComposeUiTest 混用、自定义 Activity 需要单独的清单条目、@MediumTest 与 @LargeTest 的选择。
使用方式
规则声明推荐使用 v2 入口点,因为它默认将组合调度器设为 StandardTestDispatcher,与 kotlinx.coroutines.test.runTest 一致:
import androidx.compose.ui.test.junit4.v2.createComposeRule
import kotlinx.coroutines.test.StandardTestDispatcher
@MediumTest
@RunWith(AndroidJUnit4::class)
class MyButtonTest {
@get:Rule val rule = createComposeRule(StandardTestDispatcher())
}
自定义 Activity 使用 reified v2 辅助方法:
import androidx.compose.ui.test.junit4.v2.createAndroidComposeRule
@get:Rule val rule = createAndroidComposeRule<FragmentActivity>(StandardTestDispatcher())
状态变更通过 rule.runOnIdle { } 从外部进行(或在不希望先空闲时使用 rule.runOnUiThread { },例如 mainClock.autoAdvance = false);跨帧状态读取也必须在 rule.runOnIdle { } 内完成,直接读取会快照到错误的帧。
适用场景
创建新的 *Test.kt 并需要决定状态、规则和 setContent 放哪里时;测试能编译但无法在测试中途改变状态时;把 setContent 放进 @Before 导致测试不稳定或无法启动时;评审者指出状态被声明在 setContent { } 内部时;同时混用 @get:Rule createComposeRule() 与 runComposeUiTest { } 导致失败难以理解时。
不适合的场景包括:选择入口点(规则与 runComposeUiTest 之争)、构建无法解析 createComposeRule、决定宿主(Robolectric)与设备(instrumentation)测试、以及专门针对 LazyColumn/LazyRow 的测试。
前置条件
androidTestImplementation 需要 androidx.compose.ui:ui-test-junit4,debugImplementation 需要 androidx.compose.ui:ui-test-manifest。默认 Activity 为 androidx.activity.ComponentActivity(由 ui-test-manifest 提供);自定义 Activity 必须在 androidTest 源集的 AndroidManifest.xml 中声明。Kotlin 源集路径为 src/androidTest/kotlin/...(instrumentation)或 src/test/kotlin/...(Robolectric 宿主)。
限制
技能明确列出了强制规则与验证清单,例如不得在同一类中混用 @get:Rule 与 runComposeUiTest { },推荐使用 v2 入口点(v1 因使用 UnconfinedTestDispatcher 已被标记为弃用警告),测试方法中不得出现 Thread.sleep。具体价格、收费等信息资料中暂未提供。