Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 不能以编程方式再次运行场景_Php_Behat_Mink_Scenarios - Fatal编程技术网

Php 不能以编程方式再次运行场景

Php 不能以编程方式再次运行场景,php,behat,mink,scenarios,Php,Behat,Mink,Scenarios,在一个关于stackoverflow的问题之后,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: |

在一个关于stackoverflow的问题之后,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      |
但有了一个情景大纲,整个情景将针对每个国家运行。我想做同样的事情,但要有一个传入参数的国家列表

也许有了《赛纳里奥之后的钩子》或者类似的东西,我可以用不同的配置再次运行我的整个场景


谢谢

不幸的是,使用标准工具是不可能做到这一点的,至少在没有头痛和重新发明轮子的情况下是不可能的。一个有趣的问题

您可以通过在
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.
}
此解决方案有几个缺点:

  • 除了语言,您不能将套件用于任何其他用途
  • 大量的配置重复
  • 从钩子中设置语言将是一件痛苦的事。您可能需要将其存储为静态属性,并在发送每个Mink请求之前将其传递到标头中,以便服务器知道使用哪种语言。你需要另一个钩子——不管怎样,这是另一个痛苦的故事
  • 想到的另一个解决方案是只使用另一个PHP/Bash脚本,该脚本将使用country参数顺序运行Behat。它也有一些缺点:

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

    /**
     * @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.
    }