【问题标题】:Handling cucumber scenario examples as one scenario将黄瓜场景示例作为一种场景处理
【发布时间】:2016-03-08 15:14:29
【问题描述】:

我在使用 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"));
}

【问题讨论】:

  • 您的意思是每次代码迭代都会重新安装和启动应用程序?您能否阐明“重新启动应用程序”的含义

标签: android cucumber appium


【解决方案1】:

正如 Thomas Sundberg 所说,您有很多选择。但是,对于您的特定情况,您可能需要保持所有规格不变,并且

那么他应该可以在所有语言上做到这一点

不够具体。你可以像这样重写场景:

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"));
}

【讨论】:

    【解决方案2】:

    听起来您在每个场景之前都重新启动了应用程序,而对于场景大纲,您希望应用程序只启动一次。

    场景大纲是编写许多场景的速记方式。每个例子都会被展开并变成一个场景然后执行。

    你的选择是

    • 在每个场景之前不要重启你的应用程序
    • 接受重新启动应用程序
    • 重写你的场景,这样你就没有每种语言的示例

    最后一种选择意味着您将语言列表向下移动到堆栈中。可能进入了步骤委托的辅助类。

    这意味着这样的场景:

    Given the user is on the hamburger menu
    When he order a hamburger
    Then he should be able to do it on all languages  
    

    我对这里的措辞不满意。但这个想法是你将语言列表隐藏在某个地方。这将允许您对它们进行迭代,而不是在场景大纲中包含语言列表。

    这将解决您面临的重新启动问题,因为您在每个场景之前都重新启动。

    它还将提高您场景中的抽象级别。目前,在我看来,您的场景更像是一个脚本,而不是所需行为的规范。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-15
      • 2017-11-21
      • 1970-01-01
      • 2013-02-14
      相关资源
      最近更新 更多