【问题标题】:How to loop through karate response array and pass this in json path of another web service response如何遍历空手道响应数组并将其传递到另一个 Web 服务响应的 json 路径中
【发布时间】:2021-07-21 22:27:24
【问题描述】:

我使用的是空手道版本 0.8.0.1,我想执行以下步骤来测试一些响应。

  1. 我创建了一个获取网络服务 1

  2. 使用 jsonpath:$.currencies 从 Web 服务 1 的响应中查找货币值

  3. 第 2 步给我以下结果:["USD","HKD","SGD","INR","GBP"]

  4. 现在我对 Web 服务 2 使用 Get 方法

  5. 从 web 服务 2 的响应中,我想使用 json-path 获取 price 字段的值,如下所示(传递上面第 3 步中的值):

    $.holding[?(@.currency=='USD')].price

    $.holding[?(@.currency=='HKD')].price

    $.holding[?(@.currency=='SGD')].price

    $.holding[?(@.currency=='INR')].price

    $.holding[?(@.currency=='GBP')].price

所以有这么多货币,但我只想验证 Web 服务 1 返回的货币的价格(这将始终是随机的)并将其传递给 Web 服务 2 的输出以获取价格。 一旦我得到价格,我会将每个价格值与从数据库返回的值进行匹配。

我不确定是否有任何简单的方法可以将服务1返回的值一一传递到服务2的json-path中并获得所需的结果。这样做的任何建议都会有所帮助,因为我将自动化的大多数 Web 服务都是这种情况。

【问题讨论】:

    标签: karate


    【解决方案1】:

    在空手道中有多种方法可以做到这一点。下面应该给你一些指示。注意当你使用match each 时有一个神奇的变量_$。由于您可以引用范围内的任何其他 JSON,因此您有一些非常强大的选项。

    * def expected = { HKD: 1, INR: 2, USD: 3}
    * def response1 = ['USD', 'HKD', 'INR']
    * def response2 = [{ currency: 'INR', price: 2 }, { currency: 'USD', price: 3 }, { currency: 'HKD', price: 1 }]
    * match response2[*].currency contains only response1
    * match each response2 contains { price: '#(expected[_$.currency])' }
    

    您可能已经了解如何使用call a second feature file in a loop,这可能是您的特定用例所需要的。另一个难题可能是这样 - 将任何 JSON 数组转换为空手道期望的形式以在循环中调用特征文件非常容易:

    * def response = ['USD', 'HKD', 'INR']
    * def data = karate.map(response, function(x){ return { code: x } })
    * match data == [{code: 'USD'}, {code: 'HKD'}, {code: 'INR'}]
    

    编辑 - 现在有一个将基元数组转换为对象数组的捷径:https://stackoverflow.com/a/58985917/143475

    另请参阅此答案:https://stackoverflow.com/a/52845718/143475

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多