karate.repeat生成畸形JSON无法遍历,求替代循环方案
问题分析
你遇到的核心问题是:karate.repeat多次调用次级feature后,返回的多个独立JSON对象直接拼接输出,导致整体结构不合法;同时次级feature返回的结果带有动态后缀的键名(如Total_packages1、package2),无法通过统一路径遍历提取tags。
解决方案
方案1:修正karate.repeat的返回结果结构
修改调用函数,每次调用后提取固定格式的结果,让最终返回值成为可遍历的数组:
* def fun = function(i){ // 调用次级feature var callResult = karate.call('abc.feature@abc', value); // 根据迭代次数拼接动态键名 var totalKey = 'Total_packages' + (i + 1); var packageKey = 'package' + (i + 1); // 提取需要的package对象返回 return callResult[totalKey][packageKey]; } * def loopResults = karate.repeat(2, fun) // 遍历数组获取所有tags * def allTags = loopResults.map(item => item.tags) * karate.log(allTags)
方案2:用原生JS循环手动收集结果
如果karate.repeat的行为不符合预期,改用普通for循环手动构建结果数组,逻辑更直观可控:
* def packageResults = [] * for (var idx = 0; idx < 2; idx++) { var res = karate.call('abc.feature@abc', value); // 提取当前迭代的package数据 var totalKey = 'Total_packages' + (idx + 1); var packageKey = 'package' + (idx + 1); packageResults.push(res[totalKey][packageKey]); } // 遍历数组获取所有tags * def allTags = packageResults.map(pkg => pkg.tags) * karate.log(allTags)
优化建议:修改次级feature统一返回结构
如果有权限修改abc.feature@abc,可以在场景末尾统一返回格式,彻底避免动态键名的麻烦:
在abc.feature@abc的最后添加:
// 自动提取Total_packagesN下的packageN内容 * def packageData = response[Object.keys(response)[0]][Object.keys(response[Object.keys(response)[0]])[0]] * return packageData
此时循环代码可简化为:
* def fun = function(i){ return karate.call('abc.feature@abc', value) } * def loopResults = karate.repeat(2, fun) * def allTags = loopResults.map(item => item.tags)
内容的提问来源于stack exchange,提问作者hungryhippos
相关产品推荐
相关产品推荐

