一个场景大纲中多个步骤的最佳实践

Best practise for many steps in one scenario outline

所以我有一个页面,其中有很多按钮/滑块/输入等。 我几乎需要其中的每一个 buttons/slider... 在页面末尾创建一些表格。 当我需要几个步骤来完成案例时,我如何在 BDD 中处理这种情况?最后,我对每一步都进行了断言,这是一种正确的方法吗?此外,我想更改示例中的值:table 只是为了检查不同的 conditions/states.

这是我的一小部分代码:

    And as a deeplink url input "<deeplink_url_on_news_feed_banner>"
    And enter "<display_priority_on_news_feed>" as a display priority number
    And click cta on news feed banner
    And input cta text into cta news banner "<cta_text_news_banner>"
    And from the news_feed banner choose art file button
    And select available banner second
    And click create button
    Then announcement form has been created with valid announcement_name
    Then compare platform selection to announcement not the archive table    
    Then compare segment string "<segment_string>" to text in announcement 
    Then compare display priority number "<display_priority_number>" to text 
    Then compare deep link url "<deeplink_url>" to deep link url in 
    Then compare amount of cool down "<minutes>" to minutes in announcement ta

上面这个看起来很丑,也许我可以做得更好?

我无法将这些步骤分成小故事,因为我需要选中或不选中几乎所有按钮才能创建表单。

无论您如何对步骤进行分组,您仍然可以选择每个按钮。

例如,您可以简化这部分

And as a deeplink url input "<deeplink_url_on_news_feed_banner>"
And enter "<display_priority_on_news_feed>" as a display priority number
And click cta on news feed banner
And input cta text into cta news banner "<cta_text_news_banner>"
And from the news_feed banner choose art file button
And select available banner second
And click create button

类似于

And fill the necessary form data
And click create button

然后您的粘合代码将执行相同的步骤,您只需将所有内容放在一个方法中,而不是 5 或 6 个方法。

这是使用小黄瓜 table 的好处所在。查看您的场景,一些输入已参数化。其他人基本上 "hard coded" 或在不同场景之间保持不变。有两种基本策略可以让您在步骤的简洁性和可组合性之间取得平衡。

当我看到像And select available banner second这样的步骤时,我立即想到"this scenario requires a banner — any banner — and I don't care which banner is selected as long as a banner gets selected."

使用 table 来表达您的步骤允许您在场景中指定值,同时为您不关心的其他必要值提供默认值:

When I create the following foo
    | Field                   | Value                              |
    | Deep link URL           | <deeplink_url_on_news_feed_banner> |
    | Display priority number | <display_priority_on_news_feed>    |
    | CTA news banner         | <cta_text_news_banner>             |

步骤定义将有一个 Table 对象作为其最后一个参数,您可以逐一访问这些值。对于您的方案不关心的必填字段,您将有一个空字符串或空字符串。如果您遇到空值,例如 "available banner",那么您的步骤定义可以只选择一个智能默认值(例如第二个可用横幅)。

优点是您可以为当前场景不关心的字段选择智能默认值,并缩短场景。缺点是你有一些"magic"在幕后进行,其中必填字段被赋予虚拟数据。

另一种策略是结合上面的新步骤,为其他必填字段提供通用步骤。然后就没有"magic"了:

When I create the following foo
    | Field                   | Value                              |
    | Deep link URL           | <deeplink_url_on_news_feed_banner> |
    | Display priority number | <display_priority_on_news_feed>    |
    | CTA news banner         | <cta_text_news_banner>             |
And I choose a news feed banner

I choose a news banner 步骤将取代选择横幅的 4 个程序步骤:

And click cta on news feed banner
And input cta text into cta news banner "<cta_text_news_banner>"
And from the news_feed banner choose art file button
And select available banner second

When I choose a news feed banner 步骤将实现导航用户界面以选择新闻提要横幅的具体细节。

你的断言也可以稍微清理一下:

Then the following announcement should exist:
    | Field                | Value                     |
    | Segment              | <segment_string>          |
    | Display priority     | <display_priority_number> |
    | Deep link URL        | <deeplink_url>            |
    | Cool down in minutes | <minutes>                 |

与上面的 When 步骤类似,您可以使用 Gherkin table 对象进行比较。

其他 Then 步骤尽可能简洁。您只能走这么远来清理您的步骤。有时一个场景很长。您可以将其分解为单独的场景,并且只有一个断言。这可以使每个场景更短,但最终会出现更多场景。这是一种平衡行为。