我使用的空手道版本0.8.0.1,我想执行下列步骤来测试一些回应。
- 我做一个到达Web服务1
- 发现从Web服务1的响应货币值使用jsonpath:$ .currencies
- 步骤2使我以下结果:[ “USD”, “HKD”, “SGD”, “INR”, “GBP”]
- 现在我用Get方法用于Web服务2
从Web服务2的回应,我想价格字段的JSON的路径类似下面的值(通过上述步骤3的值):
- $ .holding [?(@。货币== '美元')]。价格
- $ .holding [?(@。货币== 'HKD')]。价格
- $ .holding [?(@。货币== '新元')。价格
- $ .holding [?(@。货币== 'INR')。价格
- $ .holding [?(@。货币== '英镑')]。价格
因此,有这么多的货币,但我想确认价格只能由Web服务1(这将永远是随机的),并把它传递给Web服务2的输出,以获得价格返回的货币。 一旦我得到的价格,我将与来自DB返回的值每个价格值相匹配。
我不知道是否有任何简单的方法中,我可以通过一个路过服务1重新投入2之一的JSON路径值,并获得所需结果。 这样做的任何建议将是有帮助的,这将是对于大多数的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
第二个特征文件中的一个回路 ,其可能需要您的特定使用情况。 一个更一块拼图可以是这 - 它是很容易转化任何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