Jmeter将JDBC Request查询结果作为下一个接口参数方法
Posted 柳絮纷飞飞满天
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Jmeter将JDBC Request查询结果作为下一个接口参数方法相关的知识,希望对你有一定的参考价值。
现在有一个需求,从数据库tieba_info表查出rank小于某个值的username和count(*),然后把所有查出来的username和count(*)作为参数值,用于下一个接口。
tieba_info表结构如下图
分析:
1.要查出username和count(*),那么首先就要有1个或者2个 jdbc request,连接本地数据看,分别查询出我们需要的username和count(*);
2.rank小于某个值,这个值我们可以做一个变量,方便管理。不管这个值是多少,我们查出来的count(*)将只有一个值,而username会有很多个,具体多少根据我们的条件rank来变化;
3.查询出所有username后,我怎么取到每一个username的值?
4.又怎么把我们查出来的每一个username作为参数值去请求下一个接口?这里先说下,需要做一个循环。
5.我事先并不知道能查出多少条数据,那如何知道我们需要循环多少次?
接下来逐一解决我们的问题。
实践:
1.首先添加一个jdbc connection configuration,这里的配置方法可以百度,我连接的是我本地的mysql数据库
2.添加1个或者2个 jdbc request,分别查询username和 count(*),我这里是用了两个
3.可以看到,在username这个请求中,select语句中出现了变量rank,那我们可以添加一个【用户定义的变量】,名称就是我们的sql语句里面的变量引用名rank,值就根据需要自己填
4.sql语句写完了,就要提取我们需要的结果了
这个时候可以添加查看结果树,看看我们获取到的count(*)和username
count查出来的数据如下图:
username查询出来的数据如下
那我们需要的就是这个count(*)就是20,和20个username的值
5.上面我们只是查出来数据,接下来我们就要提取username和count(*)数据,再回到我们的count和username jdbc request
在username这个request里面,下方的 variable name这里填上你想使用的变量名,也就是之后的接口中要用到的,我取的username,同理,count的request里也做相同操作,可以取为count
6.现在我们要测试我们的参数化到底成功没有,我模拟请求接口localhost:3306/test,然后参数传count和username,参数值就是我们获取的username和count(*)
查看下请求结果
我发现请求里面 username和count参数化并没有成功,那为什么会不成功呢,经过一番搜索,原来当使用jdbc request的结果作为参数时,要写成${username_1}这样子,1代表你查出来的数据第一行,想取第几行就把1改成几。那问题来了,我们查出来count(*)是肯定只有一条数据,那我们可以确定写成${count_1},但是username却有很多条,我是想所有的username都请求一次,也就是说如果是username这个变量的话,1这个数字应该是要不断变化的而不是某个固定的值,那怎么才能让他不断变化呢
7.计数器
对,就是计数器
我们添加一个计数器
由于我们从第一行开始取值,所以启动填1,每次我们多1,所以递增也填1,最大值可不填,number format就是数字格式,如果填000,取值是12,那最后会显示为012,而我们只需要本身的数字,所以就填0,引用名称就是后面需要用的变量名
8.有了计数器,能递增了,那我们就能把username传进去了。我们上面说了${username_1}是取第一行,${username_2}是取第二行,依次类推,那我们要从1开始取,一直到最后。上一步添加的计数器就起作用了,我们设置的计数器是从1开始计数,每次递增1,那么跟我们想要的完全吻合,index就是我们设置的计数器的变量名,可以直接用他来代替我们的数字1,2,3,4等等,那我们现在来把username和index两个变量拼接起来,这里如果你直接写成 ${username_index}或者 ${username_${index}}都是不行的,因为两个变量不能直接拼接,需要用到一个函数 __V,不了解这个函数的可以百度看看,作用就是可以使2个变量可以拼在一起,所以我们拼接后的username变量应该是${__V(username_${index})}
现在再来看看 我们请求接口有没有把所有的username传进去
结果发现,为啥还是只请求了一次,明明count(*)查出来是20,那应该请求20次啊,为啥只把第一个username传进去了呢?
9.这是因为,我们传的username参数相当于做了参数化,有多个值,这时候就需要在设置线程数或者添加一个循环控制器,但是我们并不知道到底需要循环多少次或者需要设置多少线程数,才能让username刚好传完,这个时候,我们之前查询的count就起作用了,count变量是我们之前查出来的所有数据的总数,这个总数是多少就说明我们需要多少线程或多少次循环。ok,那我们在http 请求上右击,点击插入上级--逻辑控制器--循环控制器,循环次数,我们使用count变量,即${count_1},这样就能把次数确定。这里其实不能用添加线程的方式来做,因为count 和 username两个jdbc request都在这个线程里,如果设置多线程,这两个也会多次请求,不合理,所以我们选择更好的循环控制器
10.所有的东西都设置完了,就需要把我们的东西进行重新排序归类
我们首先是有jdbc connection config,然后有count和username两个jdbc request,然后我们有一个测试的http请求,一个计数器和一个循环控制器,那么这时候就需要把计数器和http请求全部移入循环控制器了,否则还是无法传入全部username值
最后的效果如图,rank变量值是20,刚好20个http请求,每个请求的username都不同
以上是关于Jmeter将JDBC Request查询结果作为下一个接口参数方法的主要内容,如果未能解决你的问题,请参考以下文章
Jmeter将JDBC Request查询结果作为下一个接口参数方法
Jmeter----请求的reponse结果中的某个参数作为JDBC Request的查询条件
如何使用JDBC Request跨数据库查询后引用查询的结果作为下一个JDBC Request的入参