./gradlew test 默认仅运行 debug 变体的本地单元测试(即 testDebugUnitTest),不自动执行 release 或 staging 等其他变体的测试任务;如需运行指定变体,须显式调用 testReleaseUnitTest 等对应任务,或通过自定义脚本批量触发。

直接运行 ./gradlew test 就能跑所有本地单元测试,但默认只跑 debug 变体的测试;如果项目有多个 build 类型(比如 release、staging),得显式指定变体名。
test 任务默认只针对 debug 变体
Android Gradle Plugin(AGP)把 test 任务绑定到 testDebugUnitTest 这个具体任务上。它不会自动执行 testReleaseUnitTest 或 testStagingUnitTest,除非你手动调用。
- 运行全部本地单元测试(仅 debug):
./gradlew test - 运行特定变体的测试:
./gradlew testReleaseUnitTest或./gradlew testStagingUnitTest - 想一次跑多个变体?Gradle 不原生支持,得写自定义 task 或用 shell 脚本循环调用
怎么只跑某个测试类或方法
Gradle 的 test 任务支持 --tests 参数,但要注意匹配规则:它按类全限定名或方法名模糊匹配,且大小写敏感。
- 跑单个类:
./gradlew test --tests "com.example.app.MyUtilTest" - 跑类里某几个方法:
./gradlew test --tests "*MyUtilTest.testParse*"(*是通配符,不是正则) - 错误写法:
--tests MyUtilTest(缺包名,不匹配)或--tests "testParse"(没指定类,可能命中多个) - 注意:这个参数对
androidTest无效——仪器化测试要用connectedAndroidTest+-Pandroid.testInstrumentationRunnerArguments.class=...
testImplementation 依赖没生效?检查 sourceSets 是否被覆盖
本地单元测试代码必须放在 src/test/java/ 下,且 build.gradle 中不能误删或覆盖 sourceSets.test.java.srcDirs 配置。
- 常见坑:有人在
android { sourceSets { test { setRoot '...' } }里写了错误路径,导致 Gradle 找不到测试类,test任务静默跳过 - 验证方式:执行
./gradlew app:sourceSets(把app换成你的模块名),看输出里test的java.srcDirs是否包含src/test/java - JUnit 版本要和 AGP 兼容:AGP 8.0+ 推荐用
testImplementation 'junit:junit:4.13.2'或testImplementation 'org.junit.jupiter:junit-jupiter:5.10.2'(需额外配置 JUnit Platform)
测试失败但没报错信息?打开 test report 和堆栈
默认 test 任务只在控制台输出简略结果,失败详情藏在 HTML 报告里,异常堆栈也可能被吞掉。
- 生成完整报告:
./gradlew test --info(加--info显示每个测试的 stdout/stderr) - 查看 HTML 报告路径:
app/build/reports/tests/testDebugUnitTest/index.html - 想让失败时立刻中断并打印堆栈:在
android { testOptions { unitTests { all { testLogging { exceptionFormat = 'full' } } } } }里加配置 - 注意:
testLogging在 AGP 8.4+ 中已被标记为 deprecated,新项目建议用testing.suites.testDSL 替代
最容易被忽略的是变体耦合——你以为 ./gradlew test 是“跑所有单元测试”,其实它只代表 debug 变体的那套逻辑。如果有自定义 build 类型或 flavor,得逐个确认对应 test<variant>UnitTest</variant> 任务是否存在且被正确配置。











