如何使用不同环境(不同的URL)进行同一测试中的两个站点进行测试

san*_*nte 7 automated-tests qa web-testing behat mink

我正在使用Behat和Mink来测试几个站点.其中两个使用Single Sign On,因此我的一个测试包括在一个站点登录,转到第二个站点并检查我已登录.

这是使用这个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"
Run Code Online (Sandbox Code Playgroud)

这有效,但问题是这一行:

    And I go to "http://server.developer1.workstations/"
Run Code Online (Sandbox Code Playgroud)

我们有不同的环境(本地开发,开发,交错)和不同的URL,因此我无法编写适用于每台机器的测试.第一台服务器没关系,因为我可以为每台机器设置不同的base_url设置,但我找不到将第二台服务器设置为常规设置的方法,而不是重写改变第二台服务器URL的每个功能文件.

有没有办法声明变量,常量或可以存储在每个机器不同的文件中的东西?

san*_*nte 7

为了解决这个问题,有可能:

  • 在机器相关文件或环境变量中定义主URL和从属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: ~
Run Code Online (Sandbox Code Playgroud)

然后,将定义的param包含到您自己的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'],
        );

    }
Run Code Online (Sandbox Code Playgroud)

最后,定义自己的步骤:

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

使用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
Run Code Online (Sandbox Code Playgroud)

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