定义适用于多个关键字(例如给定、何时和然后)的行为步骤



有没有办法编写适用于多个关键字的步骤。比如说我的功能是:

Scenario: Something happens after navigating 
Given I navigate to "/"
And say some cookie gets set
When I navigate to "/some-other-page"
Then something happens because of that cookie

我试图避免同时定义两者:

@given('I navigate to "{uri}"')
def get(context, uri):
current_url = BASE_URL + uri
context.driver.get(current_url)
@when('I navigate to "{uri}"')
def get(context, uri):
current_url = BASE_URL + uri
context.driver.get(current_url)

如果您只定义一个并尝试同时使用它,则会收到raise NotImplementedError(u'STEP:错误。使用上面的例子,它并没有那么糟糕,因为步骤很简单,但重复代码似乎是不好的做法,你可能会在更复杂的事情上发生同样的事情,对我来说,如果有@all或@any关键字,这似乎是有意义的。

抱歉,如果这已在某处得到解答,但很难搜索,因为很难找到此类问题的独特搜索词

事实证明,这可以使用@step来完成。

例如
from behave import step
@step('I navigate to "{uri}"')
def step_impl(context, uri):
current_url = BASE_URL + uri
context.driver.get(current_url)

将适用于:

Scenario: Demo how @step can be used for multiple keywords
Given I navigate to "/"
When I navigate to "/"
Then I navigate to "/"

注意:从导致此文件的票证中弄清楚了这一点。

如果您不想使用@step,还可以执行以下操作:

@and(u'I navigate to "{uri}"')
@when(u'I navigate to "{uri}"')
@given(u'I navigate to "{uri}"')
def get(context, uri):
current_url = BASE_URL + uri
context.driver.get(current_url)

@given、@when和@then装饰器所代表的含义之间存在概念差异。您遇到的情况是,一个步骤适用于所有、部分或仅应用于一个。

当步骤仅适用于 2 种情况时,@step都是易于使用的,然后依靠测试编写者仅在正确的情况下使用该步骤。我鼓励人们不要这样做。请改用以下示例。

@given('step text')
@when('step text')
def step_impl(context):
pass

但是,当一个步骤真正适用于所有情况时,一个很好的例子是延迟步骤,然后使用@step装饰器:

@step('delay {duration} second(s)')
def step_impl(context, duration):
time.sleep(float(duration))

你可以尝试这样的事情:

作为网络用户 鉴于我导航到"/"并说设置了一些cookie 然后我导航到"/some-other-page" 因为那块饼干而发生了一些事情

它对我有用。当您在"Then"语句后面编写"And"语句时,它会将其视为两个"Then"语句。此外,您应该在给定的括号中包括u',然后是语句括号。

尝试如下:

@given(u'I navigate to "{uri}"')
def get(context, uri):
current_url = BASE_URL + uri
context.driver.get(current_url)
@given(u'say some cookie gets set')
def get(context, uri):
current_url = BASE_URL + uri
context.driver.get(current_url) 
@then(u'I navigate to "/some-other-page"')
def step_impl(context):
//your code
@then(u'something happens because of that cookie')
def step_impl(context):
//your code

最新更新