Android环境下运行Cucumber测试遇多场景异常问题求助
我之前也踩过几乎一模一样的Cucumber Android测试坑,结合你的配置细节和报错情况,给你梳理几个针对性的排查和解决步骤:
1. 先把依赖与Runner配置拉满适配AndroidX
你用的是新版AS,绝对不能混support库,先检查Module级build.gradle的配置是否完全对齐AndroidX和对应版本的Cucumber:
android { defaultConfig { // 指定Cucumber专属的Instrumentation Runner,别用默认的AndroidJUnitRunner testInstrumentationRunner "io.cucumber.android.runner.CucumberAndroidJUnitRunner" // 必须指定feature文件路径,命令行扫描测试全靠这个 testInstrumentationRunnerArguments = [ "plugin": "pretty", "features": "src/androidTest/assets/features" ] } sourceSets { androidTest { // 把feature文件所在的assets目录加入测试资源路径 assets.srcDirs = ['src/androidTest/assets'] } } } dependencies { // 选和你的gradle 4.0.1兼容的Cucumber版本,4.8.1亲测适配 androidTestImplementation 'io.cucumber:cucumber-android:4.8.1' androidTestImplementation 'io.cucumber:cucumber-java:4.8.1' // 所有测试依赖必须是AndroidX的,别混老的support库 androidTestImplementation 'androidx.test.ext:junit:1.1.5' }
划重点:如果你的feature文件放在
src/androidTest/resources下,要同步修改assets.srcDirs和features参数,Cucumber Android对feature文件的位置有严格要求,放错了命令行根本找不到测试用例。
2. 解决"No instrumentation registered!"报错
这个报错90%是因为你在步骤类的静态代码块/类初始化阶段调用了InstrumentationRegistry,这时候测试还没完成初始化,自然拿不到Instrumentation实例。
把Instrumentation的调用移到@Before钩子或者步骤方法里就行:
import androidx.test.platform.app.InstrumentationRegistry; import io.cucumber.java.Before; public class MyStepDefinitions { private Context appContext; @Before public void initTestContext() { // 测试初始化阶段再拿Context,就不会报错了 appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); } // 你的步骤实现方法... }
另外,别忘了@CucumberOptions要放在一个空类上,不用继承任何类,Cucumber会自动识别它:
@CucumberOptions( features = "features", // 和build.gradle里的路径对应 glue = "com.your.package.steps" // 步骤类所在的包名 ) public class CucumberTestRunner {}
3. 搞定命令行connectedCheck无测试结果的问题
命令行跑不出测试,大多是gradle没正确识别Cucumber的测试用例。你可以试试直接指定Cucumber任务运行,比connectedCheck更精准:
./gradlew connectedAndroidTest -Pandroid.testInstrumentationRunnerArguments.features=src/androidTest/assets/features/your_target_feature.feature
如果这个命令能跑通,说明connectedCheck可能没包含Cucumber测试,或者需要在gradle里配置测试分类。另外检查gradle.properties里有没有禁用测试扫描的配置,比如android.testInstrumentationRunnerArguments.disableAnalytics=true这类,别让它干扰测试识别。
4. 解决am instrument进程崩溃的问题
手动执行am instrument时,命令格式必须精准,指定正确的测试包名和Cucumber Runner:
adb shell am instrument -w com.your.app.package.test/io.cucumber.android.runner.CucumberAndroidJUnitRunner
如果还是崩溃,去logcat看具体的崩溃栈,大概率是依赖冲突或者Cucumber版本和gradle不兼容。比如你用gradle 4.0.1,就别用Cucumber 5.x+,高版本需要更高的gradle支持。另外要确保主应用和测试包的签名一致,不然也会启动失败。
5. 几个容易忽略的排查点
- 插件版本更新:你用的Gherkin(193.6911.14)和Cucumber(193.6494.1)是适配AS 3.6.x的,如果你用的是AS Arctic Fox及以后的版本,这些插件太老了,建议更新到最新适配版。
- 清理AS缓存:执行
File -> Invalidate Caches / Restart,然后重新同步gradle,缓存坑真的太多了。 - 目录结构校验:确保feature文件在
src/androidTest/assets/features下,步骤类在src/androidTest/java对应包下,@CucumberOptions的glue参数一定要指向步骤类的包名,差一个字母都不行。
内容的提问来源于stack exchange,提问作者1048576

