You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Cucumber中重跑Runner类先于原Runner执行的顺序调整问题

解决Gradle中Serenity Cucumber 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 03:50:21