用途
本技能解决的是 Android 测试中「测试文件放在哪里」以及「依赖配到哪个 configuration」的问题。测试文件所在位置决定了它在哪个 JVM 上运行、能访问哪些依赖、以及是否会打包进测试 APK。多数模块只需要 src/test/ 和 src/androidTest/ 两个源码集;需要在主机测试与设备测试之间共享辅助代码的模块,历史上使用 src/sharedTest/(Codelab 约定,并非 Google 正式文档),但该做法在 AGP 7.2+ 上失效,Compose 自身也转向 KMP 风格的 androidHostTest / androidDeviceTest 拆分。本技能把这一整套矩阵编码下来,便于准确定位测试文件位置。
主要能力
- 区分 Google 文档正式记载的两个源码集:src/test/(本地 JVM 测试本地 JVM 测试,由 testImplementation 驱动,通过 ./gradlew test 或 ./gradlew testDebugUnitTest 运行,无需设备或模拟器,除非用 Robolectric 模拟 Android 框架)与 src/androidTest/(插桩测试,由 androidTestImplementation 驱动,通过 ./gradlew connectedAndroidTest 或 ./gradlew connectedDebugAndroidTest 运行,需要连接设备或模拟器,使用 AndroidJUnitRunner)。
- 给出依赖配置矩阵,说明 implementation、api、debugImplementation、releaseImplementation、testImplementation、testDebugImplementation、androidTestImplementation、androidTestUtil 各自作用的源码集、变体以及是否进入产物的行为。
- 澄清三个易混 configuration:testImplementation 用于 JVM(主机)测试(如 Mockito、MockK、Robolectric、kotlinx-coroutines-test、Turbine);androidTestImplementation 用于插桩(设备)测试(如 Espresso、UiAutomator、AndroidJUnitRunner、Compose ui-test-junit4);debugImplementation 用于主 debug 变体,ui-test-manifest 与 fragment-testing-manifest 必须放在这里。
- 说明 src/sharedTest/ 的来历与失效原因:它源自 Google 的 Architecture Blueprints 示例与 Advanced Android Testing Codelab,通过 Gradle sourceSets 把同一目录注入 test 和 androidTest 两个源码集;AGP 7.2+ 强制同一源码目录不能在构建时被多个源码集共享,构建会被拒绝。
- 给出 AGP 7.2+ 的三条迁移路径:抽取独立 Gradle 子模块(如 :core-testing)、启用 AGP 7.0+ 的 testFixtures、采用 KMP 风格的 androidHostTest / androidDeviceTest 源码集命名。
- 提供文件归属决策树,覆盖纯 Kotlin/JVM 逻辑、Robolectric、ViewModel + 协程 + fake、真实 Room 数据库集成、Espresso、UiAutomator、Compose UI 测试、测试辅助类等场景。
- 提供 WRONG vs RIGHT 对照模式,涵盖 testImplementation vs androidTestImplementation、Robolectric 误放 src/androidTest/、ui-test-manifest 配置错误三类典型问题。
使用方式
当用户询问「测试放哪里」「src/test/ 还是 src/androidTest/」「testImplementation、androidTestImplementation、debugImplementation 有何区别」,或出现 Unresolved reference: createComposeRule、需要从 src/sharedTest/ 迁移、想在非 KMP 模块中设置 androidHostTest / androidDeviceTest、Robolectric 测试误放在 src/androidTest/ 等情况时使用本技能。以下情形不使用:配置 Compose 测试依赖、选择测试范围(小/中/大)、配置 AndroidJUnitRunner、为 JVM 测试配置 JUnit4 runner。
前置条件:具备带 Android Gradle Plugin 的模块(com.android.application 或 com.android.library);熟悉 Gradle configuration 名称;理解 JVM 测试运行在主机 JVM、插桩测试运行在设备/模拟器上。
适用场景
适用于 Android 模块(含 Compose Compose UI 测试)中测试源码集的规划与迁移:需要把主机测试与设备测试分离、在两者之间复用辅助代码、处理 AGP 7.2+ 带来的 sharedTest 失效、以及排除依赖配置错误导致的运行时异常或 lint 警告。
限制
本技能聚焦源码集与依赖配置的组织,不涵盖测试依赖的具体接线、测试金字塔范围选择、AndroidJUnitRunner 的配置、JVM JUnit4 runner 的配置等主题。src/sharedTest/ 并非 Google 官方文档内容,引用时应指向 Architecture Blueprints 仓库,不得引用 developer.android.com/training/testing/ 页面。文档中涉及的版本号(如 AGP 7.2+、各依赖版本)以资料所列为准,其余收费、平台、效果等信息暂未提供。