接口测试 请教个 jmeter 读取数据库商品资料,并使用读取数据的部分字段作为传参的问题(感谢)

低调的麦麦 · 2024年05月22日 · 最后由 低调的麦麦 回复于 2024年05月27日 · 6628 次阅读

我的出库单接口需要使用数据库商品表和条码表中部分字段的内容,怎么从两个表中读取到的数据放到传参中并且是对应的。

读取的商品表:

读取的条码表:

出库请求参数:(这是两个商品,所用到的字段都是从两个表中一起取的)

我怎样才可以随机从数据库取 2 个商品作为参数传递?

最佳回复


这里既然已经获取到了数量,利用随机函数从 0-size,随机取 2 个下标就行了,object.get(0) 中的 0 用随机到的数字代替,防止取到重复的数据,可以记录第一次取到的下标或者你取到数据之后,从对象中进行删除

共收到 18 条回复 时间 点赞

可以尝试用响应提取器,提取保存,再引用

给你的参数带上标记,就是比如 unit:包, 你带上前后标记 text 包 text,这样就可以简单的正则匹配提取了、

第一个数据对应的问题,既然需要对应,数据之间应该是有关联的,可以使用关联查询,让查出来的结果直接进行对应
关于随便获取 2 条数据的问题,需要写 beanshell 用代码实现

直接在 JDBC requst 中获取需要的字段,你要求是随机取的话,可以直接用 order by rand() limit 2,比如:
select 字段 1,字段 2,字段 3 from 表 A where 条件 order by rand() limit 2;
然后在 JDBC requst 里把字段 1、2、3 分别提取成变量,后续的接口引用它们就行。

chenhongjian 回复


感谢您的答复,我现在把两个表中用到的字段数据都查出来了,后面需要写 beanshell 来对应我请求参数中的字段?

感谢您的答复,我试试。

Maruying 回复

试过了 这个方法不行 谢谢

把 SQL 查出来的数据存到一个变量,在 beanshell 中读取为数组,然后利用数组下标随机取 2 条数据,并把数据处理成你需要的格式,存到一个变量,然后在下一个接口中引用即可。

chenhongjian 回复
import java.util.Random;

Random random=new Random();
Object object=vars.getObject("object");  //获取sql查询结果

int size=object.size();   //获取查询结果数量
line_0 = object.get(0);   //获取object的第一个元素
goods_name = line_0.get("goods_name");  //获取goods_name字段的值
goods_code = line_0.get("goods_code");  //获取goods_code字段的值
goods_id = line_0.get("goods_id");  //获取goods_id字段的值
bar_code = line_0.get("bar_code");  //获取bar_code字段的值
id = line_0.get("id");  //获取id字段的值


vars.put("size",size.toString());   //将size转换成字符串,存到变量size中
vars.put("line_0",line_0.toString());
vars.put("goods_name",goods_name.toString());
vars.put("goods_code",goods_code.toString());
vars.put("goods_id",goods_id.toString());
vars.put("bar_code",bar_code.toString());
vars.put("id",id.toString());


String[] fields={"goods_name","goods_code","goods_id","bar_code","id"};   //创建一个字符数组,里面为需要作为入参的字段

感谢 我只写到这里 获取第一行的参数,我怎样获取随机行数的内容,分别用在商品 A,商品 B。。。

chenhongjian 回复


消息体是这样设置参数化的

感谢提供的方法 我现在把需要的字段数据都查出来了,但是我不知道怎么随机按行数取,我 HTTP 请求参数里面需要多个商品,我怎样不重复的随机取 5 行数据,放到请求的 5 个商品参数中?


这里既然已经获取到了数量,利用随机函数从 0-size,随机取 2 个下标就行了,object.get(0) 中的 0 用随机到的数字代替,防止取到重复的数据,可以记录第一次取到的下标或者你取到数据之后,从对象中进行删除

我是 4 楼,补充一下吧,如果不知道变量名实际输出叫什么,要用到调试取样器 Debug Sampler,如图所示添加

注意这个取样器要放到请求的后面,请求执行后,它会读取到前面所有请求中输出的各类变量值。

例:下图中,我在 JDBC request 中定义的输出变量其实叫 rantenantid,但实际产生的叫 rantenantid_1,那么后续引用时就需要用 ${rantenantid_1}来引入这个值:

感谢 取数据的问题已解决

chenhongjian 回复

感谢你的帮助 取数据的问题已解决!

16楼 已删除
chenhongjian 回复


这里我还有个问题,我想再请教下: 就是另外一个接口,请求参数中,waveOperation Detaillist 内有 1 万个小的数据体,并且里面的 outStockNo(出库单号)都是不一样的,我是不是要把小的数据体复制到 1 万个,然后对每个 outStockNo 进行参数化? 对每个 outStockNo 参数化有没有简便的办法?只能一个个的去参数化(这个 outStockNo 不能取重)

首先参数化主要是怕有缓存或者有些逻辑覆盖不到导致结果不准确,先和开发确认下做不做参数化有没有影响,没影响可以直接写死,如果需要参数化,可以用 gpt 或者 python 写个脚本直接生成

chenhongjian 回复

谢谢 我们这个接口需要参数化的,实际场景是这个 waveOperation Detaillist 中有 1 万个实际的出库单(不同单号),这个 1 万个出库单,后续的一个接口也会用到这个! 感谢提供的思路,我写一下看看能不能实现

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