51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

查看: 8751|回复: 4
打印 上一主题 下一主题

Jmeter正则提取的数组,如何在循环中分别请求

[复制链接]
  • TA的每日心情

    2018-3-5 15:35
  • 签到天数: 7 天

    连续签到: 1 天

    [LV.3]测试连长

    跳转到指定楼层
    1#
    发表于 2015-4-13 15:48:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    在测一个考试系统,系统中“请求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
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    该用户从未签到

    2#
    发表于 2015-4-13 17:13:06 | 只看该作者
    给你个思路:可以添加“用户定义的变量”或“用户参数”组件在里面设置参数,然后循环读取,实现你要的功能。祝你好运!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2018-3-5 15:35
  • 签到天数: 7 天

    连续签到: 1 天

    [LV.3]测试连长

    3#
     楼主| 发表于 2015-4-14 09:51:12 | 只看该作者
    昨天查了一下文档,单个数组可以通过foreach控制器来循环调用
    但是问题来了,回答问题的请求中有2个参数,一个answer数组,一个问题id数组,一个foreach只能填写一个数组变量
    如果把两个foreach嵌套起来,就变成n*n的请求了
    各位大大有木有好的思路呢

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

    使用道具 举报

  • TA的每日心情

    2018-3-5 15:35
  • 签到天数: 7 天

    连续签到: 1 天

    [LV.3]测试连长

    4#
     楼主| 发表于 2015-4-14 14:11: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道问题的试卷怎么测了
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2015-4-27 10:31
  • 签到天数: 12 天

    连续签到: 1 天

    [LV.3]测试连长

    5#
    发表于 2015-4-15 15:42:07 | 只看该作者
    你都想到用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
    回复 支持 反对

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-5-23 19:44 , Processed in 0.070537 second(s), 22 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表