如何编写支持多个单词的步骤实现

时间:2017-12-11 10:52:44

标签: bdd gherkin python-behave

示例小黄瓜

# Gherkin snip
When waiting for 30 seconds
# or
When waiting for 5 s

我想在一步定义中实现上述步骤。我尝试了以下步骤实现。

from behave import *
use_step_matcher("re")

@when(u"waiting for (?P<time>\d+) (s|seconds)")
def step_impl(context, time):    
  pass

运行此操作会导致此错误:

  

TypeError:step_impl()获得了关键字参数的多个值&#39; time&#39;

表现将其作为参数提取。

这样做的好习惯是什么?

2 个答案:

答案 0 :(得分:0)

您可以编写两个步骤定义,每个案例一个。这会减少你的问题。然后,这两个步骤将委托给执行实际调用的辅助方法。

当下一个要求出现并且您希望在同一步骤中组合三个内容时,可以更容易地在一个步骤中捕获参数并将其委托给您已有的相同帮助方法。

这很可能是我的方法,因为我会发现这更容易理解和维护。

您不想编写聪明的代码。聪明的代码非常复杂,以便您将来理解和改变。死的简单代码总是更好。

答案 1 :(得分:0)

我遇到了类似的问题,经过多次尝试,我发现添加虚拟参数_unused可以解决此问题:

@when(u"waiting for (?P<time>\d+) (s|seconds)")
def step_impl(context, _unused, time):    
  pass

我的类似问题是关于negative lookahead assertion正则表达式:

@when(r'buy')
@when(r'buy (?P<home_owner>((?!.* car).)+) home')
@when(r'buy (?P<car_owner>((?!.* home).)+) car')
@when(r'buy (?P<home_owner>.+) home and (?P<car_owner>.+) car')
def buy(context, home_owner="default", car_owner="default"):
    pass

我已通过拆分单个函数并添加参数_unused来解决此问题:

@when(r'buy')
@when(r'buy (?P<home_owner>.+) home and (?P<car_owner>.+) car')
def buy1(context, home_owner="default", car_owner="default"):
    pass

@when(r'buy (?P<home_owner>((?!.* car).)+) home')
@when(r'buy (?P<car_owner>((?!.* home).)+) car')
def buy2(context, _unused, home_owner="default", car_owner="default"):
    buy1(context, home_owner, car_owner)