如何让behave测试的precondition在scenario outline前仅执行一次
Scenario Outline 全局仅执行一次前置条件的实现方案
Gherkin 语法中的 Background 设计默认会为每个场景实例(包含 Scenario Outline 中 Examples 的每一行测试用例)都执行一遍前置步骤,没有内置的批量用例仅执行一次前置的语法,你可以通过以下两种常用方案实现需求:
方案一:修改步骤定义增加执行状态标记(改造成本最低)
不需要修改你的 feature 文件,只需要调整 Fan is powered 的步骤实现,增加执行状态判断避免重复运行:
@given("Fan is powered") def step_impl(context): # 先判断该前置是否已经执行过,context 全局生效 if not getattr(context, "fan_power_precondition_done", False): # 注意修正你原有代码的拼写错误:conetxt → context assert context.fan.is_powered # 标记为已执行,后续调用直接跳过 context.fan_power_precondition_done = True
方案二:通过环境钩子实现(适合多场景共用前置)
如果该前置需要给多个 Scenario/Scenario Outline 共用,可以用 Behave 的环境钩子实现:
- 首先给你的 Scenario Outline 增加自定义标记,比如
@once_powered,同时删除原有 Background 里的通电步骤:
# 可以删掉原来的Background,或者保留其他需要每次执行的前置 # Background: # Given 其他需要每次执行的前置 #Test to check fan speed @TEST_FAN-1 @SuperFan @once_powered Scenario Outline: Checking fan speed Given fan is not running When send speed command with <speed> Then fan is running with <speed> Examples: | speed | | 5 | | 50 | | 100 |
- 在项目根目录的
environment.py文件中增加before_scenario钩子逻辑:
def before_scenario(context, scenario): # 只给带@once_powered标记的场景执行一次通电前置 if "once_powered" in scenario.tags and not getattr(context, "fan_power_precondition_done", False): assert context.fan.is_powered context.fan_power_precondition_done = True # 如果需要跨feature重置前置状态,可以增加after_feature钩子 def after_feature(context, feature): context.fan_power_precondition_done = False
内容的提问来源于stack exchange,提问作者Mateusz
相关产品推荐
相关产品推荐

