性能测试工具
- 主流性能测试工具
- Loadrunner
- JMeter
- JMeter环境安装
- JMeter功能概要
- JDK常用文件目录介绍
- JMeter元件和组件介绍
- 元件的基本介绍
- 组件的基本介绍
- JMeter元件作用域和执行顺序
- JMeter第一个案例
- 线程组
- HTTP请求
- 查看结果树
- JMeter参数化(重点)
- 用户定义的变量
- 用户参数
- CSV数据文件设置
- 函数(__counter)
- 小结
主流性能测试工具
Loadrunner
- HP Loadrunner是一种工业级标准性能测试负载工具,可以模拟上万用户实施测试,并在测试时可实时检测应用服务器及服务器硬件各种数据,来确认和查找存在的瓶颈
- 支持多协议:Web(HTTP/HTML)、Windows Sockets、FTP、ODBC、MS SQL Server等协议
- 采用C语言编写
- 优点
- 多用户(支持用户以万为单位)
- 详细的分析报表(以秒为单位)
- 支持IP欺骗功能
- 缺点
- 收费
- 体积庞大(安装包单位GB)
- 无法定制功能
JMeter
- JMeter是Apache组织开发的基于Java的开源软件,用于对系统做功能测试和性能测试
- 它最初被设计用于Web应用测试,但后来扩展到其他测试领域,例如静态文件、Java程序、shell脚本、数据库、FTP、Mail等
- 优点
- 开源免费
- 小巧(安装包50MB左右)
- 丰富的学习资料和扩展组件
- 缺点
- 不支持IP欺骗
- 分析和报表能力相对于LR欠缺精度(以分钟为单位)
JMeter环境安装
1、安装JDK
2、安装JMeter(JMeter版本与JDK版本匹配)
安装好后,进入JMeter安装目录下的bin目录【以下任意一种方式打开】
1)双击jmeter.bat
2)双击ApacheJMeter.jar
3)命令行输入:java -jar ApacheJMeter.jar
JMeter功能概要
JDK常用文件目录介绍
- Bin目录:存放可执行文件和配置文件
- jmeter.bat——windows的启动文件【重要】
- jmeter.log——Jmeter工具运行的日志文件
- jmeter.properties——Jmeter工具的配置文件【重要】
- jmeter.sh——linux的启动文件
- jmeter-server linux分布式测试的启动程序
- jmeter-server.bat windows分布式测试的启动程序
- docs目录:是JMeter的api文档,用于开发扩展组件
- printable_docs目录:用户帮助文档
- 用户手册路径:…\apache-jmeter-5.6.3\printable_docs\usermanual\index.html
- lib目录:存放JMeter依赖的jar包和用户扩展所依赖的jar包
JMeter元件和组件介绍
元件的基本介绍
- 元件:多个类似功能组件的容器(类似于类)
- 取样器:发送请求
- 逻辑控制器:控制语句的执行顺序
- 前置处理器:对请求参数进行预处理
- 后置处理器:对响应结果进行提取
- 断言:检查接口的返回结果是否与预期结果一致
- 定时器:设置等待
- 测试片段:封装一段代码,供其他脚本调用
- 配置元件:测试数据的初始化配置
- 监听器:查看JMeter脚本的运行结果
组件的基本介绍
-
组件:实现独立的某个功能(类似于方法)
如:取样器的组件
(1)如下接口自动化脚本的实现过程对应着Jmeter哪个元件?
- 初始化测试数据——配置元件
- 对请求参数化赋值——前置处理器
- 调用GET/POST方法发送请求——取样器
- 提取响应中特定字段的值——后置处理器
- 对提取出来的值与预期结果进行对比——断言
- 在控制台查看脚本运行的结果——监听器
(2)元件与组件有什么关系?
元件:多个类似功能组件的容器(类似于类)
组件:容器中实现独立的某个功能(类似于方法)
JMeter元件作用域和执行顺序
元件的作用域:是靠测试计划的树形结构中元件的父子关系来确定的
提示:所有的组件都是以取样器为核心来运行的。组件添加的位置不同,生效的取样器也不同。
- 作用域的原则
- 取样器:核心,不和其他元件相互作用,没有作用域
- 逻辑控制器:只对其子节点中的取样器和逻辑控制器起作用
- 其他元件:
- 如果是某个取样器的子节点,则该元件只对其父节点起作用
- 如果其父节点不是取样器,则其作用域是该元件父节点下的其他所有后代节点(包括子节点、子节点的子节点等)
- 元件的执行顺序
- 同一个作用域下不同类型元件:
- 配置元件
- 前置处理程序
- 定时器
- 取样器
- 后置处理程序
- 断言
- 监听器
JMeter第一个案例
需求:使用JMeter访问百度首页接口,并查看请求和响应信息
步骤:
- 启动JMeter
- 在’测试计划’下添加’线程组’
- 在’线程组’下添加’HTTP请求’取样器
- 填写’HTTP请求’的相关请求数据
- 在’线程组’下添加’查看结果树’监听器
- 点击’启动’按钮运行,并查看结果
线程组
作用:线程组就是控制Jmeter用于执行测试的一组用户
位置:右键点击‘测试计划’ --> 添加 --> 线程(用户) --> 线程组
【特点】
- 模拟多人操作
- 线程组可以添加多个,多个线程组可以并行或串行
- 取样器(请求)和逻辑控制器必须依赖线程组才能使用
- 线程组可以添加其他元件下组件
【线程组分类】
- 线程组:普通的、常用的线程组,可以看作一个虚拟用户组,线程组的每一个线程都可以理解为一个虚拟用户
- setUp线程组:一种特殊类型的线程组,可用于执行预测试操作
- tearDown线程组:一种特殊类型的线程组,可用于执行测试后工作
【参数详解】
如下场景如何设置线程组?
- 模拟10个用户并行执行——线程数10
- 模拟10个用户5s内启动完成——线程数10,ramp-up时间:5s
- 模拟2个用户各循环3次——线程数2,循环次数2
- 模拟2个用户运行30s——线程数2,循环永远,持续时间30s
- 模拟2个用户等待10s后开始执行——线程数2,循环永远,启动延迟10s
案例分析:
- 使用1个线程组,添加http请求
- 配置线程数为2,循环次数为3时,运行观察结果
- 配置线程数为3,循环次数为2时,运行观察结果,对比不同
分析:
- 线程数代表虚拟用户数,用户数越多,负载越大
- 循环次数代表运行时间,次数越多,运行时间越长
HTTP请求
作用:向服务器发送http及https请求
位置:选中线程组 --> 右键 --> 添加 --> 取样器 --> HTTP请求
参数:
【练习】编写Jmeter脚本,访问百度
案例一:GET请求,URL为http://www.baidu.com/S?wd=test
要求:使用HTTP请求—路径来传递get请求参数
案例二:GET请求,URL为https://www.baidu.com/S?wd=test
要求:使用HTTP请求—参数列表来传递get请求的参数
案例三:POST请求,URI为https://www.baidu.com/S,请求体为:wd=test(form表单
要求:使用HTTP请求—参数列表来传递POST请求的form格式参数
案例四:POST请求,URL为http://www.baidu.com/S,请求体为:wd=test(form表单)要求:使用HTTP请求—消息体数据来传递POST请求的form格式参数
查看结果树
作用:查看http请求的请求和响应结果
位置:选中测试计划/线程组 --> 右键 --> 添加 --> 监听器 --> 查看结果树
组成:
- 取样结果:查看响应信息头信息、响应状态码
- 请求:查看请求相关信息(url、方法、参数)
- 响应:查看响应信息
若结果出现乱码,解决方法:
1、找到jmeter安装目录下的bin目录
2、打开jmeter.properties文件,修改配置sampleresult.default.encoding=UTF-8
3、重启jmeter即可
【新版默认就是utf-8】
JMeter参数化(重点)
参数化测试:把测试数据组织起来,用不同的测试数据调用相同的测试方法
本质:实现测试数据与测试方法的分离
- JMeter中常见的参数化方式:
- 用户定义的变量——全局变量
- 用户参数——为每个用户分配不同的参数值
- CSV Data Set Config——文件方式参数化
- 函数——随机数据
- 数据库
用户定义的变量
作用:定义全局变量
位置:测试计划 --> 线程组 --> 配置元件 --> 用户定义的变量
【练习】
请求:https://www.baidu.com:443
要求:使用用户定义的变量配置被测系统的协议、域名和端口
用户参数
作用:针对同一组参数,当不同的用户来访问时,可以获取到不同的值
位置:测试计划 --> 线程组 --> 前置处理器 --> 用户参数
【练习】
请求:https://www.baidu.com
要求:第一个用户请求附带参数:name=“张三"&age=28;第二个用户请求附带参数:name=“李四”&age=30
操作步骤:
1、添加线程组,线程数设置为2
2、添加用户参数
3、添加HTTP请求
4、添加查看结果树
CSV数据文件设置
作用:让不同用户在多次循环时,可以取到不同的值
位置:测试计划 --> 线程组 --> 配置元件 --> CSV数据文件设置
【练习】
请求:https://www.baidu.com
要求:循环请求3次,每次请求时附带参数username,password,code的值不相同
操作步骤:
1、定义CSV数据文件
2、添加线程组,设置循环次数为3
3、添加CSV数据文件设置
4、添加HTTP请求
5、添加查看结果树
函数(__counter)
作用:计数函数,一般做执行次数统计使用
位置:在菜单中选择 --> 选项(工具) --> 函数助手对话框
【练习】
请求:访问百度首页 http://www.baidu.com/s?num=1
要求:每个用户每次循环执行该脚本都可以使用不同的值
操作步骤:
1、添加线程组,设置虚拟用户数和循环次数
2、生成__counter函数
3、添加HTTP请求,使用__counter函数
4、添加查看结果树
小结
- 什么是参数化?
- 把测试数据组织起来,用不同的测试数据调用相同的测试方法
- 4种参数化方式有何不同?如何选择适当的方式?
- 用户定义的变量
- 作用:定义全局变量
- 局限性:每次取值(无论是否相同的用户)都是固定值
- 用户参数
- 作用:保证不同的用户针对同一组参数,可以取到不同的值
- 局限性:同一个用户在多次循环时,取到相同的值
- CSV数据文件设置
- 作用:保证不同的用户及同一用户多次循环时,都可以取到不同的值
- 局限性:需要手动进行测试数据的设置
- 函数
- 作用:保证不同的用户及多次循环时,都可以取到不同的值,不需要提前设置
- 局限性:输入数据有特定的业务要求时无法使用(如:登录时的用户密码)
- 用户定义的变量
【案例】
某支付系统,需要1000个不同的用户登录,并使用添加不同的测试金额数据访问支付接口?
答案:
1、准备CSV数据文件——1000个登录的用户名密码
2、添加线程组
3、添加CSV数据文件设置
4、添加HTTP请求——登录,使用读取的用户名密码
5、添加HTTP请求——支付,使用counter函数添加不同的测试金额
6、查看结果树