デフォルトでは、Behat は指定されたファイルFeatureContext
(1 つのファイル内のすべてのステップ) でステップ定義を検索します。
多くの手順があるため、このような大きなファイルを維持するのは困難です。
機能ファイルごとに 1 つの定義ファイルが必要です。
外部ファイルにステップ定義を含めるにはどうすればよいですか?
例えば
homepage.feature
HomepageContext extends FeatureContext
Behatには、FeatureContextを複数のクラスに分割するための複数のオプションがあります。まず、古い学校のphp5継承を使用できます。継承が希望どおりでない場合、Behatはサブコンテキスト「UseingSubcontexts」もサポートします。
次に、クラスにとは異なる名前を付けたい場合は、構成ファイルの「コンテキスト構成」セクションでFeatureContext
それを再定義できます。behat.yml
このようにして、共通の定義とフックを別々のクラスに分割し、それらを他の機能スイートでもサブコンテキストまたは継承のいずれかで使用できます。
しかし、あなたの質問はまた尋ねます:
機能ファイルごとに1つの定義ファイルが欲しいのですが。
この要求は完全に間違っています。BehatとシナリオBDDは、アプリケーションの動作をビジネス用語で記述し、記述された動作のテスト辞書を作成することを目的としています。そのことを念頭に置いて、1つの機能セットに対して複数の異なる辞書を論理的に持つことはできません。Given I am on "/news"
ステップ定義を書くことで、それが何を意味するのかをBehatに伝えていることになります。そして、そのステップが機能ごとに異なることを意味するようにしたい場合、それは間違っています。
Behatは、2つの主要な概念と十分に別個の概念で構成されています。
*.feature
ガーキン言語で書かれたファイル。これらのファイルは自己記述的である必要があります。つまり、それらを理解するために、読者にすべての情報を提供する必要があります。Gherkinは、機能テスト用の新しいプログラミング言語ではなく、ユーザーストーリーの単なる値下げです。FeatureContext.php
クラスでは、Behatが機能をテストする方法について説明します。これは、アプリケーション全体の機能スイートで使用されるアプリケーション全体の辞書を定義します。これは、マークダウンのようなユーザーストーリーと実際の機能テストの間のプログラミングブリッジです。そして、あなたはこれを台無しにすべきではありません。単一機能スイートには、単一ステップの辞書(定義)が必要です。ただし、継承とサブコンテキストのおかげで、複数の機能スイートで単一の辞書を使用できます。そして、はい、あなたは単一のスイート辞書を複数のphpクラスに分割することができます;-)
クラスの継承と個別のコンテキストを使用します。
# /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));
}
}
}
}
解決策の 1 つは、サブコンテキストを使用した水平方向の再利用です。「機能グループ」ごとにサブコンテキストを使用します。
class FeatureContext extends BehatContext
{
public function __construct(array $context_parameters)
{
$this->useContext('math_context', new MathContext());
$this->useContext('bash_context', new BashContext());
}
}