Короткий ответ: No.
Я знаю, что это может выглядеть как очень полезная функция, но она бы укусить вас назад довольно быстро, в результате чего unnecesary зависимости между шагами/сценариями, что приводит к хрупким испытаний.
Решение состоит в том, чтобы обрабатывать ваши файлы контекста как мост между файлами функций и кодом php. Это означает, что методы контекстного файла являются короткими и делегируют большую часть работы другим объектам. Таким образом, нет никакого дублирования между контекстами, вы просто вызываете другие объекты:
/**
* @Given I open the product page
*/
public function iOpenTheProductPage()
{
$this->productPage->open();
}
/**
* @Given I add a :product to the cart
*/
public function iAddProductToTheCart($product)
{
$this->productPage->addToCart($product);
}
/**
* @Given I have an item in the cart
*/
public function iHaveAnItemInTheCart()
{
// reuse
$this->productPage->open();
$this->productPage->addProduct('Behat t-shirt');
// ... or put the items directly to the db!
}
Кроме того, на практике, при добавлении элемента в корзину может выглядеть немного по-другому в зависимости от того, что мы тестируем.
Если вы работаете над сценарием «« Добавить в корзину », вы, вероятно, захотите пройти процесс посещения страницы и добавить товары в корзину.
Если вы работаете над сценарием «« Просмотр мини-корзины в заголовке », вы можете воспользоваться ярлыками, чтобы сделать ваш тестовый пакет немного быстрее. В givens, когда вы говорите «Учитывая, что у меня есть товар в корзине», вы можете просто поместить элемент непосредственно в базу данных/сеанс/что-то там. Вы можете позволить себе такой ярлык, так как вы добавили предметы в корзину в других сценариях.
Кстати, если вы автоматизируете тесты для веб-приложений, вы найдете такие шаблоны, как page objects.