Определения шагов во внешних файлах в Behat

Behat по умолчанию ищет определения шагов в файле с именем FeatureContext (все шаги в одном файле).
Имея много шагов, трудно поддерживать такой большой файл.

Я хотел бы иметь один файл определения для каждого файла функции.

Как определить определения сторон во внешних файлах?

например

 homepage.feature HomepageContext extends FeatureContext 

Используйте наследование классов и отдельные контексты.

 # /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)); } } } } 

У Behat есть несколько вариантов для разделения вашего FeatureContext на несколько классов. Во-первых, вы можете использовать наследование php5 старой школы. Если наследование не то, что вы хотите, Behat также поддерживает подконтексты: « Использование субконтекстов ».

Затем, если вы хотите назвать свой класс иначе, чем FeatureContext , вы можете переопределить это в разделе « Конфигурация контекста » вашего конфигурационного файла behat.yml .

Таким образом, вы можете разделить общие определения и привязки на отдельные классы и использовать их в других наборах функций, а также с субконтекстом или наследованием.

Но ваш вопрос также спрашивает:

Я хотел бы иметь один файл определения для каждого файла функции.

Этот запрос совершенно неверен. Behat и сценарий BDD – это описание поведения вашего приложения в бизнес-терминах и создание тестового словаря для описанного поведения. Помня об этом, вы логически не могли бы иметь несколько разных словарей для одного набора функций. Написав определения шага, вы говорите, что это означает, что Given I am on "/news" . И когда вы хотите, чтобы этот шаг означал разные вещи от функции до функции – вы делаете это неправильно.

Behat состоит из 2 основных и достаточно отдельных понятий:

  1. *.feature файлы, написанные на языке Gherkin. Эти файлы должны быть самоописательными. Значит, они должны предоставить всю информацию для читателя, чтобы понять их. Gherkin – это не новый язык программирования для ваших функциональных тестов, это просто уценка для ваших пользовательских историй!
  2. FeatureContext.php , описывает, как Behat должен проверять ваши функции. Он определяет словарь приложения для использования со всем набором функций приложения. Это модем программирования между вашими комментариями пользователя и фактическими функциональными тестами.

И вы не должны это испортить. Отдельный набор функций должен иметь словарь с одним шагом (определения). Но вы можете использовать один словарь в нескольких наборах функций благодаря наследованию и подконтекстам. И да, вы можете разделить словарь одного набора на несколько классов php 😉

Одно из решений – горизонтальное повторное использование с субконтекстами. Используйте subContext для каждой «группы функций».

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