You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Karate中比较键名/数量不同的两个JSON数组?

解决Karate框架中跨Feature文件比对不同键名JSON数组的问题

你当前的问题是用call方法直接传入两个数组时,无法在子Feature中逐个获取对象进行校验。可以通过以下两种方式实现:

方式一:将两个数组打包成单个对象传递

在主Feature中把两个数组封装到一个对象里,子Feature中遍历这个对象的两个数组,逐个比对元素。

主Feature(sample-create.feature)修改:

* table kittens1 
  | name   | age | dept|
  | 'Bob'  |   2 | IT. |
  | 'Wild' |   1 | HR. |
  | 'Nyan' |   3 |ADMIN|

* table kittens2 
  | first_name    | emp_age   |
  | 'Bob'         |   "2"     |
  | 'Wild'        |   "1"     |
  | 'Nyan'        |   "3"     |

* def data = { list1: kittens1, list2: kittens2 }
* def result = call read('cat-create.feature') data

子Feature(cat-create.feature)修改:

@ignore
Feature:

Scenario:
  * def zip = function(a, b) { return karate.zip(a, b) }
  * def pairs = zip(data.list1, data.list2)
  * pairs.forEach(function(pair){
      var obj1 = pair[0]
      var obj2 = pair[1]
      karate.assert(obj2.first_name == obj1.name)
      karate.assert(parseInt(obj2.emp_age) == obj1.age)
    })

方式二:在主Feature中遍历数组,逐个调用子Feature校验

如果需要更细粒度的控制,可以在主Feature中遍历两个数组的元素对,每次调用子Feature传递一组对象进行校验。

主Feature(sample-create.feature)修改:

* table kittens1 
  | name   | age | dept|
  | 'Bob'  |   2 | IT. |
  | 'Wild' |   1 | HR. |
  | 'Nyan' |   3 |ADMIN|

* table kittens2 
  | first_name    | emp_age   |
  | 'Bob'         |   "2"     |
  | 'Wild'        |   "1"     |
  | 'Nyan'        |   "3"     |

* def pairs = karate.zip(kittens1, kittens2)
* pairs.forEach(function(pair){
    call read('cat-create.feature') pair[0] pair[1]
  })

子Feature(cat-create.feature)修改:

@ignore
Feature:

Scenario:
  * assert first_name == name
  * assert parseInt(emp_age) == age

这两种方式都能实现你需要的跨Feature文件逐个比对不同键名JSON对象的需求,第一种适合批量处理,第二种适合单元素的独立校验逻辑。

内容的提问来源于stack exchange,提问作者Arpit Aggarwal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 12:20:04