51Testing软件测试论坛

标题: Jmeter正则提取的数组,如何在循环中分别请求 [打印本页]

作者: Hedis    时间: 2015-4-13 15:48
标题: Jmeter正则提取的数组,如何在循环中分别请求
在测一个考试系统,系统中“请求1”返回了整场考试所有的“试题id”,假设一场考试20题,那么在“请求1”下面加入正则表达式提取器
现在已经可以通过“${试题_1}”的方式成功请求,希望可以加个“20”的循环,每次循环请求一个试题id,而不是复制黏贴20遍直到“${试题_20}”


尝试过用beanshell拼接字符串
re_answer = "${answer_"+re_num+"}";
vars.put("answer1",re_answer)
,请求的时候用参数${answer1}
但是请求的时候直接转义了answer=%24%7Banswer_1%7D

作者: ntgecm    时间: 2015-4-13 17:13
给你个思路:可以添加“用户定义的变量”或“用户参数”组件在里面设置参数,然后循环读取,实现你要的功能。祝你好运!
作者: Hedis    时间: 2015-4-14 09:51
昨天查了一下文档,单个数组可以通过foreach控制器来循环调用
但是问题来了,回答问题的请求中有2个参数,一个answer数组,一个问题id数组,一个foreach只能填写一个数组变量
如果把两个foreach嵌套起来,就变成n*n的请求了
各位大大有木有好的思路呢

难道要把每个foreach中的参数写入文本,然后从外部文件再写回参数么

作者: Hedis    时间: 2015-4-14 14:11
终于搞定了,留个脚印记录下
服务返回:
[
    {
        题目ID: "36位uuid",
        一堆参数qoptions: [
            {
                答案id: "36位uuid",
                content: "答案A的描述"
            },
            {
                答案id: "36位uuid",
                content: "答案B的描述"
            },
            不定长的答案
        ]
    },
    {
        题目ID: "36位uuid",
        一堆参数qoptions: [
            {
                答案id: "36位uuid",
                content: "答案A的描述"
            },
            {
                答案id: "36位uuid",
                content: "答案B的描述"
            },
            不定长的答案
        ]
    },
    ...剩余18道题
]
在请求下面加一个正则表达式提取器,其中
引用名称设置:answer
正则设置:
\{题目ID:"([0-9a-z]{8}-[0-9a-z]{4}-[0-9a-z]{4}-[0-9a-z]{4}-[0-9a-z]{12})".*?qoptions:\[\{答案id:"([0-9a-z]{8}-[0-9a-z]{4}-[0-9a-z]{4}-[0-9a-z]{4}-[0-9a-z]{12})",content
中间的.*?很重要,表示非贪婪获取第一个匹配的答案
模板设置:$1$$2$
匹配数字设置:-1(表示数组)

然后用foreach控制器,将answer逐条取出,从0至20,输出变量名设置:answer1
这个时候取出的字符串是72位的(36位问题ID+36位答案id)
然后在回答问题的请求中,分别用substring截取字符串,就搞定了
问题id=${__substring(${answer1},0,36,wentiid)}
答案id=${__substring(${answer1},36,72,daanid)}

再也不用担心100道问题的试卷怎么测了
作者: whscfan    时间: 2015-4-15 15:42
你都想到用beanshell了,什么不多考虑点呢?你的beanshell本身就有问题啊。
re_answer = "${answer_"+re_num+"}";
假如re_num是1 得到的re_answer 为${answer_1}
然后你存到了answer1,为${answer_1}
最后你接着用${answer1},得到的是${${answer_1}}
${${answer_1}}这个不报错才怪呢。


应该这么写:
re_answer = "answer_"+re_num;//eg. re_answer=answer_1
vars.put("answer1",re_answer);// eg. answer1=answer_1
log.info(vars.get("answer1"));//打印出来看看是不是answer_1




欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2