jmeter - 从先前的响应中提取值并在 jmeter 的后续请求中以相应数量的块发送数据
问题描述
我想从先前请求的 json 响应中提取值并将值传递给变量并在后续请求正文中使用它们。这里要注意的是,在一个后续请求中只需要传递一组 20 个值。因此,后续请求的计数会根据响应的大小不断增加/减少。例如,如果收到 100 个值/集作为响应,则后续请求的计数将为 100/20 = 5 个请求,每个请求中包含 20 个值。如果没有留下 20 条记录,最后一个请求采样器的主体将包含少于 20 个值(如果响应中收到的集合数不是 20 的精确倍数)。记录将遵循相同的顺序,即第一个采样器中的前 20 条记录,第二个采样器中的 21-40 条记录,依此类推。
请求 1 响应
[ {“专业”:“计算机科学”,“DegreeProviderId”:“DegreeProvider:2eb78dd0-1422-785252d8f804”,“类型”:“更新”,“GId”:“Party:e5329b74-a88b-df59e1d7de9e”,“TeacherId” : "TeacherProvider:7e7f5628-663f-42e1-a6e6-13cb0bd34e3d", "UpdatedDate": "2021-05-31T13:07:21", "FirstName": "Tibet", "NewData": [ "SSN : 878-00 -1250", "FullName : " ], "CollegeName": "TTT", "LastName": "China", "InProgress": true }, { "Specialization": "Agriculture Science", "DegreeProviderId": "DegreeProvider: 2eb78dd0-1422-7852u65f804”,“类型”:“更新”,“GId”:“派对:e5329b74-a88b-df7865rfdt-de9e”、“TeacherId”:“TeacherProvider:7e7f5628-663f-42e1-a6e6-13cb0bd34e3d”、“UpdatedDate”:“2021-05-31T13:07:21”、“FirstName”:“Auf” ,“NewData”:[“SSN:548-00-9890”,“FullName:”],“CollegeName”:“AAA”,“LastName”:“Usa”,“InProgress”:true },
我必须在后续请求中传递 DegreeProviderId 的值,如下所示
采样器/请求正文1
[{“Id”:“DegreeProvider:2eb78dd0-1422-785252d8f804”,“Type”:“更新”,“IsValued”:false,“评论”:“”},{“Id”:“DegreeProvider:2eb78dd0-1422- 7852u65f804”,“类型”:“更新”,“IsValued”:假,“评论”:“”},.................. 20}]
采样器/请求正文2
[{“Id”:“DegreeProvider:2eb78dd0-1422-785252d8f804”,“Type”:“更新”,“IsValued”:false,“评论”:“”},{“Id”:“DegreeProvider:2eb78dd0-1422- 7852u65f804”,“类型”:“更新”,“IsValued”:假,“评论”:“”},.................. 20}]
采样器/请求体3
[{“Id”:“DegreeProvider:2eb78dd0-1422-785252d8f804”,“Type”:“更新”,“IsValued”:false,“评论”:“”},{“Id”:“DegreeProvider:2eb78dd0-1422- 7852u65f804","Type": "Update", "IsValued": false, "Comment":""}, ..... ..... 20}]。. .
......
采样器/请求正文 N .... ....
响应的记录总数不是一个常数,它不断变化。后续请求计数取决于先前响应中收到的记录计数。因此,我需要编写代码来捕获 DegreeProviderId、Type、IsValued 和 Comment 值的值,并在后续请求中使用它们,如上所述。请帮我处理这种情况。非常感谢您的帮助。
解决方案
我认为最好的选择是JSR223 PostProcessor和以下代码:
def response = new groovy.json.JsonSlurper().parse(prev.getResponseData())
def partition(array, size) {
def partitions = []
int partitionCount = array.size() / size
partitionCount.times { partitionNumber ->
def start = partitionNumber * size
def end = start + size - 1
partitions << array[start..end]
}
if (array.size() % size) partitions << array[partitionCount * size..-1]
return partitions
}
def chunks = partition(response, 20)
1.upto(chunks.size(), {
def payload = []
chunks.get(it - 1).each { entry ->
payload.add([DegreeProviderId: entry.DegreeProviderId, Type: entry.Type, isValued: false, Comment: ''])
}
vars.put('request_' + it, new groovy.json.JsonBuilder(payload).toPrettyString())
})
它将生成JMeter 变量,如${request_1}
,${request_2}
等,最多包含 20 个条目,这些变量可以在ForEach 控制器中使用
更多信息:
推荐阅读
- java - 如何使用 Spring Batch 以不同的方式处理多个不同的文件
- c# - 如何阻止 C# 中的内存泄漏,它们到底是什么?
- django - Django save() 总是创建一个新对象
- amazon-web-services - 期权呼叫随机停顿
- python - 如何在Python中每个正则表达式匹配组之前和之后添加字符串?
- c# - 如何使用 Restsharp 正确添加 Request Payload?
- json - 如何使用显式模式映射 openjson 查询中的键?
- arrays - 打字稿:将帖子请求正文转换为地图
- github - GitHub Linguist 的 language.yml 是否允许在扩展中使用通配符?
- python - 是否可以通过 doctest 测试使用 get_type_hints 的函数?