我可以使用其中一个方案作为我的元步骤,而不是在Context类中定义它吗?

时间:2014-09-16 18:45:08

标签: php bdd behat gherkin

我需要定义类似I have an item in my order cart的元步骤。但是,不是在Context类中为此步骤创建定义,而是仅使用某些功能文件中的现有步骤。因为我已经有测试功能Adding item to order cart的方案。

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

2 个答案:

答案 0 :(得分:4)

简短回答:否。

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

解决方案是将上下文文件视为功能文件和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这样的模式非常有用。

答案 1 :(得分:1)

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

FWIW,Everzet(Behat的创造者)最近反对元步骤,因为它们真的很难维护。更易于维护的选项是使用底层PHP函数来执行这些步骤,而不是通过元步骤调用它们。然而,对于将元步骤与函数调用混合在一起的人来说,他感到非常痛苦!最好尽早决定你要走哪条路。