首页 文章

重复使用黄瓜步骤

提问于
浏览
96

我想重用一些Cucumber步骤,但似乎找不到正确的方法 .

我想写一个像这样的步骤:

Given /^I login with (.*) credentials$/ |type|
  # do stuff with type being one of "invalid" or "valid"
end

但是又有另一个步骤:

Given /^I login successfully$
  # call "Given I login with valid credentials"
end

因此在测试用户身份验证时我可以使用前者,但大多数其他地方,我可以使用后者,而不是实际上必须重新编码 .

有没有办法调用其他步骤,或者我只是将逻辑放在辅助方法中,并从每个任务调用所述方法(基本上是一个方法提取重构,在阅读我的问题后让我相信这实际上是最好的方法无论如何)?

5 回答

  • 9

    最好用%{}包装您的步骤而不是引号 . 然后,您不需要转义您需要经常使用的双引号:

    Given /^I login successfully$
      step %{I login with valid credentials}
    end
    
    Given /^I login with (.*) credentials$/ |type|
      # do stuff with type being one of "invalid" or "valid"
    end
    
  • 101

    UPDATE :不推荐使用下面介绍的方法 . 从另一个步骤中调用步骤的推荐方法现在看起来像这样:

    Given /^I login successfully$/
        step "I login with valid credentials" 
    end
    

    旧的,弃用的方法(供参考):

    您可以通过以下其他步骤调用步骤:

    Given /^I login successfully$/
      Given "I login with valid credentials"
      Then "I should be logged in"
    end
    

    如果要素中的所有方案都需要此(或其他步骤),您还可以使用常用步骤为每个要素添加背景,如下所示:

    Background:
      Given I log in with valid credentials
    
    Scenario: Change my password
      Given I am on the account page
    
  • 1

    请注意,在最近版本的黄瓜中调用步骤中的步骤的方法已经改变,如果出现"WARNING: Using 'Given/When/Then' in step definitions is deprecated, use 'step' to call other steps instead:/path/to/step_definitions/foo_steps.rb:631:in `block in ' "之类的错误,您将会看到 . 有关详细信息,请参阅cucumber wiki .

    更改的要点是您现在应该使用 stepsteps 方法 .

    When /^I make all my stuff shiny$/
      step "I polish my first thing"
    end
    
    When /^I make all my stuff shiny$/
      steps %Q{
        When I polish my first thing
        When I shine my second thing
      }
    end
    
  • 100

    从步骤定义调用步骤是一种不好的做法,并且some disadvantages

    • 如果场景失败并且存在嵌套的步骤调用,则只会获得堆栈跟踪中最后一次调用的步骤定义 . 可能很难找到最后一个stepdef被调用的地方

    • 调用stepdef有时比ruby方法更难找到和读取

    • Ruby方法比调用步骤defs中的步骤提供更多功能

    AslakHellesøyrecommends将流行动作提取到World而不是重复使用步骤 . 它将这些操作隔离在一个地方,使这个代码更容易找到 . 您也可以将代码提取到常用的Ruby类或模块中 .

    #/support/world_extensions.rb
    module KnowsUser
      def login
        visit('/login')
        fill_in('User name', with: user.name)
        fill_in('Password', with: user.password)
        click_button('Log in')
      end
    
      def user
        @user ||= User.create!(:name => 'Aslak', :password => 'xyz')
      end
    end
    World(KnowsUser)
    
    #/step_definitions/authentication_steps.rb
    When /^I login$/ do
      login
    end
    
    Given /^a logged in user$/ do
      login
    end
    

    以下是关于Cucumber邮件列表中主题的有用讨论 - link

  • 41

    重用功能文件中的关键字,这将提供代码可重用性 .

    强烈建议不要在步骤defs中调用步骤defs .

    我会这样写我的功能文件,

    Scenario Outline: To check login functionality
        Given I login with "<username>" and "<password>"
        Then I "<may or may not>" login successfully
    
    Examples:
        |username|password|may or may not|
        |paul    |123$    |may           |
        |dave    |1111    |may not       |
    

    在我的步骤定义中,(这是Java)

    @Given(I login with \"([^\"]*)\" and \"([^\"]*)\"$)
    public void I_login_with_and(String username, String password){
    
       //login with username and password
    
    }
    
    @Then(I \"([^\"]*)\" login successfully$)
    public void I_login_successully_if(String validity){
    
        if(validity.equals("may")){
            //assert for valid login
        }
        else
        if(validity.equals("may not")){
            //assert for invalid login
        }
    }
    

    通过这种方式,有很多代码可重用性 . 同样的Given和Then处理有效和无效的场景 . 同时,您的功能文件对读者有意义 .

相关问题