JMeter工具基础使用
JMeter的三个重要组件
线程组
作用:控制JMeter用于执行测试的一组用户
分类:
- Setup线程组:预测试操作,所有脚本之前执行
- 线程组:执行测试用例的
- Teardown线程组:所有脚本之后执行
位置:测试计划------添加------线程(用户)------线程组
属性:
- 线程数:虚拟用户数
- Ramp-Up时间:全部虚拟用户启动需要的时间
- 循环次数:指定运行次数,选中"永远"后一直执行
调度器:配合"永远"使用。
Ps:线程数为2,循环次数为3;与线程数为3,循环次数为2的区别?
- 线程数表示虚拟用户数,用户数越多,负载越大
- 循环次数代表运行时间,次数越多,运行时间越长
HTTP请求
作用:向服务器发送http及https请求
位置:线程组------添加------取样器------HTTP请求
属性:
- 协议:默认为HTTP,HTTPS
- 服务器名称或IP:IP地址
- HTTP请求:GET或POST请求
- 路径:URL端口后面的部分
- 参数:get方法中URL路径中传参(/?键名=键值&键名=键值)
- 消息体数据:POST方法中,请求体中传参数(直接在消息体数据中添加请求体,任意格式:from、json)
查看结果树
作用:在查看结果树中点击运行可以查看请求参数和响应结果
位置:线程组------添加------监听器------查看结果树
JMeter参数化
参数化:把测试数据组织起来,用不同的测试数据 调用相同的测试方法
用户定义的变量
场景:定义全局变量
位置:线程组------添加------配置元件------用户定义的变量
使用方法:
添加用户定义的变量,格式:变量名 - 变量值
在HTTP请求中引用定义的变量名。格式:${变量名}
用户参数
场景:针对同一组参数,不同用户访问时,可以获取到不同的值
位置:线程组------添加------前置处理器------用户参数
使用方法:
第一列添加多个变量名,后续每一列为一组用户的数据
在HTTP请求中引用定义的变量名。格式:${变量名}
CSV数据文件设置
场景:当不同用户或者同一用户多次循环时,都可以获取到不同的值
位置:线程组------添加------配置元件------CSV数据文件设置
使用方法:
准备好CSV数据文件,文件名处为文件路径
变量名称:自定义
在HTTP请求中引用自定义的变量名。格式:${变量名}
函数
场景:相当于计数函数,自动生成不重复的数据,让每个用户每次循环都能取到不同的值,且不需要提取定义
位置:菜单栏中的工具------函数助手对话框------选择counter函数------选择计数器方式------点击生成------复制函数
使用方法:
在HTTP请求中使用counter函数。格式:${__counter(FALSE,)}
四种参数化方式的不同
用户定义的变量:
- 作用:定义全局变量
- 局限性:每次取值(无论是否相同的用户) 都是固定值
用户参数:
- 作用:保证不同的用户针对同一组参数,可以取到不同的值
- 局限性:同一个用户在多次循环时,取到相同的值
csv数据文件设置:
- 作用:保证不同的用户及同一用户多次循环时,都可以取到不同的值
- 局限性:需要手动进行测试数据的设置
函数
- 作用:保证不同的用户及多次循时,都可以取到不同的值,不需要提前设置
- 局限性:输入数据有特定的业务要求时无法使用(如:登录时的用户名密码)
PS:查看结果树看到的发送消息和HTTP取样器配置不完全一样的原因?
- 查看结果树中最外层HTTP请求的 请求信息和响应信息,应该与子节点中最后一个HTTP请求的请求信息和响应信息一致
- 配置的HTTP请求,因该与子结点中第一个请求的请求信息一致
利用JMeter测试的一个具体用例,找一个跟着学一下,不然真的不会,不知道在干嘛怎么用
JMeter断言
让程序自动判断预期结果和实际结果是否一致
- JMeter在请求的返回层有一个自动判断机制(响应状态码)
- 但是请求成功了,并不代表结果一定正确,需要检测机制提高测试准确性。
- 响应断言
- 位置:HTTP请求------断言------响应断言
- 场景:对HTTP请求任意格式的响应结果进行断言
- JSON断言
- 位置:HTTP请求------断言------JSON断言
- JSON路径: . w e a t h e r i n f o . c i t y , .weatherinfo.city, .weatherinfo.city,.为根目录,.对目录进行分割
- 场景:对HTTP请求格式为JSON格式的响应结果进行断言
- 持续时间断言
- 位置:HTTP请求------断言------持续时间断言
- 作用:检查HTTP请求的响应时间是否超出要求范围
JMeter关联
当请求之间有依赖关系的时候需要用到关联处理。如一个请求的入参是另一个请求返回的数据。
正则表达式
公式格式:左边界(匹配符)右边界
.:通配符,可以代表任意字符(换行回车除外)
*:表示前面的字符出现0次或多次
?: 表示非贪婪匹配,找到左边界后,往右查找右边界,查到匹配的右边界就停止继续查找;再次查找左边界和右边界
正则表达式提取器位置:HTTP请求------后置处理器------正则表达式提取器
参数:
引用名称:存放提取出的值的参数名称
模板:用$$引用起来,表示解析出的第几个正则表达式(.*?)中的值
匹配数字:1表示第一个值,0表示随意一个值,-1表示获取所有值
XPath提取器
位置:HTTP请求-后置处理器-XPath提取器
JSON提取器
位置:HTTP请求-后置处理器-JSON提取器
JMeter属性
用于不同线程组之间的参数获取
- setProperty函数:将值保存成JMeter属性
- property函数:在其他线程组中使用property函数读取属性
- 使用步骤:
- 添加线程组1
- 添加HTTP请求------添加JSON提取器
- 使用setProperty函数保存JSON中的值
- 添加BeanShell取样器,在脚本中添加JMeter属性:{__setProperty(pro_city,{city},)}
- 添加线程组2
- 添加HTTP请求------使用property函数读取JMeter属性:${__property(pro_city,)}
- 添加线程组1
JMeter录制脚本
- 作用:在没有接口文档的旧项目中,快速录制web页面产生的HTTP接口请求,帮助编写接口测试脚本
- 位置:测试计划(右键)->非测试元件->HTTP代理服务器
JMeter直连数据库
使用场景
- 用作请求的参数化:登录时需要的用户名,可以从数据库中查询获取
- 用作结果的断言:添加购物车下订单,检查接口返回的订单号,是否与数据库中生成的订单号一致
- 清理垃圾数据:添加商品,再执行该脚本不能成功,需要在下次执行前删除该商品数据
- 准备测试数据:通过数据库准备大量的性能测试数据
JMeter逻辑控制器
位置:线程组-逻辑控制器-IF控制器/循环控制器/ForEach控制器
- IF控制器:控制它下面的测试元素是否运行
- 循环控制器:通过设置循环次数,实现循环发送请求
- ForEach控制器:一般和用户自定义变量或者正则表达式提取器一起使用,读取返回结果中一系列相关的变量
JMeter定时器
- 同步定时器:阻塞线程,当在规定时间内 达到一定的线程数量 ,这些线程会在同一个时间点一起释放 ,瞬间产生很大压力。
- 超时时间:超市多少毫秒后同时释放指定的线程数。
- 0:表示定时器会等待线程数达到了设置的线程数才释放,若没有达到则会一直死等。
- 常数吞吐量定时器:
- QPS单位为:次/s,而该定时器参数是:次/m,因此需要注意时间的换算
- 固定定时器
定时器的作用也需要后面遇到具体的项目来做才能明白其作用