7

BehatとMinkを使用していくつかのサイトをテストしています。それらのうちの2つはシングルサインオンを使用しているので、私のテストの1つには、1つのサイトへのログイン、2番目のサイトへの移動、およびログインしていることの確認が含まれます。

これは、次のbehatコードで実行されます。

Feature: SSO
  In order to login in all related sites
  As a anonymous user
  I want to login in just one site


Scenario: Login with normal user
  Given I am on "/user/login"
  When I fill in "name" with "username"
    And I fill in "pass" with "password"
    And I press "login"
  Then I should see "My account"
    And I go to "http://server.developer1.workstations/"
  Then I should see "Close session"

これは機能しますが、問題は次の行です。

    And I go to "http://server.developer1.workstations/"

URLが異なるさまざまな環境(ローカル開発者、開発者、スタギング)があるため、すべてのマシンで機能するテストを作成することはできません。最初のサーバーはマシンごとに異なるbase_url設定を使用できるため問題ありませんが、2番目のサーバーのURLを変更するすべての機能ファイルを書き直す代わりに、2番目のサーバーを一般設定として設定する方法が見つかりません。

マシンごとに異なるファイルに格納できる変数、定数、または何かを宣言する方法はありますか?

4

1 に答える 1

7

これを解決するには、次のことが可能です。

  • マシンに依存するファイルまたは環境変数でマスターとスレーブのURLを定義します。たとえば、behat.ymlは、いくつかの追加のパラメータを使用して、すべてのマシンに合わせてカスタマイズできます。
default:
  context:
    parameters:
       master_url: 'http://master_site.workstation1'
       slave1_url: 'http://.slave1.master_site.workstation1'
       slave2_url: 'http://.slave2.master_site.workstation1'
  extensions:
    Behat\MinkExtension\Extension:
      slave1_url: 'http://.slave1.master_site.workstation1'
      goutte: ~
      selenium2: ~

次に、定義されたパラメータを独自のFeatureContextクラスに含めます。

class FeatureContext extends MinkContext
{
    /**
     * Initializes context.
     * Every scenario gets it's own context object.
     *
     * @param array $parameters context parameters (set them up through behat.yml)
     */
    public function __construct(array $parameters)
    {
        $this->site_urls = array(
          'master' => $parameters['master_url'],
          'slave1' => $parameters['slave_url1'],
          'slave2' => $parameters['slave_url2'],
        );

    }

最後に、独自のステップを定義します。

/**
 * @Then /^I should be logged in master$/
 */
public function iShouldBeLoggedInMaster()
{
  $this->visit($this->site_urls['master']);
  $this->assertPageContainsText('Close session');      
}  

スレーブサイトのbase_urlを使用したこのステップチェックのシナリオは、次のようになります。

Scenario: Login as normal user
  Given I am on "/user/login"  
  When I fill in "name" with "username"
    And I fill in "pass" with "password"
    And I press "Login"
  Then I should see "My account"
  And I should be logged in master

次に、ユーザーがマスターにログインしているかどうかを確認するための新しい手順を含めます。

于 2012-11-12T11:15:09.847 に答える