Jmeter从数据库获取测试数据, 作为下一个接口参数方法
下载驱动包
首先得下载mysql jdbc驱动包(注:驱动包的版本一定要与你数据库的版本匹配,驱动版本低于mysql版本有可能会导致连接失败报错)
mysql jdbc驱动包:mysql-connector-java-8.0.13.jar
sqljdbc4-4.0.jar
将这两个jar包放到Jmeter目录中的lib文件下,然后重启Jmeter
添加jdbc connection configuration
1.添加线程组
2.添加配置元件:JDBC Connection Configuration
3.JDBC Connection Configuration 基本配置
Variable Name:数据库连接池的名称,因为一个测试计划可以有多个 JDBC Connection Configuration,每个可以取不同的名称。在 jdbc request 中通过这个名称选择合适的连接池进行使用。(注意Variable Name命名必须和之后JDBC Request中的Variable Name 命名一致)
Max Number of Connections:最大连接数;如果做性能时,建议填 0;如果默认为 10,表示最大只能连接 10 个线程;
Max Wait(ms):最大等待时间,单位毫秒;
Time Between Eviction Runs(ms):有空闲的线程数,释放不使用的线程;
Auto Commit:自动提交,默认为 true,如修改数据库时,自动 commit;
Database URL:jdbc:mysql://${host}:${port}/dbname?allowMultiQueries=true(允许执行多条sql)
JDBC Driver class:com.mysql.jdbc.Driver
Username:数据库用户名
Password:数据库密码
添加JDBC request
注:这个 Sampler 可以通过 sql 语句向数据库发送一个 jdbc 请求,并对获取返回的数据进行操作。它需要和 JDBC Connection Configuration一起使用
Variable Name:数据库连接池的名字,需要与 JDBC Connection Configuration 的 Variable 保持一致
Query type:表示sql类型。select表示查询,update表示更新。不同的sql类型需要指定不同的type
Query :填写 sql 语句,下拉可以选择不同类型的sql
Parameter valus:参数值
Variable names:保存 sql 语句返回结果的变量名
Result variable name:创建一个对象变量,保存所有返回的结果
Query timeout:查询超时时间
Handle result set:定义如何处理由 callable statements 语句返回的结果
执行线程,查看结果
表数据:
执行的结果:
如何从数据库pub_tb_user表查出user_type为2的username和count(*),然后把所有查出来的username和count(*)作为参数值,用于下一个接口。
分析:
1.我们查出来的count(*)将只有一个值,而login_name会有很多个,具体多少根据我们的条件user_type来变化;
2.查询出所有login_name后,我怎么取到每一个login_name的值?
3.又怎么把我们查出来的每一个login_name作为参数值去请求下一个接口?
操作步骤:
1.jdbc请求的sql中可以传入变量,在login_name这个request里面,下方的 variable name这里填上你想使用的变量名,也就是之后的接口中要用到的,我取的login_name,同理,count的request里也做相同操作,可以取为count
2.下面测试成功了没,使用登录接口,使用取到的login_name进行登录
原来当使用jdbc request的结果作为参数时,要写成${username_1}这样子,1代表你查出来的数据第一行,想取第几行就把1改成几
执行结果:
从响应,可以看到登录成功了,从而可以知道参数已经成功获取
但是username却有很多条,我是想所有的username都请求一次,也就是说如果是username这个变量的话,1这个数字应该是要不断变化的而不是某个固定的值,那怎么才能让他不断变化呢?
3.添加一个计算器
由于我们从第一行开始取值,所以启动填1,每次我们多1,所以递增也填1,最大值可不填,number format就是数字格式,如果填000,取值是12,那最后会显示为012,而我们只需要本身的数字,所以就填0,引用名称就是后面需要用的变量名
4.有了计数器,能递增了,那我们就能把login_name传进去了。我们上面说了${login_name_1}是取第一行,${login_name_2}是取第二行,依次类推,那我们要从1开始取,一直到最后。上一步添加的计数器就起作用了,我们设置的计数器是从1开始计数,每次递增1,那么跟我们想要的完全吻合,index就是我们设置的计数器的变量名,可以直接用他来代替我们的数字1,2,3,4等等,那我们现在来把login_name和index两个变量拼接起来,这里如果你直接写成 ${login_name_index}或者 ${login_name_${index}}都是不行的,因为两个变量不能直接拼接,需要用到一个函数 __V,不了解这个函数的可以百度看看,作用就是可以使2个变量可以拼在一起,所以我们拼接后的login_name变量应该是${__V(login_name_${index})}
5.此时还要加一个循环控制器,点击插入上级--逻辑控制器--循环控制器,循环次数,我们使用count变量,即${count_1},这样就能把次数确定。这里其实不能用添加线程的方式来做,因为count 和 login_name两个jdbc request都在这个线程里,如果设置多线程,这两个也会多次请求,不合理,所以我们选择更好的循环控制器
6.设置好之后,查看下执行结果,可以看到有8个login请求,且每个请求的login_name都不一样