【问题标题】:How to split Examples in cucumber如何在黄瓜中拆分示例
【发布时间】:2017-11-09 02:55:35
【问题描述】:

假设我有一个像黄瓜这样的场景:

Scenario Outline: do something
    Given do something with "<data1>"
    AND done some process on "<data2>"
    When again done some experiment on "<data3>"
    Then checking "<result>"

    Examples:
     | data1 | data2 | data3 |result  |
     | value1| value2| value3| result1|

这个场景完全没问题,但想象一下这个场景还有 5 个步骤,包含新数据。这看起来很烦人。有什么办法可以将这个示例表吐到列中。如果列吐是不可能的,那么任何其他建议。

【问题讨论】:

  • '但是想象一下'我无法理解您想要我想象的内容。我可以通过“使用新数据再执行 5 个步骤”来实现很多方向。也不确定“将此示例表拆分为列”(假设它已经有列)应该是什么意思。也许如果您真的要提供您正在尝试做的具体示例,这将有助于我们了解您的目标

标签: cucumber gherkin


【解决方案1】:

每一行示例背后都应该有一个原因。如果两行背后的原因相同,那么您只是在浪费运行时间重复自己。

举个简单的例子

Scenario Outline
  When I register as <account> with <passsword>
  Then I should be <result>

Examples
| account | password  | result       |
| free    | too_short | unregistered |
| taken   | ok        | unregistered |
...

您可以轻松地将这个复杂的场景替换为两个更简单的场景

Scenario: register with too short a password
  When I register with too short a password
  Then I should be told I need a longer password

Scenario: register with existing account
  When I register with an existing account
  Then I should be told the account is taken

有几个理由更喜欢以这种方式做事

  1. 每个场景都更易于阅读
  2. 每个场景都会告诉您行为是什么以及为什么它很重要(通过示例,您必须从数据中推断出)
  3. 每个步骤的定义都更容易实现
  4. 通过具体化示例的细节,您可以围绕特定主题编写更多场景。

您可以将此模式应用于每个场景大纲,这样做会

  • 通过许多示例解决您的问题
  • 帮助您编写更好的场景和代码。找出每个示例背后的原因有助于您编写更好的代码。

【讨论】:

  • 有时我喜欢这种方法,有时我喜欢使用示例组。您主要需要根据感觉来考虑是什么使功能文件最容易被人类遵循如果您最终每组只有一个示例,我喜欢像上面那样制作一个独立的场景。如果划分后仍然有多行示例,那么可能使用场景大纲通常仍然有意义
  • 我从不喜欢一组例子,或者一般的例子。我一直认为一个例子是未完成的;因为您没有提取示例背后的推理,也没有找到名称。当人们第一次聚在一起交谈时,例子很好,但是一旦你实现了你的场景,你现在就有了代码,而未命名的代码只是不精确的 IMO。
  • 如果您按照下面我的回答命名示例组,它如何未命名?
  • 组已命名,个别示例未命名。我是说每个例子都有一个相关的行为,我们可以提取、命名和进一步探索。通常,这种探索会导致单个示例成为具有许多场景的整体特征。通过将示例保存在表格中而不为每个示例命名,您正在阻止对该行为的探索。
【解决方案2】:

您没有任何其他解决方案。示例的目的是特别有几行:

Examples:
 | data1 | data2 | data3 |result  |
 | value1| value2| value3| result1|
 | value11| value12| value13| result2|
 | value21| value22| value23| result3|

如果你没有几行,你可以直接把数据放到你的场景中(不是Scenario Outline):

Scenario : do something
    Given do something with "value1"
    AND done some process on "value2"
    When again done some experiment on "value3"
    Then checking "result1"

【讨论】:

  • 我不想添加 row 。我想添加新列,然后将其拆分为类似列。示例:|数据1 |数据2 |示例:|数据3 |结果 |
【解决方案3】:

我无法理解您想要做什么,或者您所说的“列拆分”是什么意思,所以不确定这是否回答了您的问题。

您可以将示例分成不同的组,其中示例具有共同的主题,您甚至可以标记这些组

   @golden_path
 Examples: valid values
| data1  | data2  | data3  | result  |
| value1 | value2 | value3 | result1 |
| bar    | foo    | fizz   | buzz    |

   @low_boundary @negative_test
 Examples: low boundaries
| data1  | data2  | data3  | result  |
| 0      | smag   | cruft  | resultx |
| bar    | 0      | fizz   | resulty |

这使您可以更好地理解给定示例值组的用途,甚至可以根据使用标签运行场景大纲的子集。

要记住的关键是每组示例都必须有标题行(我总是尝试将它们分开并忽略,从而导致错误)

【讨论】:

    猜你喜欢
    • 2013-04-08
    • 1970-01-01
    • 2018-09-23
    • 1970-01-01
    • 2011-07-27
    • 1970-01-01
    • 1970-01-01
    • 2020-08-28
    • 1970-01-01
    相关资源
    最近更新 更多