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

测试一根葱 · 2020年06月05日 · 最后由 测试一根葱 回复于 2020年06月16日 · 2273 次阅读

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

共收到 26 条回复 时间 点赞
Test44 回复

好的

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

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

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

放飞梦想 回复

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

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

huis 回复

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

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

Test44 回复

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

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

darren0619 回复

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

foreach 里加个同步定时器呢

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

14楼 已删除

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

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

好的 谢谢了 一会我试试呢

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

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

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

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

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

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

RhettXia 回复

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

但是 foreach 不是并发呀

foreach 控制器遍历所有返回值

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

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