将黄瓜场景示例作为一个场景处理
Handling cucumber scenario examples as one scenario
我在使用 Cucumber 时遇到问题 - 现在我正在做移动自动化,我有使用场景大纲的功能 - 我在场景中有几个变量:
场景大纲:菜单项
Given the user is on the hamburger menu
And the language is <language>
Then menu item is <menu item>
Examples:
| menu item | language |
| Search | EN |
| Zoeken | NL |
| Recherche | FR |
| Saved properties | EN |
| Bewaarde zoekertjes | NL |
| Biens sauvés | FR |
| Saved searches | EN |
| Bewaarde zoekacties | NL |
| Recherches sauvées | FR |
| Settings | EN |
| Instellingen | NL |
| Paramètres | FR |
当我 运行 这种情况时,它会为每一行重新启动应用程序(在某些情况下这可能很好,但不是这样),这非常耗时。有没有办法指出应用程序何时应该重新启动应用程序以及何时应该继续示例?
我尝试将示例作为列表处理,但这没有帮助。
@Then("^menu item is (.*)$")
public void menuItem(List<String> menuItems){
for(String menuItem : menuItems)
Assert.assertEquals( menuItem, Common.getElementAttributeByName(menuItem,"text"));
}
这听起来像是您在每个场景之前重新启动您的应用程序,并且对于场景大纲,您希望应用程序只启动一次。
场景大纲是一种shorthand编写许多场景的方法。每个例子都会展开,变成场景然后执行。
你的选择是
- 在每个场景之前不重新启动您的应用程序
- 接受应用程序重新启动
- 重写你的场景,这样你就没有每种语言的例子
最后一个备选方案意味着您将语言列表向下移动到堆栈中。可能进入助手 class 将步骤委托给。
这意味着这样的场景:
Given the user is on the hamburger menu
When he order a hamburger
Then he should be able to do it on all languages
我对这里的措辞不满意。但想法是你将语言列表隐藏在某处深处。这将允许您迭代它们,而不是在场景大纲中包含语言列表。
这将解决您面临的重启问题,前提是您在每个场景之前重启。
它还会提高您场景中的抽象级别。目前,您的场景对我来说更像是脚本,而不是所需行为的规范。
正如 Thomas Sundberg 提到的,您有很多选择。但是,对于您的特定情况,您可能需要保持所有规格不变
Then he should be able to do it on all languages
不够具体。您可以这样重写场景:
Scenario: Menu items
Given the user is on the hamburger menu
Then the possible menu items are
| Search | EN |
| Zoeken | NL |
| Recherche | FR |
| Saved properties | EN |
| Bewaarde zoekertjes | NL |
| Biens sauvés | FR |
| Saved searches | EN |
| Bewaarde zoekacties | NL |
| Recherches sauvées | FR |
| Settings | EN |
| Instellingen | NL |
| Paramètres | FR |
那么你可以这样处理:
@Then("^the possible menu items are$")
public void menuItems(Map<String, String> menuItems){
for(Map.Entry<String, String> menuItem:menuItems.entrySet()) {
switchToLanguage(menuItem.getValue());
Assert.assertEquals( menuItem.getKey(), Common.getElementAttributeByName(menuItem.getKey(),"text"));
}
我在使用 Cucumber 时遇到问题 - 现在我正在做移动自动化,我有使用场景大纲的功能 - 我在场景中有几个变量:
场景大纲:菜单项
Given the user is on the hamburger menu
And the language is <language>
Then menu item is <menu item>
Examples:
| menu item | language |
| Search | EN |
| Zoeken | NL |
| Recherche | FR |
| Saved properties | EN |
| Bewaarde zoekertjes | NL |
| Biens sauvés | FR |
| Saved searches | EN |
| Bewaarde zoekacties | NL |
| Recherches sauvées | FR |
| Settings | EN |
| Instellingen | NL |
| Paramètres | FR |
当我 运行 这种情况时,它会为每一行重新启动应用程序(在某些情况下这可能很好,但不是这样),这非常耗时。有没有办法指出应用程序何时应该重新启动应用程序以及何时应该继续示例?
我尝试将示例作为列表处理,但这没有帮助。
@Then("^menu item is (.*)$")
public void menuItem(List<String> menuItems){
for(String menuItem : menuItems)
Assert.assertEquals( menuItem, Common.getElementAttributeByName(menuItem,"text"));
}
这听起来像是您在每个场景之前重新启动您的应用程序,并且对于场景大纲,您希望应用程序只启动一次。
场景大纲是一种shorthand编写许多场景的方法。每个例子都会展开,变成场景然后执行。
你的选择是
- 在每个场景之前不重新启动您的应用程序
- 接受应用程序重新启动
- 重写你的场景,这样你就没有每种语言的例子
最后一个备选方案意味着您将语言列表向下移动到堆栈中。可能进入助手 class 将步骤委托给。
这意味着这样的场景:
Given the user is on the hamburger menu
When he order a hamburger
Then he should be able to do it on all languages
我对这里的措辞不满意。但想法是你将语言列表隐藏在某处深处。这将允许您迭代它们,而不是在场景大纲中包含语言列表。
这将解决您面临的重启问题,前提是您在每个场景之前重启。
它还会提高您场景中的抽象级别。目前,您的场景对我来说更像是脚本,而不是所需行为的规范。
正如 Thomas Sundberg 提到的,您有很多选择。但是,对于您的特定情况,您可能需要保持所有规格不变
Then he should be able to do it on all languages
不够具体。您可以这样重写场景:
Scenario: Menu items
Given the user is on the hamburger menu
Then the possible menu items are
| Search | EN |
| Zoeken | NL |
| Recherche | FR |
| Saved properties | EN |
| Bewaarde zoekertjes | NL |
| Biens sauvés | FR |
| Saved searches | EN |
| Bewaarde zoekacties | NL |
| Recherches sauvées | FR |
| Settings | EN |
| Instellingen | NL |
| Paramètres | FR |
那么你可以这样处理:
@Then("^the possible menu items are$")
public void menuItems(Map<String, String> menuItems){
for(Map.Entry<String, String> menuItem:menuItems.entrySet()) {
switchToLanguage(menuItem.getValue());
Assert.assertEquals( menuItem.getKey(), Common.getElementAttributeByName(menuItem.getKey(),"text"));
}