如何通过空手道响应阵列循环和其它Web服务响应的JSON路径通过这(How to loop thro

2019-09-30 01:02发布

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

  1. 我做一个到达Web服务1
  2. 发现从Web服务1的响应货币值使用jsonpath:$ .currencies
  3. 步骤2使我以下结果:[ “USD”, “HKD”, “SGD”, “INR”, “GBP”]
  4. 现在我用Get方法用于Web服务2
  5. 从Web服务2的回应,我想价格字段的JSON的路径类似下面的值(通过上述步骤3的值):

    • $ .holding [?(@。货币== '美元')]。价格
    • $ .holding [?(@。货币== 'HKD')]。价格
    • $ .holding [?(@。货币== '新元')。价格
    • $ .holding [?(@。货币== 'INR')。价格
    • $ .holding [?(@。货币== '英镑')]。价格

因此,有这么多的货币,但我想确认价格只能由Web服务1(这将永远是随机的),并把它传递给Web服务2的输出,以获得价格返回的货币。 一旦我得到的价格,我将与来自DB返回的值每个价格值相匹配。

我不知道是否有任何简单的方法中,我可以通过一个路过服务1重新投入2之一的JSON路径值,并获得所需结果。 这样做的任何建议将是有帮助的,这将是对于大多数的Web服务,我将自动化的情况。

Answer 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第二个特征文件中的一个回路 ,其可能需要您的特定使用情况。 一个更一块拼图可以是这 - 它是很容易转化任何JSON数组形式空手道预计用于调用在一个循环的特征文件:

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


文章来源: How to loop through karate response array and pass this in json path of another web service response
标签: karate