7

我正在使用 Behat 和 Mink 来测试几个站点。其中两个使用单点登录,所以我的一个测试包括登录一个站点,转到第二个站点并检查我是否已登录。

这是通过以下行为代码完成的:

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 设置,但是我找不到将第二台服务器设置为常规设置的方法,而不是重写每个功能文件来更改第二台服务器的 URL。

有什么方法可以声明变量、常量或可以存储在每台机器不同的文件中的东西吗?

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

然后,包括一个新步骤来检查用户是否已登录 master。

于 2012-11-12T11:15:09.847 回答