定义适用于多个关键字的 Behave 步骤(例如 Given、When 和 Then)
Define a Behave step that works for multiple keywords (e.g. Given, When, and Then)
有没有办法编写适用于多个关键字的步骤。比如说我的特点是:
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 关键字。
抱歉,如果这个问题已在某处得到解答,但很难搜索,因为很难为此类问题找到独特的搜索词
您可以尝试这样的操作:
作为网络用户
假设我导航到“/”并说设置了一些 cookie
然后我导航到“/some-other-page”
由于那个 cookie
发生了一些事情
它对我有用。当您在 "Then" 语句之后编写 "And" 语句时,它会将其视为两个 "Then" 语句。您还应该在 given 和 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
事实证明这可以使用 @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))
有没有办法编写适用于多个关键字的步骤。比如说我的特点是:
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 关键字。
抱歉,如果这个问题已在某处得到解答,但很难搜索,因为很难为此类问题找到独特的搜索词
您可以尝试这样的操作:
作为网络用户 假设我导航到“/”并说设置了一些 cookie 然后我导航到“/some-other-page” 由于那个 cookie
发生了一些事情它对我有用。当您在 "Then" 语句之后编写 "And" 语句时,它会将其视为两个 "Then" 语句。您还应该在 given 和 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
事实证明这可以使用 @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))