php - 我可以使用其中一个场景作为我的元步骤而不是在 Context 类中定义它吗?

标签 php bdd behat gherkin

我需要定义元步骤,例如我的订单中有一件商品。但是我不想在 Context 类中为这个步骤创建定义,而是只想使用某些功能文件中的现有步骤。因为我已经有了测试功能 Adding item to order cart 的场景。

有现成的解决方案吗?我认为这是非常流行的用例,并且必须有比在 Context 类中定义元步骤更好的解决方案。

最佳答案

简短回答:否。

我知道它可能看起来像一个非常有用的功能,但它会很快咬住你,导致步骤/场景之间不必要的依赖性,从而导致脆弱的测试。

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

/**
 * @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!
}

此外,在实践中,根据我们正在测试的内容,将商品添加到购物车看起来可能会有些不同。

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

但是,如果您正在处理“在 header 中查看迷你购物车”场景,您可能会采取一些捷径来使您的测试套件更快一些。在 givens 中,当您说“Given I have an item in the cart”时,您可能只是将商品直接放入数据库/ session /那里的任何内容。你可以负担得起这种快捷方式,因为你已经介绍了在其他场景中将项目添加到购物车。

顺便说一句,如果您正在为 Web 应用程序进行自动化测试,您会发现类似 page objects 的模式。很有帮助。

关于php - 我可以使用其中一个场景作为我的元步骤而不是在 Context 类中定义它吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25876232/

相关文章:

php - mySQL 加入哪里?

java - Java/Scala 的特性级行为测试工具

ruby-on-rails - cucumber : Size of features

ajax - 这些 MinkExtension 基础上下文适应与 ajax 请求相关吗?

html - Behat/Mink 从 CSS 元素中获取值(value)

php - .htaccess 用于使用 Yii 框架的子目录中的站点

PHP/Javascript 验证计算

php - 有没有办法让 Behat 在 PHP 通知错误时不失败?

php - 非匿名 session 必须使用加密

.net - 在进行 BDD 时,我是否必须首先对通过验收测试所需的每段代码进行 TDD?