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

如何在Karate的Scenario Outline中保存API响应列表并验证数据库存在性

问题解决:Karate Scenario Outline捕获所有响应ID并验证数据库存在性

核心问题分析

原代码中responseMessages在Background里定义,而Background会在每个Scenario Outline迭代前重新执行,导致每次迭代都会初始化新的空数组,无法保留之前的响应ID。

解决方案步骤

1. 修复全局共享的ID列表

修改Background中的数组初始化逻辑,复用全局变量存储所有迭代的ID,避免每次迭代重置:

Background:
  * url APIurl
  * def config = { username: '',password:'',url:'jdbc:sqlserver://:1433;databaseName=',driverClassName:'com.microsoft.sqlserver.jdbc.SQLServerDriver'}
  * def DbUtils = Java.type('com.testI.DbUtils')
  * def db = new DbUtils(config)
  # 全局复用ID列表:若已存在则使用现有列表,否则初始化空数组
  * def responseMessages = karate.get('responseMessages') || []

2. 捕获唯一ID并更新全局列表

在Scenario Outline中提取响应里的唯一ID(根据实际响应结构调整路径,比如response.id),添加到列表后更新全局变量:

Scenario Outline: 发送不同版本POST请求并捕获唯一ID
  Given request ("abcdef <version>")
  When method POST
  Then status 200
  # 提取响应中的唯一ID(替换为你实际的响应字段路径)
  * def uniqueId = response.id
  * print "版本", version, "生成的ID:", uniqueId
  # 将ID添加到列表并同步到全局
  * karate.appendTo(responseMessages, uniqueId)
  * karate.set('responseMessages', responseMessages)

3. 验证ID存在于数据库

可选两种验证方式:

方式一:每次迭代后立即验证

在Scenario Outline中添加数据库查询验证:

# 验证当前ID是否存在于test表
  * def countResult = db.readRow("SELECT COUNT(*) AS id_count FROM test WHERE id = ?", [uniqueId])
  * match countResult.id_count == 1

方式二:所有迭代完成后统一验证

添加单独的Scenario统一验证所有捕获的ID:

Scenario: 验证所有捕获的ID均存在于test表
  * def allCapturedIds = karate.get('responseMessages')
  * print "所有捕获的唯一ID:", allCapturedIds
  # 遍历所有ID逐一验证
  * karate.forEach(allCapturedIds, function(id) {
      * def result = db.readRow("SELECT COUNT(*) AS id_count FROM test WHERE id = ?", [id])
      * match result.id_count == 1
    })

完整Feature代码示例

Feature: 多版本POST请求ID捕获与数据库验证

Background:
  * url APIurl
  * def config = { username: '',password:'',url:'jdbc:sqlserver://:1433;databaseName=',driverClassName:'com.microsoft.sqlserver.jdbc.SQLServerDriver'}
  * def DbUtils = Java.type('com.testI.DbUtils')
  * def db = new DbUtils(config)
  * def responseMessages = karate.get('responseMessages') || []

Scenario Outline: 发送不同版本POST请求并捕获唯一ID
  Given request ("abcdef <version>")
  When method POST
  Then status 200
  * def uniqueId = response.id
  * print "版本", version, "生成的ID:", uniqueId
  * karate.appendTo(responseMessages, uniqueId)
  * karate.set('responseMessages', responseMessages)
  # 立即验证当前ID
  * def countResult = db.readRow("SELECT COUNT(*) AS id_count FROM test WHERE id = ?", [uniqueId])
  * match countResult.id_count == 1

  Examples:
    | version|
    | 2.1    |
    | 2.2    |

Scenario: 统一验证所有捕获的ID
  * def allCapturedIds = karate.get('responseMessages')
  * print "所有捕获的唯一ID:", allCapturedIds
  * karate.forEach(allCapturedIds, function(id) {
      * def result = db.readRow("SELECT COUNT(*) AS id_count FROM test WHERE id = ?", [id])
      * match result.id_count == 1
    })

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 14:53:14