使用Calabash测试Android应用遇INSTALL_FAILED_TEST_ONLY错误,疑与Gradle版本有关
嘿,这个问题我之前碰到过,确实和你升级到Gradle 3.0.1有直接关系!咱们一步步来拆解和解决:
问题根源分析
首先看最开头的核心错误:
adb: failed to install /Users/sonia/Documents/calabash-test-android/app-release.apk: Failure [INSTALL_FAILED_TEST_ONLY: installPackageLI]
Gradle 3.0及以上版本默认会把debug构建的APK标记为test-only,而Calabash默认调用adb安装时没有添加允许安装test-only包的参数,直接导致安装失败。后面的undefined method 'chomp' for nil:NilClass错误是连锁反应——因为APK安装失败,脚本里获取应用包名、路径等信息的变量变成了nil,调用chomp方法自然就报错了。
具体解决方案
你可以根据自己的需求选下面任意一种方案:
方案1:修改Gradle配置,禁用test-only标记
在你的app模块build.gradle文件中,添加或修改以下配置,让debug构建不再被标记为test-only:
android { ... buildTypes { debug { // 禁用test-only属性 testFunctionalTest false ... } release { ... } } }
或者也可以在defaultConfig里明确指定测试构建类型(适配AndroidX或旧Support库都能用):
android { defaultConfig { ... testBuildType = "debug" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } }
修改后重新构建APK,再运行Calabash命令即可。
方案2:给Calabash命令添加安装参数
如果你不想改动Gradle配置,可以直接在Calabash的run命令里加上adb允许安装test-only包的专属参数:
bundle exec calabash-android run --install-option="-t" app-release.apk
-t参数是adb专门用来放行test-only APK安装的,加上之后就能绕过这个限制。
方案3:检查Release包的构建配置
如果你测试的是release包,还要确认release构建的配置里没有被误加test-only相关设置。确保buildTypes.release块里没有testFunctionalTest true这类配置,避免release包也被标记为test-only。
验证
改完之后,先重新构建你的APK,再执行Calabash测试命令,应该就能正常安装并运行测试了。
内容的提问来源于stack exchange,提问作者Andrews

