Jmeter接口 变量参数化(CSV和mysql数据库两种读取数据)和两个嵌套循环(实例)

需求:一个接口里面有多个变量,我要把3个变量参数化,其中一个变量是币种,另两个变量分别是用户和账户,用户和账户同名,我要把每个币种空投给每个用户一定数量(相同)的金额。
接口:http://8.210.161.18:442/api/admin/adminDistTask
参数:{“id”:"",“currencyCode”:“ETH”,“intent”:“指定用户”,“users”:[{“userName”:“[email protected]”,“quantity”:“12”}],“isLocking”:false,“remark”:"",“userAndAmount”:“[email protected],12”,“distType”:“1”}
表现在Jmeter如下图:
Jmeter接口 变量参数化(CSV和mysql数据库两种读取数据)和两个嵌套循环(实例)_第1张图片
由于需要认证才能执行接口,所以要添加http信息头管理器,如下:
Jmeter接口 变量参数化(CSV和mysql数据库两种读取数据)和两个嵌套循环(实例)_第2张图片

一、实现上面需求,首先就是要进行变量参数化。
1、首先把对应的变量值参数化,参数化的各式就是把原来的值,写成类似这种各式:${canshu},其中canshu就是具体的参数化变量名,需要在下一步填入CVS数据文件设置里,具体参数化如下:
Jmeter接口 变量参数化(CSV和mysql数据库两种读取数据)和两个嵌套循环(实例)_第3张图片
2、添加逻辑控制器,循环控制器,依次线程组右键—添加—逻辑控制器—循环控制器,由于需要两个循环,所以需要添加两个,如下:

Jmeter接口 变量参数化(CSV和mysql数据库两种读取数据)和两个嵌套循环(实例)_第4张图片

3、添加CSV数据文件,线程组右键,依次添加—配置元件—CSV数据库文件设置,如下:
Jmeter接口 变量参数化(CSV和mysql数据库两种读取数据)和两个嵌套循环(实例)_第5张图片
4、由于需要两个文件参数,所以这里建立了两个CVS数据文件,分别是币种和用户,如下:
Jmeter接口 变量参数化(CSV和mysql数据库两种读取数据)和两个嵌套循环(实例)_第6张图片
5、建立两个参数txt文件保存到本地,然后设置对应的CSV数据文件,具体如下:

Jmeter接口 变量参数化(CSV和mysql数据库两种读取数据)和两个嵌套循环(实例)_第7张图片
可以看到,币种里面有12个币种12行,用户和账户里面有4个用户账户4行,设置的时候要注意,文件编码选择 UTF-8,多个变量,txt文件和CSV设置里用英文逗号隔开。

二、那么要实现上面的需求,如何把两个循环嵌套实现呢。

1、先看一下已经设置好的嵌套和从属各式,外循环CSV数据文件放在外循环里,内循环CSV数据文件放在内循环里,接口请求放在内循环里,如下:
Jmeter接口 变量参数化(CSV和mysql数据库两种读取数据)和两个嵌套循环(实例)_第8张图片
2、线程组的设置如下图:
Jmeter接口 变量参数化(CSV和mysql数据库两种读取数据)和两个嵌套循环(实例)_第9张图片

3、如果要把每个币种遍历所有的用户,就要把币种的循环放到外面,用户的循环放到里面,外循环12行数据,所以要把外循环的次数为永远,同时,CSV数据文件设置里的再次循环或停止线程分别设置为false和true,如下:
Jmeter接口 变量参数化(CSV和mysql数据库两种读取数据)和两个嵌套循环(实例)_第10张图片
4、内循环由于有4行数据,所以设置循环次数为4,内循环对应的CSV数据文件设置保持默认设置即可,不同于外循环的如上设置,请仔细甄别,如下图:
Jmeter接口 变量参数化(CSV和mysql数据库两种读取数据)和两个嵌套循环(实例)_第11张图片
5、执行结果,12行币种,4行用户账户,所以循环执行下来是48次,如下图:
Jmeter接口 变量参数化(CSV和mysql数据库两种读取数据)和两个嵌套循环(实例)_第12张图片
三、mysql数据库读取数据
上面实现了参数化CSV读取数据和循环嵌套控制,那么我们如何实现参数化后从数据库某个表里读取数据来直接用于接口的参数传参呢。
1、首选安装导入数据库JAR文件,链接什么数据库就用什么样的JAR文件,这里我们用的是mysql,所以就下载mysql数据库文件
下载一个mysql驱动包,mysql官网下载,下载网址:https://dev.mysql.com/downloads/connector/j/
Jmeter接口 变量参数化(CSV和mysql数据库两种读取数据)和两个嵌套循环(实例)_第13张图片
下载完后,解压找到对应的mysql-connector-java-8.0.21.jar文件,在test plan里进行引用,如下图:
Jmeter接口 变量参数化(CSV和mysql数据库两种读取数据)和两个嵌套循环(实例)_第14张图片

2、创建JDBC链接配置下图:
这里说明一下:
a、varibable name for created pool,这个名称可以随便,但是下一步添加取样器的时候会用到,保持一致即可。
b、database url ,要这样的各式(IP、端口号、数据库):jdbc:mysql://192.168.5.240:3306/gx?useUnicode=true&characterEncoding=utf8,但问号和后面的东西(?useUnicode=true&characterEncoding=utf8)不是必须的,取决于数据库的支持各式和Jmeter的支持各式统一,这个在执行后根据查看结果树里面的JDBC Request请求响应的报错(类似这种:Unknown initial character set index ‘255’ received from server.)来具体添加,另外,在执行的时候可能查看结果树里面的JDBC Request请求响应还会报(类似这种:Cannot create PoolableConnectionFactory (Client does not support authentication protocol requested )这种错,解决的方法是:命令行登录MySQL
mysql -u root -p,输入命令:use mysql;出现Databse changed,然后一次执行如下三个命令:select user,host from user;alter user ‘root’@’%’ identified with mysql_native_password by ‘数据库密码’;flush privileges;如下图:
Jmeter接口 变量参数化(CSV和mysql数据库两种读取数据)和两个嵌套循环(实例)_第15张图片

Jmeter接口 变量参数化(CSV和mysql数据库两种读取数据)和两个嵌套循环(实例)_第16张图片

c、username和password就是连接数据库的用户名和密码
Jmeter接口 变量参数化(CSV和mysql数据库两种读取数据)和两个嵌套循环(实例)_第17张图片
3、添加JDBC Request取样器,如下图:
有取样器才能把查询的数据关联应用到具体接口的参数中,在这里插入图片描述
此处的名称要和上面的连接配置里一直,在这里插入图片描述这里的变量名称就是接口里面的参数名(但由于Jmeter的支持各式问题,接口里面的参数就不再是上面第一点的那种各式了,这个下面会说到),在这里插入图片描述这里是要查询出来数据库中哪个表的哪个字段作为参数值来替换,如果有多个引用就查询多个,同时下面的变量名就对应多个,用英文逗号隔开。

Jmeter接口 变量参数化(CSV和mysql数据库两种读取数据)和两个嵌套循环(实例)_第18张图片
4、本次我把币种参数变量进行从数据库中读取,用户账户变量还是从CSV里面读取,所以我们先把原来的币种CSV文件配置进行删除或禁用,根据执行结果可以看到,数据库中的币种数量查询如下图,总共是26行数据。
Jmeter接口 变量参数化(CSV和mysql数据库两种读取数据)和两个嵌套循环(实例)_第19张图片
5、那么我们怎么才能每次执行取一个币种数据呢,那就要添加计数器,使得每循环一次取一个币种数据,直到执行完成,记住,计数器是和数据库参数配置成对出现的。
添加计数器和配置如下图,由于从数据库中查询的币种有26行数据,即为26个币种,如果全部循环完毕,下图中计数器的最大数和外循环的循环次数都要设置为26,计数器中的开始值和递增都填写1。Jmeter接口 变量参数化(CSV和mysql数据库两种读取数据)和两个嵌套循环(实例)_第20张图片
6、想必你也注意到了,上图中计数器里面还有一个引用名称,可以随便取,这个值是要带入到接口参数中的,上面也提到了,如果使用数据库读取数据进行参数化,Jmeter就不再支持第一点里面那样的参数化形式,结合计数器的引用名称,接口参数是这样的:${__V(bizhong_${M})},如下图:
Jmeter接口 变量参数化(CSV和mysql数据库两种读取数据)和两个嵌套循环(实例)_第21张图片
然后执行,看下执行结果,如下图:
从请求body可以看到,每次循环就取到了数据库查询返回的对应数据。
Jmeter接口 变量参数化(CSV和mysql数据库两种读取数据)和两个嵌套循环(实例)_第22张图片
四、再进一步,循环控制器里面的循环次数和计数器的最大值参数化
上面,虽然用是用了数据库取值,但是循环次数和计数器最大值是我们查询数据库获取的总共有多少值后填进去的具体的值,如果我们不想填具体的循环测试,而是数据库中有多少个值就循环多少次,那么就对循环次数和计数器参数化。
要想对某个变量参数化,首先是要读取到该值,这样一来,Jmeter的线程组里面各个循环啦,请求啦,就一定要有对应的执行顺序,只有得到了值才能给下一步变量值传参,了解这一点特别重要,就为了搞这个循环次数参数化,我吃了老亏了,因为一开始我把调试取样器和获取循环次数取样器放在了循环控制器后面,这样Jmeter在执行的时候由于对应的参数值获取不到,就不会执行或执行有误。
宗旨只有一个,只要在循环执行之前拿到想要的循环次数,把对应的读取值传给循环次数就可以,获得循环测试参数化,目前我用了两种方式。
1、再添加一个JDBC Request 取样器,查询sql就是获取数据库表中的币种总数量(切记,一定要把该取样器移到循环控制器之前执行),具体各项配置如下图:
Jmeter接口 变量参数化(CSV和mysql数据库两种读取数据)和两个嵌套循环(实例)_第23张图片
2、利用调试取样器读取最大值,调试取样器就是可以获取已经执行的代码的执行结果,但调试取样器要想读取返回对应的值,在调试取样执行之前必须要有对应的值供他读取得到,如下图可以看到,重复添加了一次JDBC Request 取样器,然后调试取样器就可以读取取样器里面的执行值,看下面第二张图,bizhong_#=26就是获取的币种最大值,所以我们就可以直接把“bizhong_#”进行参数化,如第二张图的各项设置。
Jmeter接口 变量参数化(CSV和mysql数据库两种读取数据)和两个嵌套循环(实例)_第24张图片

Jmeter接口 变量参数化(CSV和mysql数据库两种读取数据)和两个嵌套循环(实例)_第25张图片
如上两种方法都能获取同样的效果。
这里放一下Jmeter测试jmx文件,下载下来导入Jmeter可以直接查看
链接:https://pan.baidu.com/s/1idoa3_MtkuQ389FjDLYCoA
提取码:1234

你可能感兴趣的:(Jmeter学习笔记)