Cucumber中重跑Runner类先于原Runner执行的顺序调整问题
我有三个Runner类——CucumberSerenityBDDAPIAutoRunner、CucumberSerenityBDDUIAutoRunner、CucumberSerenityBDDUIReRunner,都放在同一个文件夹下。原本想按字母升序让重跑类CucumberSerenityBDDUIReRunner最后执行,但实际它反而比原Runner类CucumberSerenityBDDUIAutoRunner先运行,导致Gradle执行时抛出CucumberException,提示解析target/failedrerun.txt失败。该怎么调整才能让它们按正确顺序执行?
方案一:显式配置Gradle测试任务的依赖与执行顺序
在build.gradle(Groovy DSL)或build.gradle.kts(Kotlin DSL)中,拆分测试任务并设置依赖关系,确保重跑任务必须在主UI测试任务完成后再执行:
Groovy DSL示例:
// 主UI测试任务:仅执行CucumberSerenityBDDUIAutoRunner task uiAutoTest(type: Test) { include '**/CucumberSerenityBDDUIAutoRunner.class' // 其他测试配置,如JVM参数、报告输出等 } // API测试任务:仅执行CucumberSerenityBDDAPIAutoRunner task apiAutoTest(type: Test) { include '**/CucumberSerenityBDDAPIAutoRunner.class' } // UI重跑任务:仅执行CucumberSerenityBDDUIReRunner task uiReRunTest(type: Test) { include '**/CucumberSerenityBDDUIReRunner.class' // 依赖主UI测试任务,确保它先执行完成 dependsOn uiAutoTest // 强制指定执行顺序,避免并行或乱序 mustRunAfter uiAutoTest } // 自定义总任务,按需求顺序执行所有测试 task runAllTests(dependsOn: [apiAutoTest, uiAutoTest, uiReRunTest]) { // 若需要API测试在UI测试前执行,可添加以下配置 uiAutoTest.mustRunAfter apiAutoTest }
执行时直接运行./gradlew runAllTests即可按设定顺序执行所有测试。
方案二:调整Runner类命名,适配字母升序规则
如果依赖类名的字母排序来控制执行顺序,可修改重跑类的命名,让它的字母排序在主UI Runner之后。比如将CucumberSerenityBDDUIReRunner改为CucumberSerenityBDDUIZReRunner——字母Z会让它在CucumberSerenityBDDUIAutoRunner之后排序,从而保证执行顺序符合预期。
这种方法较为取巧,适合不想修改Gradle配置的场景,但灵活性不如显式配置依赖。
方案三:使用Serenity原生重跑机制替代自定义ReRunner
Serenity本身内置了失败用例重跑功能,无需手动编写ReRunner类,可直接在serenity.properties中配置:
# 开启失败用例重跑 serenity.rerun.failures=true # 设置重跑次数 serenity.rerun.count=1
配置后,Serenity会自动在主测试执行完成后,重跑所有失败的用例,从根源避免了自定义ReRunner带来的执行顺序问题。
内容的提问来源于stack exchange,提问作者Susanta Adhikary

