Php 我可以使用其中一个场景作为我的元步骤,而不是在上下文类中定义它吗?

Php 我可以使用其中一个场景作为我的元步骤,而不是在上下文类中定义它吗?,php,bdd,behat,gherkin,Php,Bdd,Behat,Gherkin,我需要定义元步骤,比如我的订单购物车中有一个项目。但我不想在上下文类中为这个步骤创建定义,我只想在一些功能文件中使用现有的步骤。因为我已经有了测试功能向订单购物车添加商品的场景 是否存在任何现有的解决方案?我认为它是非常流行的用例,必须有比在上下文类中定义元步骤更好的解决方案。简短回答:否。 我知道这看起来可能是一个非常有用的特性,但它会很快地回击你,导致步骤/场景之间不必要的依赖性,从而导致脆弱的测试 解决方案是将上下文文件视为功能文件和php代码之间的桥梁。这意味着上下文文件方法很短,并且将

我需要定义元步骤,比如
我的订单购物车中有一个项目
。但我不想在上下文类中为这个步骤创建定义,我只想在一些功能文件中使用现有的步骤。因为我已经有了测试功能
向订单购物车添加商品的场景


是否存在任何现有的解决方案?我认为它是非常流行的用例,必须有比在上下文类中定义元步骤更好的解决方案。

简短回答:否。

我知道这看起来可能是一个非常有用的特性,但它会很快地回击你,导致步骤/场景之间不必要的依赖性,从而导致脆弱的测试

解决方案是将上下文文件视为功能文件和php代码之间的桥梁。这意味着上下文文件方法很短,并且将大部分工作委托给其他对象。这样,上下文之间就没有重复,您只需调用其他对象:

/**
*@Given我打开产品页面
*/ 
公共函数iOpenTheProductPage()
{
$this->productPage->open();
}
/**
*@Given我向购物车添加了一个:产品
*/ 
公共功能IADDPRODUCT到零件($product)
{
$this->productPage->addToCart($product);
}
/**
*@如果我的购物车里有东西
*/ 
公共功能iHaveAnItemInTheCart()
{
//再利用
$this->productPage->open();
$this->productPage->addProduct('Behat-shirt');
//…或将项目直接放入数据库!
}
此外,在实践中,将项目添加到购物车可能会根据我们测试的内容而有所不同

如果您正在处理“添加到购物车”场景,那么您可能需要完成访问页面并将产品添加到购物车的过程

但是,如果您正在处理“在标题中查看迷你购物车”场景,您可能会使用快捷方式使测试套件更快一些。在givens中,当你说“Given I have a item In the cart”时,你可以简单地将一个项目直接放入数据库/会话/那里的任何东西中。您可以负担得起这种快捷方式,因为您已经介绍了在其他场景中将项目添加到购物车中


顺便说一句,如果您正在对web应用程序进行自动化测试,您会发现这样的模式非常有用。

一种解决方案是将场景转换为上下文函数中的元步骤,然后将场景本身替换为新步骤。然后,当您想将其作为另一个场景的一部分使用时,它已经作为一个步骤提供

FWIW,Everzet(Behat的创建者)最近反对元步骤,因为它们很难维护。更易于维护的选项是为步骤使用底层PHP函数,而不是通过元步骤调用它们。然而,对于将元步骤与函数调用混合在一起的人来说,这是一个很大的悲哀!最好早点决定你要走哪条路