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

时间:2017-07-17 19:02:07

标签: python python-3.x bdd python-behave

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

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关键字那样会有意义。

道歉,如果这已在某处得到解答,但搜索很难,因为很难找到针对此类问题的唯一搜索字词

5 个答案:

答案 0 :(得分:3)

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

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 "/"

注意:从导致此ticketfile中计算出来。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

@ 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))

答案 3 :(得分:-1)

您可以尝试这样的事情:

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

答案 4 :(得分:-2)

它为我工作。当您在“Then”语句后面写“And”语句时,它会将其视为两个“Then”语句。你还应该在给定的内部括号中加上你的语句。

尝试如下:

@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