一个场景大纲中多个步骤的最佳实践
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
步骤尽可能简洁。您只能走这么远来清理您的步骤。有时一个场景很长。您可以将其分解为单独的场景,并且只有一个断言。这可以使每个场景更短,但最终会出现更多场景。这是一种平衡行为。
所以我有一个页面,其中有很多按钮/滑块/输入等。 我几乎需要其中的每一个 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
步骤尽可能简洁。您只能走这么远来清理您的步骤。有时一个场景很长。您可以将其分解为单独的场景,并且只有一个断言。这可以使每个场景更短,但最终会出现更多场景。这是一种平衡行为。