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

pytest-bdd如何不新增函数即可在不同测试步骤间修改变量值

pytest-bdd跨步骤修改同名变量解决方案

问题原因

你当前运行结果不符合预期的核心原因有两个:

  • 冗余的无参数解析装饰器@given("the x is <x>")没有参数解析能力,无法正确读取Scenario Outline中Examples替换后的参数值,只会复用第一次的变量结果
  • pytest-bdd的given步骤默认会缓存fixture返回值,同一个fixture函数多次调用时会直接复用首次执行结果,不会重新传入新参数运行

调整方案

1. Feature文件无需修改,原内容保留即可

Feature: Calculator
    Scenario Outline: simple sum
        Given the x is 1
        And the x is <x>

    Examples:
        | x |
        | 5 |

2. 调整Python实现代码

需要做两处修改:

  • 删除冗余的无参数解析given装饰器,仅保留带parsers.parse的装饰器即可匹配所有对应格式的步骤,包括占位符替换后的Scenario Outline步骤
  • 给given装饰器添加cacheable=False参数,关闭fixture缓存,每次调用步骤都会重新执行函数,传入最新参数

调整后完整代码如下:

from pytest_bdd import given, scenario, parsers
import logging
info = logging.getLogger('test').info

@scenario("test.feature", "simple sum")
def test_outlined():
    pass

@given(parsers.parse("the x is {x}"), cacheable=False)
def f(x):
    info("x=%s" % x)
    # 若后续步骤需要使用x的最新值,直接返回即可,后续步骤注入f fixture就能拿到最新值
    return int(x)

效果验证

调整后运行测试,日志输出就会匹配你的预期:

2021-08-31 14:23:30 INFO x=1
2021-08-31 14:23:30 INFO x=5

额外说明

如果后续有其他步骤需要使用x的最新取值,直接在对应步骤的函数参数中注入f即可获取到最近一次设置的x值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 21:06:02