104

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

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

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

4

5 に答える 5

103

ステップ内でステップを呼び出す方法は、cucumber の最近のバージョンでは変更されていることに注意してください。「警告: ステップ定義で 'Given/When/Then' を使用することは非推奨です。'step' を使用してください。代わりに他のステップを呼び出します: /path/to/step_definitions/foo_steps.rb:631:in `block in ' ". 詳細については、きゅうりの 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
于 2011-12-06T05:24:59.653 に答える
102

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
于 2009-05-28T11:05:55.280 に答える
43

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

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

Aslak Hellesø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 メーリング リストの件名に関する有益な議論です -リンク

于 2012-03-02T20:01:36.303 に答える
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
于 2012-02-21T03:22:55.717 に答える
1

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

ステップ定義内でステップ定義を呼び出すことは強く推奨されません。

機能ファイルをこのように記述します。

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
    }
}

このように、多くのコードの再利用性があります。同じ Give and Then は、有効なシナリオと無効なシナリオの両方を処理します。同時に、機能ファイルは読者にとって意味のあるものです。

于 2013-05-30T22:29:13.740 に答える