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

