首页 > 解决方案 > 从先前的响应中提取值并在 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 值的值,并在后续请求中使用它们,如上所述。请帮我处理这种情况。非常感谢您的帮助。

标签: jmeter

解决方案


我认为最好的选择是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 控制器中使用

更多信息:


推荐阅读