定义适用于多个关键字的 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 "/"

注意:从 ticket which led to this file.

中得出这一点

如果不想使用@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))