如何将 parameters.yml 中的 Symfony 参数注入到 Behat 3 配置中?
How to inject Symfony param from parameters.yml into Behat 3 configuration?
我需要为 Behat\MinkExtension
设置 base_url
。
这是我的一部分 app/config/parameters.yml:
parameters:
# ...
behat_base_url: http://my-app.local/app_test.php
# ...
这是我的一部分 behat.yml:
frontend:
gherkin:
filters:
tags: "@frontend"
suites:
javascript:
mink_session: default
mink_javascript_session: selenium2
contexts:
- FeatureContext: ~
extensions:
Behat\Symfony2Extension: ~
Behat\MinkExtension:
base_url: http://my-app.local/app_test.php
sessions:
default:
symfony2: ~
selenium2:
selenium2:
browser: chrome
capabilities:
extra_capabilities:
chromeOptions:
args: ["--start-maximized"]
我可以做这样的事情吗(给parameters.behat_base_url
提供参考)
imports:
- app/config/parameters.yml
# ...
extensions:
Behat\Symfony2Extension: ~
Behat\MinkExtension:
base_url: *parameters.behat_base_url # reference to value from parameters.yml
# ...
或者可能存在另一种权利和 "true" 我可以从 parameters.yml
或其他地方设置 base_url
的方式。所以,任何开发者都会有自己的测试环境配置。
您能说说您是如何解决不同测试环境开发人员配置的问题的吗?
谢谢。
所以。我找到了两个解决方案。
第一种:使用BEHAT_PARAMS
进行配置。例如:
运行 在命令行中。
export BEHAT_PARAMS='{"extensions":{"Behat\MinkExtension":{"base_url":"http://my-app.local/app_test.php"}}}'
注意:在这种情况下它指定了默认参数,所以你不应该在 behat.yml
中定义这些参数(因为它们具有更高的优先级并且会被覆盖)。您可以在 behat docs
中阅读相关信息
但是这个案例不适合我。不想开发者每次都配置环境
第二个:
我在 FeatureContext
中指定了以下方法:
/** @BeforeScenario */
public function beforeScenario(\Behat\Behat\Hook\Scope\BeforeScenarioScope $scenario)
{
if ($scenario->getSuite()->getName() == 'javascript') {
$this->setMinkParameter('base_url', $this->getContainer()->getParameter('behat_base_url'));
}
}
因此,在每个场景之前,我检查套件是否为 javascript
并设置 base_url
。我使用容器从 parameters.yml
获得的值。
也许这有点 "dirty" 技巧,但对我来说效果很好。
从内核获取容器。要注入内核,您应该实现 Behat\Symfony2Extension\Context\KernelAwareContext
并添加方法 setKernel()
:
public function setKernel(KernelInterface $kernel)
{
$this->kernel = $kernel;
}
所以,我选择第二种方式
如果有人知道更优雅的解决方案,请告诉我。
我需要为 Behat\MinkExtension
设置 base_url
。
这是我的一部分 app/config/parameters.yml:
parameters:
# ...
behat_base_url: http://my-app.local/app_test.php
# ...
这是我的一部分 behat.yml:
frontend:
gherkin:
filters:
tags: "@frontend"
suites:
javascript:
mink_session: default
mink_javascript_session: selenium2
contexts:
- FeatureContext: ~
extensions:
Behat\Symfony2Extension: ~
Behat\MinkExtension:
base_url: http://my-app.local/app_test.php
sessions:
default:
symfony2: ~
selenium2:
selenium2:
browser: chrome
capabilities:
extra_capabilities:
chromeOptions:
args: ["--start-maximized"]
我可以做这样的事情吗(给parameters.behat_base_url
提供参考)
imports:
- app/config/parameters.yml
# ...
extensions:
Behat\Symfony2Extension: ~
Behat\MinkExtension:
base_url: *parameters.behat_base_url # reference to value from parameters.yml
# ...
或者可能存在另一种权利和 "true" 我可以从 parameters.yml
或其他地方设置 base_url
的方式。所以,任何开发者都会有自己的测试环境配置。
您能说说您是如何解决不同测试环境开发人员配置的问题的吗?
谢谢。
所以。我找到了两个解决方案。
第一种:使用BEHAT_PARAMS
进行配置。例如:
运行 在命令行中。
export BEHAT_PARAMS='{"extensions":{"Behat\MinkExtension":{"base_url":"http://my-app.local/app_test.php"}}}'
注意:在这种情况下它指定了默认参数,所以你不应该在 behat.yml
中定义这些参数(因为它们具有更高的优先级并且会被覆盖)。您可以在 behat docs
但是这个案例不适合我。不想开发者每次都配置环境
第二个:
我在 FeatureContext
中指定了以下方法:
/** @BeforeScenario */
public function beforeScenario(\Behat\Behat\Hook\Scope\BeforeScenarioScope $scenario)
{
if ($scenario->getSuite()->getName() == 'javascript') {
$this->setMinkParameter('base_url', $this->getContainer()->getParameter('behat_base_url'));
}
}
因此,在每个场景之前,我检查套件是否为 javascript
并设置 base_url
。我使用容器从 parameters.yml
获得的值。
也许这有点 "dirty" 技巧,但对我来说效果很好。
从内核获取容器。要注入内核,您应该实现 Behat\Symfony2Extension\Context\KernelAwareContext
并添加方法 setKernel()
:
public function setKernel(KernelInterface $kernel)
{
$this->kernel = $kernel;
}
所以,我选择第二种方式
如果有人知道更优雅的解决方案,请告诉我。