Jmeter基础知识(二)
6.Jmeter数据驱动
Jmeter里参数化一般分为①从文件里读数据,②从数据库里读数据,③用后置处理器从响应里读数据(第五节中就是从后置处理器中进行数据读取)
数据驱动的目标就是,我们在单独的一个Execl里来维护数据,而不是在请求里面硬编码
(1)添加配置元素-CSV Data Set Config
数据驱动csv文件:
设置线程数2,运行后结果查看:
CSV数据文件设置字段说明:
① 变量名称(Variable Names):需要输入文本里各列都叫什么名字
② 分隔符(Delimiter):用英文的逗号隔开
③遇到文件结束符再次循环?(Recycle on EOF?):数据再循环,例如设置为True,我们的CSV中共有7条数据,但是我们有10个用户,那么第8个用户就会就会从第一条数据开始,再次循环取值
④遇到文件结束符停止线程?(Stop thread on EOF?):例如是true,执行了文件,则停止运行,如果是False,执行了文件,不停止线程,当Recycle on EOF设置为True时,此项设置无效。
注意点:
①文件一定要保存.csv格式
②当csv文件在jmeter的bin目录或脚本目录时,只需给出文件名即可
(2)用函数助手参数化-从csv文件取数据
依然使用(1)中的csv文件
点击生成后,就拷贝到粘贴板上,直接去粘贴就可以了
(3)计数器
在CSV里读数据,不管是用CSV Date Set Config还是用函数助手,那些数据都可能重复,我们都是手动的把它设置成不一样,如果我们不想一直去修改csv的数据,那么可以使用计数器,这样我们只需要修改计数器的起始点,最大值等,就能通过csv里的测试数据和计数器使得测试数据不重复
来看下计数器的定义:允许用户在线程组中任何位置创建引用的计数器。 计数器配置允许用户配置起始点,最大值和增量。 计数器将从开始循环到最大,然后从开始重新开始,继续进行,直到测试结束。
我们以函数助手参数化为实例(CSV Data Set Config同理)来实战一下
①设置计数器
a. Staring value:开始值,比如设置为1
b. 递增(Increment) :递增值,比如设置为2,那么从1开始,下一个数就是3,是两个两个递增的
c. Maximum value: 最大值,比如设置10,就是涨到10就不涨了
d. 数字格式(Number format): 什么格式的,比如我写00,则是01,02,03一直到10,如果写的是000,则是001,002,003这种
e. 引用名称(Exported Variable Name):变量名,比如就叫num
②设置csv文件
③函数助手设置
④根据计数器和函数助手设置接口变量
⑤运行查看结果(此处实例中用了循环控制器,一个线程,但设置新增项目进度接口循环五次),查看结果
⑥计数器的定义中提到: 计数器将从开始循环到最大,然后从开始重新开始,继续进行,直到测试结束
这个是指,如果我循环的次数(或者是线程数)多于开始到最大的总数,那么会从开始的值继续执行,知道我们设置的循环次数(或者是线程数)执行完毕,例如设置开始数字1,递增是2,最大值是10,而我们设置的循环次数或者是线程数是 7,则num 分别为1,3,5,7,9,1
⑦与每个用户独立的跟踪计数器(Track counter independently for each user):若勾选这一项,则代表每个用户(线程)是独立计数的,我们可以设置线程数是2,循环次数是3,来看下效果
7.JDBC Request
要用这个JDBC Request,需要配置下数据库链接 添加(Add)-->配置与案件(Config Element) -->JDBC链接配置(JDBC Connection Configuration)
网站:https://www.soapui.org/jdbc/reference/jdbc-drivers/ 可以下载JDBC的Driver,还可以找到不同数据库的链接地址,不同的数据库,有不同的链接地址和数据库驱动
(1)配置
①下载数据库驱动
按照提示进行下载,下载解压后,将文件夹中的两个jar包中的一个,拷贝到Jmeter的lib目录下
为了方便大家下载,此处提供mysql driver的网盘下载地址:https://pan.baidu.com/s/1rSz0cEvAhAElPC9WPO44mw 密码:pxuv
②复制数据库连接地址(这个也可以直接问开发要)
复制链接地址到 Database URL里,并在图中红框之后维护你的数据库的地址和端口号,后面的用户名和密码可以删除,因为Jmeter后面可以直接维护
③JDBC Driver class(mysql的固定写法是 com.mysql.jdbc.Driver)
完成数据库链接配置,并设置Variable Name for created pool(为了在JDBC Request中被引用)
(2)Jmeter中数据库操作
①Query Type :Select Statement (查询)
察看结果树:
来验证下,看看数据库里数据是否和查出来的一致
②Query Type :Update Statement (更新)
大家可以在尝试下delete
数据已被删除
③按照以上的测试配置,仅能执行一条sql语句,若想执行多条,需在 JDBC Connection Configuration中设置的Database URL中设置allowMultiQueries=true
5种Query Type 总结(以是否设置allowMultiQueries=true来分类):
Query Type |
已设置(基本前提为语句正确) |
未设置 |
Select Statement 或 Prepared Select Statement |
不管填写1条还是多条,仅执行第1条语句,且第1条语句必须为select,否则会报错 |
仅能填写1条sql语句,且必须为select语句,否则会报错 |
Update Statement |
不管设置1条还是多条,只要第一条为非select语句,则能正确运行,且会忽略所有select语句,若第一条是select语句,则会报错 |
仅能填写1条sql语句,且必须为非select语句,否则会报错 |
Callable Statement |
可执行多条sql语句 |
仅能填写一条sql语句,否则会报错 |
④若在测试过程中,执行成功,却未得到对应的结果,可能是因为编码的问题,jmeter识别不了,那么此时,我们需要在 JDBC Connection Configuration的Database URL加上useUnicode=true&characterEncoding=utf8来对他进行编码
⑤接下来我们来看下Select Statement与Prepared Select Statement,Update Statement与Prepared Update Statement的区别
Select Statement:静态select语句
Update Statement: 静态DML(insert、update、delete)
Prepared Select Statement:动态select语句,参数化select语句
Prepared Update Statement:动态DML语句,参数化DML语句
Prepared Select Statement和Prepared Update Statement是可以防sql注入的
一般我们测试insert的时候会使用Prepared Update Statement而不是Update Statement
上一次安全培训的时候,有提到关于防止sql注入的问题,一个很有效的方式,就是采用预编译的方式组装sql, "?"就是占位符,我们温习下:
【预编译占位符为什么能防止sql注入】
a. 使用占位符:select * from table where name = ?
b. 那么你传进来的参数 sql会解析成 select * from table where name = '张三 or 1=1'
这个就不会有注入的风险了,sql会把传进来的是一个参数字符串,而不是语法
⑥JDBC Request本身也是可以将返回值取出给到定义好的变量
我们以select查询返回后的结果为例
运行后的结果
调试取样器查看取值情况
(3)JDBC Request 结合后置处理器-正则表达式提取器
通过JDBC Request获取数据库的数据,用正则表达式提取器进行提取后,给到其他接口使用
假设此处我们需要取出这边的登录账号 admin
添加调试取样器,我们来查看结果(调试取样器直接用${username}命名),可以看到是可以正确取到值的
注意:正则表达式中 空白用\s ,换行用 \n
8.函数助手
在第6节中,我们有简单讲到过一个函数助手,用CSVRead实现数据驱动,不管是使用什么函数,使用方法都是类似的,就是我们选择某个函数,并且按要求为其参数设定值,不同的函数要求的参数也不同,然后生成函数字符串,供脚本使用,后续时间充裕会将常用的Jmeter函数做下总结,这边我们就先拿__Random函数取了例子,主要演示下函数生成和使用
__Random函数:返回指定最大值和最小值之间的随机数
来来来~~~一起打怪升级吧
公众号
个人微信 --> 添加请注明来意