如何循环空手道响应数组并将其传递到另一个 Web 服务响应的 json 路径中

2024-01-11

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

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

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

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

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

  5. 从 Web 服务 2 的响应中,我想使用 json-path 获取价格字段的值,如下所示(传递上面步骤 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 服务的情况。


在空手道中有多种方法可以做到这一点。下面应该给你一些提示。注意这里有一个神奇的变量_$当你使用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循环中的第二个功能文件 https://github.com/intuit/karate#data-driven-features您的特定用例可能需要它。难题的另一部分可能是这样的 - 将任何 JSON 数组转换为 Karate 期望在循环中调用特征文件的形式是非常容易的:

* 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/58985917/143475

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何循环空手道响应数组并将其传递到另一个 Web 服务响应的 json 路径中 的相关文章

随机推荐