重建后Instrumentation Tests失效:未找到测试用例求助
看起来你遇到了一个挺棘手的增量构建问题——第一次运行测试一切正常,但修改测试文件后,测试类居然从APK里消失了,导致"No tests found"错误。结合你的build.gradle配置和问题描述,我整理了几个最可能的原因和对应的解决方案:
1. 增量构建的缓存残留(最可能的原因)
虽然你加了--no-build-cache参数,但Android Gradle Plugin(AGP)的增量构建有时候还是会出现识别错误,尤其是修改测试类后,AGP可能没有正确标记测试代码需要重新编译,反而错误地将旧的测试类从构建产物中排除。
解决方案:
执行彻底的清理+构建命令,强制重新编译所有代码(包括测试代码):
./gradlew clean connectedDebugAndroidTest
如果这个命令能正常运行测试,那基本可以确定是增量构建的缓存问题。后续如果再遇到类似情况,先尝试clean再构建。
2. 测试类的结构/注解被意外破坏
修改测试文件时,可能不小心改动了测试类的关键结构,导致Gradle不再将其识别为有效的测试类,从而不打包进APK。需要检查以下几点:
- 测试类是否有
@RunWith(AndroidJUnit4.class)注解(如果是JUnit4测试) - 每个测试方法是否都标注了
org.junit.Test注解(注意不要导入JUnit 3的junit.framework.Test) - 测试方法是否是
public、无返回值、无参数的 - 测试类本身是否是
public的非抽象类
举个正确的测试类结构示例:
import android.support.test.runner.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; @RunWith(AndroidJUnit4.class) public class DatabaseTest { @Test public void testDatabaseInsert() { // 测试逻辑 } }
3. 测试源集配置的潜在问题
你的build.gradle中给androidTest.assets添加了schema目录,这个配置本身没问题,但可以确认测试源集的Java路径是否正确(默认是src/androidTest/java)。可以显式指定测试源集的Java目录,避免AGP错误识别:
android { // ...其他配置 sourceSets { androidTest { java.srcDirs = ['src/androidTest/java'] assets.srcDirs += files("$projectDir/schemas".toString()) } } }
4. Lint或构建优化的干扰
虽然你设置了lintOptions.abortOnError false,但某些Lint警告可能还是会导致AGP跳过测试类的打包。另外,检查debug构建类型是否意外开启了代码混淆:
buildTypes { debug { minifyEnabled false // 显式关闭,默认也是false,但确保没有被覆盖 } release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' } }
5. AGP与Gradle版本兼容性问题
你使用的compileSdkVersion是27,对应的AGP版本应该在3.0.x到3.1.x之间,如果你的Gradle版本和AGP版本不匹配,也可能导致增量构建异常。可以检查项目根目录的build.gradle,确保两者版本兼容(比如AGP 3.1.4对应Gradle 4.4到5.6.4),必要时升级到对应版本的稳定版。
额外排查步骤
如果以上方案都没解决,建议:
- 查看构建日志(用
-i参数),搜索DatabaseTest关键词,看编译阶段是否有报错,或者打包阶段是否有“skipping class”类的提示 - 尝试用Android Studio直接运行测试类,看是否能识别到测试——如果AS能运行,说明是命令行Gradle的配置问题;如果AS也找不到,那就是测试类本身的结构问题
内容的提问来源于stack exchange,提问作者Erik Johansson

