Behat中外部文件中的步骤定义

时间:2011-09-11 11:26:52

标签: php testing bdd behat

Behat默认查找名为FeatureContext的文件中的步骤定义(一个文件中的所有步骤) 有很多步骤,很难维护这么大的文件。

我希望每个功能文件都有一个定义文件。

如何在外部文件中使用步骤定义?

e.g。

homepage.feature
HomepageContext extends FeatureContext

3 个答案:

答案 0 :(得分:25)

Behat有多种选项可供您将FeatureContext拆分为多个类。首先,你可以使用老式的php5继承。如果继承不是您想要的,Behat也支持子上下文:“Using Subcontexts”。

接下来,如果您想以与FeatureContext不同的方式命名您的课程,则可以在behat.yml配置文件的“Context Configuration”部分重新定义该课程。

这样,您可以将公共定义和挂钩拆分为单独的类,并在其他功能套件中使用它们以及子转换或继承。

但你的问题也问:

  

我希望每个功能文件都有一个定义文件。

这个要求是完全错误的。 Behat和Scenario BDD就是用业务术语描述您的应用程序行为并为描述的行为创建测试字典。牢记这一点,您逻辑上不能为一个功能集提供多个不同的词典。通过编写步骤定义,您可以告诉Behat Given I am on "/news"的含义。当你希望这一步从特征到特征意味着不同的东西时 - 你做错了。

Behat由2个主要和足够单独的概念组成:

  1. *.feature个文件,用Gherkin语言编写。这些文件应该是自我描述的。意味着他们应该为读者提供所有信息以便理解它们。 Gherkin不是用于功能测试的新编程语言,它只是用户故事的降价
  2. FeatureContext.php课程描述了Behat应如何测试您的功能。它定义了与整个应用程序功能套件一起使用的应用程序范围的字典。这是您的降价类用户故事和实际功能测试之间的编程桥梁。
  3. 你不应该搞砸这件事。单一功能套件应具有单步字典(定义)。但是由于继承和子上下文,您可以在多个功能套件中使用单个字典。是的,您可以将单个套件字典拆分为多个php类; - )

答案 1 :(得分:6)

使用类继承和单独的上下文。

# /features/contexts/
AbstractContext extends BehatContext {}
FeaturenameContext extends AbstractContext {}

然后在/feature/FeatureContext.php导入上下文文件:

/**
 * Initializes context.
 * Every scenario gets it's own context object.
 *
 * @param array $parameters context parameters (set up via behat.yml)
 */
public function __construct(array $parameters) {

    // import all context classes from context directory, except the abstract one

    $filesToSkip = array('AbstractContext.php');

    $path = dirname(__FILE__) . '/../contexts/';
    $it = new RecursiveDirectoryIterator($path);
    /** @var $file  SplFileInfo */
    foreach ($it as $file) {
        if (!$file->isDir()) {
           $name = $file->getFilename();
           if (!in_array($name, $filesToSkip)) {
               $class = pathinfo($name, PATHINFO_FILENAME);
               require_once dirname(__FILE__) . '/../context/' . $name;
               $this->useContext($class, new $class($parameters));
           }
        }
    }
}

答案 2 :(得分:0)

一种解决方案是使用subContexts的水平可重用性。为每个“要素组”使用subContext。

class FeatureContext extends BehatContext
{

    public function __construct(array $context_parameters)
    {
        $this->useContext('math_context', new MathContext());
        $this->useContext('bash_context', new BashContext());
    }
}