如何修改db.readRows遍历POST响应中动态长度的samples数组
问题描述
POST请求执行完成后,需要验证响应中samples数组的所有元素是否都已存储到数据库中。现有代码仅能检查数组的第一个元素,需修改以支持遍历处理长度动态变化的整个数组。
原有代码(仅处理第一个元素)
请求部分
* request payload * method POST * status 200
针对数组第一个元素的数据库检查
* def rows = db.readRows('select * from Database.tablename WHERE attribute_1 = \'' + response.samples[0].toUpperCase().replaceAll('-', '') + '\' ') [0] * print rows.attribute1 * rows.attribute1 contains response.samples[0]
响应负载示例(内容动态变化)
{ "samples": [ "28728jjd-jj22-jkj2k-2kol2k2", "28728jjd-jj22-jkj2k-2kol2k1", "28728jjd-jj22-jkj2k-2kol2k3", "28728jjd-jj22-jkj2k-2kol2k4", "28728jjd-jj22-jkj2k-2kol2k5" ] }
查询结果示例
[ "28728JJDJJ22JKJ2K2KOL2K2" ]
修改方案
使用Karate的forEach循环遍历整个数组,对每个元素执行数据库查询与验证:
* def transformedSamples = response.samples.map(x => x.toUpperCase().replaceAll('-', '')) * forEach transformedSamples * def currentSample = __item * def rows = db.readRows('select * from Database.tablename WHERE attribute_1 = ?', currentSample) * assert rows.length > 0 : '未找到匹配当前样本的记录: ' + currentSample * assert rows[0].attribute1.contains(response.samples[__index])
代码说明
- 统一转换样本格式:通过
map将samples数组的每个元素转成大写并去除横杠,与数据库存储格式对齐,得到transformedSamples数组。 - 遍历处理每个元素:
forEach循环遍历转换后的数组,__item指代当前循环元素,__index对应原数组的索引位置。 - 安全的参数化查询:用
?作为占位符传递参数,避免直接字符串拼接带来的SQL注入风险。 - 双重验证逻辑:先确认数据库存在匹配记录,再验证查询结果的
attribute1包含原样本值。
内容的提问来源于stack exchange,提问作者Minhaaz Mohamed
相关产品推荐
相关产品推荐

