web-dev-qa-db-ja.com

キュウリの手順を再利用する

キュウリの手順を再利用したいのですが、正しい方法が見つからないようです。

私は次のようなステップを書きたいです:

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

したがって、ユーザー認証のテストでは前者を使用できますが、他のほとんどの場所では後者を使用でき、実際にコードを再現する必要はありません。

他のステップを呼び出す方法はありますか、それともヘルパーメソッドにロジックを入れて、各タスクからメソッドを呼び出しますか(基本的にメソッド抽出リファクタリング、私の質問を読んだ後、実際にそれが最良の方法だと信じさせます)とにかく)?

101
Daniel Huckstep

[〜#〜] 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
101
tomafro

最近のバージョンのキュウリでは、ステップ内でステップを呼び出す方法が変更されていることに注意してください。代わりに他のステップを呼び出します:/path/to/step_definitions/foo_steps.rb:631:in `block in '"。詳細については cucumber wiki をご覧ください。

変更の要点は、stepまたはstepsメソッドを使用する必要があることです。

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
102
michaeltwofish

ステップ定義からステップを呼び出すことは悪い習慣であり、 いくつかの欠点 があります。

  1. シナリオが失敗し、ネストされたステップ呼び出しがある場合、スタックトレースで最後に呼び出されたステップ定義のみを取得します。最後のstepdefが呼び出された場所を見つけるのは難しいかもしれません
  2. Stepdefの呼び出しは、Rubyメソッドよりも見つけて読むのが難しい場合があります
  3. Rubyメソッドは、ステップ定義からステップを呼び出すよりも強力です

AslakHellesøy 推奨 ステップを再利用する代わりに、人気のアクションを World に抽出します。これらのアクションを1か所に分離し、このコードを見つけやすくします。通常の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

42
Andrei Botalov

ステップを引用符ではなく%{}で囲むのが最適です。その後、頻繁に使用する必要がある二重引用符をエスケープする必要はありません。

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
9
Rimian

コードの再利用性を提供する機能ファイルのキーワードを再利用します。

Step defs内でstep 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は、有効なシナリオと無効なシナリオの両方を処理します。同時に、機能ファイルは読者にとって意味があります。

1
LINGS