1

我正在使用 Cucumber 编写 Rails 测试套件。

我目前有一个非常像这样的场景。

Scenario Outline:
  Given I am logged in as "<user>"
  When I create a <fruit>
  Then I should see the <fruit> info
  When I click the <fruit> delete button
  Then I should see the confirmation "Fruit deleted"

  Examples:
    | user   | fruit  |
    | super  | apple  |
    | super  | banana |
    | ninja  | apple  |
    | ninja  | banana |
    | juicer | apple  |
    | juicer | orange |
    | cake   | apple  |
    | cake   | banana |
    | cake   | orange |

这工作正常,但它似乎不是很干燥。我更喜欢这样的东西。

Scenario Outline:
  Given I am logged in as "<user>"
  When I create a <fruit>
  Then I should see the <fruit> info
  When I click the <fruit> delete button
  Then I should see the confirmation "Fruit deleted"

  Examples:
    | user   | fruits                |
    | super  | apple, banana         |
    | ninja  | apple, banana         |
    | juicer | apple, orange         |
    | cake   | apple, banana, orange |

这种事情可能吗?我的测试是否朝着正确的方向前进?

4

2 回答 2

1

从技术上讲,可以更改您的示例以将水果分组在一个场景中。每个步骤都必须:

  1. 拿一串水果
  2. 用逗号分割它们(假设没有水果中有逗号)
  3. 为每个水果执行动作

例如,您的“那么我应该看到信息”看起来像:

Then /I should see the (.*) info/ do |fruit_array|
    fruits = fruit_array.split(',').map(&:strip)

    fruits_on_page = ['apple', 'banana', 'grape']

    fruits.all? do |fruit|
        fruits_on_page.should include fruit
    end
end

就这是否是一个好主意而言,我认为建议是使用您的第一种方法,以每个水果为例。原因是每个测试(场景)只有一个断言更容易理解和调试。但是,可能有理由合并测试。例如,如果每个示例都需要一个小时来运行,也许您可​​以通过组合它们来节省时间。如果与水果有互动,那么将它们结合起来测试这种互动可能是有意义的。不更改它的另一个原因是,虽然您的场景可能看起来比较枯燥,但您的步骤定义现在更加复杂。同样,在一个步骤中进行多个断言可能很糟糕,因为只报告第一个失败的断言(尽管有一些技巧可以解决这个问题)。

于 2013-09-06T13:27:33.730 回答
0

两个注释:

  • 如果您只需要测试一个(或两个)用户是否可以在您的应用程序上执行 CRUD 操作,也许您只需拆分用例:

    • 创造

      • userA 可以创建一个名为“banana”的水果
      • userB 可以创建一个名为“banana”的水果
    • 删除

      • userA 可以删除一个名为“banana”的水果
      • userB 可以删除一个名为“banana”的水果
    • $另一个动作

      • ...
  • 您的第二个功能存在语法错误:在示例部分中,第二列是“fruit”,而不是“fruits”

当然,您可以以不同的 DRYer 方式使用 Cucumber 的场景大纲 :-)

https://github.com/cucumber/cucumber/wiki/Scenario-Outlines

于 2013-09-06T12:19:24.580 回答