我正在使用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的每个功能文件。
有没有办法声明变量,常量或可以存储在每台机器不同的文件中的东西?
答案 0 :(得分:7)
要解决这个问题,可以:
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。