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

时间:2018-08-25 10:36:59

标签: karate

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

  1. 我进行了“获取Web服务1”操作
  2. 使用jsonpath从$ Web服务1的响应中找到货币值:$ .currencies
  3. 第2步给我以下结果:[“ USD”,“ HKD”,“ SGD”,“ INR”,“ GBP”]
  4. 现在我将Get方法用于Web服务2
  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的输出以获取价格。 一旦获得价格,我便会将每个价格值与DB返回的值进行匹配。

我不确定是否有任何简单的方法可以将服务1返回的值一个接一个地传递到服务2的json-path中。这样做的任何建议都会有所帮助,因为我将要自动化的大多数Web服务都是如此。

1 个答案:

答案 0 :(得分:2)

在空手道中有多种方法可以做到这一点。以下应该为您提供一些指导。请注意,在使用_$时如何使用魔术变量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数组转换成Karate期望在循环中调用功能文件的形式非常容易:

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