如何遍历空手道响应数组并将其传递到另一个 Web 服务响应的 json 路径中
How to loop through karate response array and pass this in json path of another web service response
我正在使用 0.8.0.1 版空手道,我想执行以下步骤来测试一些响应。
我创建了一个 Get to web service 1
使用 json路径从 Web 服务 1 的响应中查找货币值:$.currencies
第 2 步给出以下结果:["USD","HKD","SGD","INR","GBP"]
现在我对 web 服务 2 使用 Get 方法
从 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
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'}]
编辑 - 现在有一个将基元数组转换为对象数组的快捷方式:
另请参阅此答案:
我正在使用 0.8.0.1 版空手道,我想执行以下步骤来测试一些响应。
我创建了一个 Get to web service 1
使用 json路径从 Web 服务 1 的响应中查找货币值:
$.currencies
第 2 步给出以下结果:
["USD","HKD","SGD","INR","GBP"]
现在我对 web 服务 2 使用 Get 方法
从 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
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'}]
编辑 - 现在有一个将基元数组转换为对象数组的快捷方式:
另请参阅此答案: