如何在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
相关产品推荐
相关产品推荐

