Behat以编程方式再次运行场景

时间:2014-10-10 13:17:32

标签: php behat mink scenarios

关于stackoverflow Parameters in Behat 3的问题之后,Ian找到了传递给behat参数的解决方案。

对于环境来说还可以,但对于国家/地区参数我有点困惑。我有这样的功能:

Scenario Outline: Test if first link works
    Given I am on website "<country>"
    Then I visit the url "my-url"
    Then I click on first link

Examples:
    | country |
    | US      |
    | IT      |

这就是我所拥有的,现在我想运行类似的东西:

env="stg" country="US,IT" php53 bin/behat --suite=mySuite

但是通过方案大纲,可以为每个国家/地区运行整个方案。我想做同样的事情,但是通过参数传递的国家列表。

也许使用钩子AfterScenario或类似的东西我可以用不同的配置再次运行我的整个场景?

谢谢!

1 个答案:

答案 0 :(得分:1)

遗憾的是,使用标准工具是不可能的,至少不是没有头疼并重新发明轮子。虽然有趣的问题!

您可以通过在behat.yml中配置套件来实现此目的。你应该有一个带有基本配置的默认套件,以及每种语言的套件:

default:
    extensions:
        Behat\MinkExtension

    suites:
        default:
            paths: […]
            contexts: […]

        US:
            paths: […]
            contexts: […]

        IT:
            paths: […]
            contexts: […]

使用@beforeSuite钩子:

/**
 * @beforeSuite
 *
 * @param BeforeSuiteScope $scope
 */
public static function setUpSuite(BeforeSuiteScope $scope)
{
    $suiteName = $scope->getSpecificationIterator()->getSuite()->getName();

    // If the suite denotes one of the languages, then set it as the main language.
}

这个解决方案有一些缺点:

  1. 除了语言之外,您无法使用套件。
  2. 很多配置重复。
  3. 从钩子设置语言将是一件痛苦的事。您可能需要将其存储为静态属性,并在每个Mink请求发送之前将其传递到标头中,以便您的服务器知道要使用哪种语言。你还需要另一个钩子 - 无论如何,这是另一个痛苦的故事。
  4. 另一个想到的解决方案就是使用另一个PHP / Bash脚本,该脚本将使用country param顺序运行Behat。它也有一些缺点:

    1. 如果你每次使用不同的Behat参数,你可能需要添加传递它们的逻辑。
    2. 运行每个子任务时正确显示Behat结果可能存在问题。
    3. 你仍然需要以某种方式将该语言传递给你的应用程序,但上述建议应该可行。
    4. 如您所见,这不是一项微不足道的任务。就个人而言,我对第二种解决方案有了更好的信念,虽然它可能更及时,但它也为大量定制提供了空间。另一方面,除非每个国家/地区的内容/逻辑完全不同,否则您可能不需要进入这种极端状态。做一些有针对性的检查,语言可以改变,并且它按预期改变就足够了。为40个国家重新运行相同的测试需要数小时,并且不会增加任何重要价值。