如何将 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;
}

所以,我选择第二种方式

如果有人知道更优雅的解决方案,请告诉我。