【问题标题】:Karate Intuit: How to validate dynamic json array [duplicate]空手道直觉:如何验证动态 json 数组 [重复]
【发布时间】:2026-01-06 12:20:03
【问题描述】:

我使用空手道已经有一段时间了,但一直纠结于如何验证这个动态数组。当我点击 API 时,数组 apple 的大小会有所不同。

如何逐一检查数组并验证价格?

JSON:

  {
    "data": {
        "apple": [
            {
                "a": 0,
                "price": 1970,
                "date": "2018-05-30"
            },
            {
                "a": 1,
                "price": 1266,
                "date": "2018-05-31"
            },
            {
                "a": 2,
                "price": 1422,
                "date": "2018-06-01"
            }
        ]
    },
    "status_code": 200
}

【问题讨论】:

  • Karthik,你能想出办法吗?

标签: karate intuit


【解决方案1】:

我可以通过数据驱动的方法做到这一点https://github.com/intuit/karate#data-driven-features

Feature: my test

Scenario: 
    * def response =
      """
      {
          "data": {
              "apple": [
                  {
                      "a": 0,
                      "price": 1970,
                      "date": "2018-05-30"
                  },
                  {
                      "a": 1,
                      "price": 1266,
                      "date": "2018-05-31"
                  },
                  {
                      "a": 2,
                      "price": 1422,
                      "date": "2018-06-01"
                  }
              ]
          },
          "status_code": 200
      }
      """
    * def va = call read('classpath:karate/examples/Assertions.feature') response.data.apple

在 Assertions.feature 文件中,我的代码是:

Scenario: 
    * match __arg contains { a: '#(__arg.a)', price: '#(__arg.price)', date: '#(dataBaseResult[__loop].date)' }

注意:

  1. 可以从任何来源提取预期数据。示例:数据库
  2. 记住 '__loop' 会给出数组的索引

【讨论】:

    【解决方案2】:

    您知道match each 语法吗?

    * def response = 
    """
    {
        "data": {
            "apple": [
                {
                    "a": 0,
                    "price": 1970,
                    "date": "2018-05-30"
                },
                {
                    "a": 1,
                    "price": 1266,
                    "date": "2018-05-31"
                },
                {
                    "a": 2,
                    "price": 1422,
                    "date": "2018-06-01"
                }
            ]
        },
        "status_code": 200
    }
    """
    * match each response.data.apple == { a: '#? _ < 3', price: '#number', date: '#regex \\d{4}-\\d{2}-\\d{2}'}
    

    编辑:如果您正在尝试做动态的事情,这就是空手道的 JS 互操作可以提供的帮助

    # work on the second item in the array
    * def index = 1
    * def second = response.data.apple[index]
    * match second.price = 1266
    

    【讨论】:

    • 嘿,感谢您的快速回答,但问题是我不想进行静态验证。我在 java 中有一个函数,它将查询特定日期的 dB 并获取价格(我知道如何在空手道中使用此函数,但我该如何为这个动态大小的数组执行此操作),这就是我想要验证的方式
    • @KarthikRavi 我看不到这个问题。只使用数组索引? * match response.data.apple[0] 等等?
    • 嘿,这很好,但我不想像 * match response.data.apple[0] 那样一一做,然后 * match response.data.apple[1] 等等在。是否可以有一个循环遍历数组并进行验证?
    • @KarthikRavi 您的问题非常不清楚,对不起。但是是的,你可以做各种各样的疯狂,你为什么不看一下例子:github.com/intuit/karate/blob/master/karate-junit4/src/test/…