调用Karate Feature文件时如何传递完整JSON数组,避免逐元素执行
解决Karate中调用Feature时完整传递JSON数组的问题
我之前刚好碰到过这个Karate的默认行为——当你直接把JSON数组作为参数传给call方法时,Karate会自动把数组当成数据驱动的数据源,对数组里的每个元素执行一次目标Feature。要避免这种情况,只需要把你的JSON数组包装成一个单个对象的属性就可以了,这样Karate就不会触发数据驱动的循环逻辑,而是把整个数组完整传递过去。
具体实现步骤:
1. 修改调用方的代码
原来的调用方式是直接传递数组:
* def myReq = [ { "attr1":"123", "attr2":"456" }, { "attr1":"789", "attr2":"101112" } ] * call read('classpath:com/example/Test.feature') myReq
现在改成把数组包裹在一个对象里传递:
* def myReq = [ { "attr1":"123", "attr2":"456" }, { "attr1":"789", "attr2":"101112" } ] * call read('classpath:com/example/Test.feature') { fullRequestArray: myReq }
2. 在目标Feature中接收完整数组
在Test.feature里,你可以直接通过包装时定义的键名(比如fullRequestArray)拿到整个数组,然后直接使用:
Feature: 处理完整数组请求的Feature Scenario: 接收并使用完整JSON数组 # 打印数组验证是否完整接收 * print "完整接收的JSON数组:", fullRequestArray # 将数组作为请求体发送给接口 Given url "你的目标API地址" And request fullRequestArray When method post Then status 200
原理说明
Karate的call方法有一个内置逻辑:如果传入的参数是JSON数组,就会自动启用数据驱动模式,遍历数组的每个元素执行一次Scenario;但如果传入的是单个JSON对象(哪怕对象内部包含数组属性),就只会执行一次Scenario,这样就能保证整个数组被完整传递,而不会被拆分遍历。
内容的提问来源于stack exchange,提问作者Chethan Swaroop




