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

Cucumber/Gherkin技术问询:Background中可放When步骤吗?如何处理场景依赖?

问题1:Cucumber/Gherkin的Background模块里能放When类型步骤吗?

简短说:不可以,也不应该这么做。

Background的核心作用是给所有后续场景提供统一的「前置状态」,对应Gherkin里的Given步骤——用来描述“已经存在的情况”,而When步骤是用来触发某个动作,属于场景本身的行为逻辑。

要是硬把When塞到Background里,会带来几个麻烦:

  • 场景失去独立性:每个场景都会自动执行这个动作,你想单独调试某个场景时就会出问题
  • 可读性拉胯:其他同事看用例的时候,会困惑为什么“前置准备”里会有操作类步骤,完全不符合BDD的语义规范

所以老老实实在Background里只用Given步骤,动作类的逻辑都放到具体场景里的When块中。


问题2:场景间有前置依赖该怎么处理?

你的例子里,第二个移除物品的场景需要依赖第一个添加物品后的状态,这种情况千万别想着让场景按顺序执行来继承状态——Cucumber的场景设计就是要独立可运行的,依赖顺序的话迟早掉坑里(比如单独跑第二个场景就直接失败,或者调整场景顺序后全崩)。

给你几个靠谱的解决方案:

方案1:在后续场景的Given里直接构建目标状态

不要依赖前一个场景的执行结果,而是在第二个场景的Given里直接把需要的状态造出来。比如把第二个场景改成:

场景:从车内移除物品
Given 我已购买一辆新车,且后视镜上挂着毛绒骰子
When 我移除后视镜上的毛绒骰子
Then 车内不应存在毛绒骰子

你还可以把“创建新车+添加指定物品”封装成一个可复用的Given步骤,比如Given 我有一辆带有<物品名称>的新车,这样写用例会更简洁。

方案2:用Scenario Outline(场景大纲)统一管理相关操作

如果添加和移除是一组逻辑相关的操作,用场景大纲来写会更高效,还能减少重复代码:

Scenario Outline: 车内物品的添加与移除操作
Given 我已购买一辆新车
When 我<操作>后视镜上的毛绒骰子
Then 车内<状态>毛绒骰子

Examples:
| 操作   | 状态   |
| 添加   | 存在   |
| 移除   | 不存在 |

这种方式把相同的前置和断言抽出来,只变化操作和预期结果,维护起来也方便。

方案3:绝对不要依赖场景执行顺序

哪怕现在Cucumber默认按文件顺序跑场景,也别依赖这个!哪天你调整了用例顺序,或者单独运行某个场景,就会直接失败。保持每个场景的独立性,才是写可靠Cucumber用例的关键。

内容的提问来源于stack exchange,提问作者physicsboy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 11:08:43