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

Sfi*_*oza 8 php testing bdd behat

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

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

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

例如

homepage.feature
HomepageContext extends FeatureContext
Run Code Online (Sandbox Code Playgroud)

eve*_*zet 25

Behat有多种选项可供您将FeatureContext拆分为多个类.首先,你可以使用老式的php5继承.如果继承不是你想要的,那么Behat也支持subcontexts:" Using Subcontexts ".

接下来,如果要以不同的方式命名类FeatureContext,可以在配置文件的" 上下文配置 "部分重新定义behat.yml.

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

但你的问题也问:

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

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

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

  1. *.feature文件,用Gherkin语言编写.这些文件应该是自我描述的.意味着他们应该为读者提供所有信息以便理解它们.Gherkin不是用于功能测试的新编程语言,它只是用户故事的降价!
  2. FeatureContext.php类,描述Behat应如何测试您的功能.它定义了与整个应用程序功能套件一起使用的应用程序范围的字典.这是您的降价式用户故事和实际功能测试之间的编程桥梁.

你不应该搞砸这件事.单一功能套件应具有单步字典(定义).但是由于继承和子上下文,您可以在多个功能套件中使用单个字典.是的,您可以将单个套件字典拆分为多个php类;-)


tak*_*hin 6

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

# /features/contexts/
AbstractContext extends BehatContext {}
FeaturenameContext extends AbstractContext {}
Run Code Online (Sandbox Code Playgroud)

然后/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));
           }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)