5 参数化
5.1 自定义变量
线程组 --> 配置元件 --> 用户定义的变量 可以自定义变量,通过 ${变量名} 使用
5.2 随机函数
随机数函数
# 生产六位数的随机数字
${__Random(100000,999999,)}
# 生成随机时间: 时间格式yyyy-MM-dd,开始时间,结束时间,设置时区(非必填)
${__RandomDate(yyyy:MM:dd,2030:12:31,2099:12:21,,)}
# 生成随机字符串: 字符串长度,包含字符(支持中文,特殊字符)
${__RandomString(6,asdfghjklqwertyuiopmnbvcxz,)}
# 获取时间戳
${__time(,time)}
加密函数
# MD5加密 明文
${__MD5(123456,)}
# Base64加密 明文
${__base64Encode(123456,)}
5.3 CSV参数化
添加配置元件–CSV数据文件配置
线程共享模式
- 所有线程:所有线程共享一份文件
- 当前线程组:线程组内所有线程共享一份文件,多个线程顺序读取文件
- 当前线程:每个线程都维护一份自己的文件,多个线程都从文件第一行开始顺序读取
遇到文件结束符再次循环:设置为True,线程会再次循环从第一行读取数据,设置为False,则线程会读取文件结束符
遇到文件结束符停止线程:设置为True,读取文件结束符号时停止线程,设置为False,读取文件结束符时不停止线程
- 遇到文件结束符再次循环 ,遇到文件结束符停止线程
- True False:一直循环读取数据,直到线程的所有循环结束
- True True:一直循环读取数据,直到线程的所有循环结束
- Flase True:读取到文件结束符就停止线程
- False False:遇到文件结束符不停止线程,线程一直读取文件结束符作为参数
线程共享模式需要配合多线程(设置线程的数量大于1以及设置循环次数使用)
- 多线程:设置线程组的线程数为n,将每个线程都会执行一遍线程组内的所有请求
- 循环:设置循环次数为n,则每个线程都会循环执行所有请求n次
6 Cookie 鉴权
参考文档:Apache JMeter - 用户手册:组件参考
HTTP Cookie管理器实现Cookie自动关联的原理
- 第一步:当Jmeter第一次请求服务器的时候,如果服务器有通过响应头的Set-Cookie返回Cookie,那么Http Cookie管理器会保存这些Cookie的值
- 第二步:当Jmeter第二次请求服务器的时候,会自动将Cookie信息添加到请求中,从而实现Cookie关联
实现Cookie鉴权:
自动关联:使用HTTP Cookie管理器对Cookie进行自动关联
手动关联:使用正则提取器对Cookie进行提取,之后在HTTP请求头管理器中设置Cookie请求头
7 断言
响应断言
- 响应码相等断言
- 响应头,响应体包含,相等断言
JSON断言:通过JSON Path定位响应中的字段,并验证值是否符合预期,进行断言
持续时间断言:请求超过最大持续时间断言失败
8 跨线程–全局变量
通过正则提取器或JSON提取器提取的变量是局部变量,作用域为所在的线程组。如果需要跨线程组使用变量,需要进行下面操作。
跨线程实现变量引用
- 使用提取器将值保存为局部变量
- 通过BeanShell后置处理器将获取的值存储为全局属性
# 保存局部变量为全局属性
${__setProperty(USERNAME,${username},)}
# 引用全局属性
${__P(USERNAME,)}
- 通过引用全局属性的方法在其它线程组内使用全局属性
跨线程实现Cookie关联
- 配置JMeter全局配置文件 jmeter/bin/jmeter.properties CookieManager.save.cookies = true
- 方便调试,进行该配置后在调试取样器可以查看Cookie的值
- 提取Cookie保存为局部变量(正则提取)
- 通过BeanShell后置处理器将获取的cookie的值存储为全局属性
// __setProperty 但是设置cookie为全局属性,在部分版本(5.1)不会解析变量
// 会直接将${custom_cookie}作为字符串存储到属性中
// ${__setProperty(my_cookie,${custom_cookie},)};
// 通过嵌套groovy函数实现变量解析
${__groovy(props.put("my_cookie", vars.get("custom_cookie")),)}
- 添加全局的HTTP Cookie管理器,在全局Cookie管理器中添加Cookie,cookie的值通过获取全局属性的方法(__P方法)获取,同时,设置Cookie生效的域名和请求路径
- 域:Cookie生效的域名 / 服务器 , 路径为 / 表示所有请求都生效
9. Jmeter实现数据库(MySQL)操作
9.1 操作步骤
- 添加数据库驱动(驱动版本和数据库版本要匹配 MySQL5.7 对应的驱动版本是 5.1)
- 添加配置元件:在线程组下添加配置元件/JDBC Connection Configuration
- 添加配置信息
- 创建JDBC请求
- 获取数据
9.2 配置信息配置
- Max Number of Connections:连接池最大连接数。
- 根据需求进行配置,将最大连接数设置为并发用户数的1.2 - 1.5倍
- 设置为0时,表示连接池的最大连接数没有明确的限制,连接池可能会根据实际需求动态地创建新的数据库连接(不推荐使用)
- Max Wait:获取连接失败,等待连接释放的最大等待时间
- Time Between Eviction Runs:检查并清理空闲连接的时间间隔
- Auto Commit:自动提交
- 设置为True,会在执行完SQL后自动提交事务
- 设置为False,需要手动进行事务的提交和回滚
- Transaction Isolation:事务隔离级别
- default:和连接数据库的隔离级别保持一致(推荐)
- 是否开启预编译:
- 预编译(简单理解):数据库优化技术,实现参数和模板分离。
- 预编译步骤一:模板编译:数据库提前解析带有占位符的SQL,生成执行计划并缓存
- 预编译步骤二:参数绑定:执行时只需要传递参数值,无需二次编译,提升性能并且防注入
9.3 创建JDBC请求
参考文档:Apache JMeter - 用户手册:组件参考
执行的SQL语句类型
补充:占位符替换和${}替换的区别(重要)
?占位符是将SQL中的占位符替换为参数,底层原理是对SQL进行预编译生成执行计划,之后执行时对参数进行替换,因此能有效的防止SQL注入的问题,同时,对于需要重复执行的SQL,占位符替换无需反复编译,效率比较高
$ 替换是将引用的字符串直接拼接到SQL语句中,底层原理是将字符串直接拼接后编译,因此存在SQL注入的安全问题。对于需要重复执行的SQL,每次都要拼接后编译,因此效率比较低
- Select Statement:普通查询SQL,支持使用 ${变量名称} 进行参数化,不支持 ?占位符
- Update Statement:普通修改SQL(insert / update / delete),支持使用 ${变量名称} 进行参数化,不支持 ?占位符
- Prepared Select Statement:预编译查询SQL,支持 ?占位符,不支持使用 ${变量名称} 进行参数化
- 可以使用${}进行参数化,但是引用的变量是字符串需要手动添加引号,较为麻烦,不支持
- Prepared Update Statement:预编译修改SQL,支持 ?占位符,不支持使用 ${变量名称} 进行参数化
- Callable Statement:调用存储过程,支持使用 ${变量名称} 进行参数化,支持 ?占位符
- Commit:提交当前连接的事务,忽略SQL语句,配合
AutoCommit(false)
使用。 - Rollback:回滚当前连接的事务,忽略SQL语句,配合
AutoCommit(false)
使用。 - Autocommit(false):不提交事务。
- Autocommit(true):自动提交事务。
9.4 JDBC请求参数化
使用占位符方式进行参数化,在parameter value使用${}引用变量给占位符赋值
- 用户自定义的变量
- 随机函数
- CSV参数化
9.5 发送请求
发送请求
查看结果
在察看结果树 --> 请求 --> 请求体中查看实际执行的SQL语句
在察看结果树 --> 响应数据 – > 响应体中查看查询结果
使用结果
添加调试取样器,可以在取样器的响应体中查看查询的查询数据
${result_username_#} 获取当前列数据有多少行
${result_username_N} 获取当前列数据的第N行,N超过数据返回,直接使用 ${result_username_N} 返回
10 Jmeter的命令行执行
-n 通过命令行执行jmeter脚本
-t 指定jmx文件的目录
-l 生成jtl报告(需要使用Jmeter的察看结果树观看)
-e 生成html报告
-o 指定html报告的存储路径(必须为空目录)
生成jtl需要进行全局配置 -- 通常不使用,而是使用生成html报告
全局配置:设置输出格式为xml,设置下面两个属性为true
jmeter.save.saveservice.output_format=xml
jmeter.save.saveservice.response_data=true
jmeter.save.saveservice.samplerData=true
# 生成jtl报告指令
jmeter -n -t test.jmx -l report.jtl
生成html报告的全局配置,设置输出格式为csv:
jmeter.save.saveservice.output_format=csv
jmeter.save.saveservice.response_data=true
jmeter.save.saveservice.samplerData=true
# 生成html报告指令
jmeter -n -t csv.jmx -l result.jtl -e -o reports