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

时间:2012-11-08 13:16:12

标签: automated-tests qa web-testing behat mink

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

这是用这个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,但我找不到设置第二台服务器的方法  作为一般设置,而不是重写改变第二个服务器URL的每个功能文件。

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

1 个答案:

答案 0 :(得分: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: ~

然后,将定义的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'],
        );

    }

最后,定义自己的步骤:

/**
 * @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。