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
相关产品推荐
相关产品推荐

