性能测试工具 jmeter 遇到的一个场景问题

小人物 · 2020年06月05日 · 最后由 小人物 回复于 2020年06月16日 · 3498 次阅读

待审批列表所有数据 ID 值,作为审批接口的参数值请求。
可以通过正则表达式提取出上一个接口响应的所有 ID,我需要用这些所有的 ID 作为下一个接口的请求参数,每个接口用一次这个 ID,做并发,有什么办法吗?

共收到 26 条回复 时间 点赞

正则取-1 全部,会有一个变量是总数,用循环去取就行了

foreach 控制器遍历所有返回值

但是 foreach 不是并发呀

RhettXia 回复

循环取出来的,不能做并发诶

我是用数据库或者正则表达式把这些值全部取出来,放 csv 文件里面,再去做并发,不知道还有没有更智能的办法

你用正则表达式取出来了列表中改的所有 id,我记得在变量名的后面加上"_"+"序号",可以引用你提取出来的集合中的与序号对应的数值。
比如 ID_1,就是引用取出的 ID 中的第 1 个 (这个序号是从 0 还是从 1 开始计数的,不记得了,你可以搞个 debug 取样器,看下变量的序号,这样比较确定些)

是那样的,-1 取出全部后,变量后加_1 就是第一个,但是只能循环去利用这些变量,没有办法让他并发的时候一次利用这些值

小人物 回复

可以的,使用V 这个函数,可以将变量名后面的序号进行参数化拼接,将序号设置为 1~ID 总数的随机数,这样你并发的时候,每次请求都是从 ID 列表中随机取一条,类似这样:${V(ID_${__Random(1,10,)})}
这样满足你的需求吗?

V 前面有双下划线的,在这回复,自动给我把下划线给过滤了~

然后如果你取出来的 id 数量不确定的话,我记得有个变量是记录了你取出来了多少个数的,你可以用 debug 取样器看下,那个后缀怎么拼写我不记得了~

好的 谢谢了 一会我试试呢

小人物 回复

但是这些方法都是直在同一线程组才生效吧?跨线程组就不好调用了,我 i 第一个接口只做一次,用正则取出数据,想让第二个接口做并发

小人物 回复

你两个接口在不同的线程组里?
那你可以写个 beanshell,将提取器获取的变量赋值到环境变量里,应该就可以跨线程使用了

27楼 已删除

主要是我跨线程的这个参数又是一个多值的变量,比如调用这样写 就不太行的样子 ${P(V(newprojectid_${__Random(1,20,)}),)}。。。貌似还是只能在同线程组内进行,不能做到第一个请求只做一次,第二个请求利用它的响应数据做参数并发多次

小人物 回复

foreach 里加个同步定时器呢

darren0619 回复

不行,foreach 里面可不能添加同步定时器。foreach 是循环,在循环里面添加定时器,他会永远等不到并发数

把第 1 个接口的请求写在 setUp 线程组里,用 beanshell 拿出所有要用的 ID 放在局部环境里;并发线程看你选择是暴力的并发还是阶梯压测,再写一个对应线程执行第 2 个接口,用 benashell 前置脚本取 ID。这样可以满足你,接口 1 只跑 1 次拿 ID,接口 2 跑并发。

Test44 回复

问题是要用的那个 ID 是正则表达式取出来的,很多值,他不能一次性放环境变量里的样子,放了,它取不了

第一个接口放到 Setup 线程中,把结果写入到 csv 文件中,第二个接口放到第二个线程中读取 csv 应该可以的

huis 回复

是的 我就是用的 csv,不过就是不太只能,每一次用了待审批 ID 后,还得取创建,再去取值

看你的下一步请求对 id 有没有要求,可以先分两步:
1、新增一个仅一次控制器,取出所有待审批列表所有数据 ID 值,存到一个 list 里
2、新增一个 beanshell 处理器,每次取从 list 里取一个随机值

放飞梦想 回复

emmm 没用过 list 存值,正则取值放 List 吗,然后用 beanshell 前置处理器随机取参么

《jmeter 性能测试入门手册》公开分享,感兴趣的只需要加 QQ 群 956186148(不需要审核),即可在群文件里面自由下载。文档不收费,不需要加好友获取,无附加条件,下载完成自由退群!!

既然你能取出所有的 id 就可以把这些 id 放到 list 里面 用 beanshell

小人物 回复

benshell 完全能满足,是看你怎么用,本身就是轻 java 脚本,jemter 尽量不要依赖正则,多用 beanshell,你就会发现很多你要问的难题,一下子就自己能解决了。

Test44 回复

好的

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册