提问者:小点点

如何将数据从某个json文件传递到Gherkin功能文件


我想通过从其他JSON文件中获取数据来参数化我的小cucumber特征文件步骤。对此有任何建议。我几乎到处找,但找不到答案。

我知道使用gherkin功能文件中的场景大纲将示例与变量的多个值一起使用的场景,但没有寻找它。

目前我使用的是这样的方法,引号中的以下值将传递给步骤定义

    Scenario: Buy last coffee
        Given There is "Starbucks" coffee
        And I added "Sugarless" syrup

预期:我想从JSON文件或任何其他文件中获取变量的数据,并将这些数据值传递给步骤定义函数。可能吗?

小cucumber功能文件:

    Scenario: Buy last coffee
        Given There is "${data.coffeeshop}" coffee
        And I added "${data.sugarType}" syrup

data.json:

    {
        "coffeeshop": "starbucks",
        "sugarType": "Sugarless",

    }

共2个答案

匿名用户

它是一种常见的cucumber反模式,用于尝试将数据注入功能文件。它很难做到,部分原因是它违背了编写良好功能文件的整个精神。

Cucumber希望你的工作方式是向下推细节并抽象流程,以便该功能不进行任何编程(循环、迭代步骤等)。您可以通过思考json文件中的内容以及为什么要迭代它来改进您的实践。

您的json文件似乎想要遍历多家咖啡店,看看它们是否可以制作咖啡。因此,您的功能可以给这组咖啡店起个名字,然后讨论这组咖啡馆是否可以做些什么。也许是这样

Scenario: Seattle coffee shops can make an iced mocha
  Given our coffee shops are located in Seattle
  Then our coffee shops can make an iced mocha

并实现这些场景

Given 'our coffee shops are located in Seattle' do
  @coffee_shops = get_seattle_coffee_shops
end

Then 'our coffee shops can make an iced mocha' do
  @coffee_shops.each do | shop |
    assert can_make_recipe(
      shop: shop,
      recipe: Recipes::IcedMocha
    )
  end
end

以上是一个非常粗糙的开始,我将从步骤定义中抽出更多的代码到帮助器方法中。我在这里试图说明的关键部分是,与一组咖啡店而不是一家咖啡店合作的场景和步骤是众所周知的

在您的场景中,helper方法<code>get_seattle_coffee_shops</code>将加载并处理您的json以获取数据。因为这个处理已经从功能文件(非代码)向下推到代码中,所以这个操作现在更容易实现。当Cuking时,这个“向下推”是一个非常重要的技巧,它是您应该如何处理涉及<code>编程</code>功能文件的任何问题的方法。

匿名用户

我最近也实施了类似的方法。我根据场景名称匹配json数据。json将如下所示。通过这种方式,您可以将测试数据与场景动态匹配。

{
"scenario1":
      {
       "coffeeshop": "starbucks",
        "sugarType": "Sugarless"
      },
"scenario2":
      {
       "coffeeshop": "starbucks",
        "sugarType": "Sugarless"
      }
}

您的功能文件将如下所示,

Scenario: senario1
        Given There is coffee
        And I added syrup

Scenario: senario2
        Given There is  coffee
        And I added syrup