一、jmeter直连数据库
1.1场景
连接tpshop商城数据库获取商品名包含:小米手机5 的商品id
1.2准备工作
启动数据库服务器
添加mysql驱动jar包
- 在测试计划面板点击“浏览…“按钮,将你的JDBC驱动添加进来
配置数据库连接信息
测试计划 --> 线程组--> (右键添加) 配置元件 --> JDBC Connection Configuration
主要参数:
Variable Name: mysql数据库连接池名称(JDBC请求时要引用)
Database URL: jdbc:mysql://localhost:3306/tpshop2.0
- jdbc:mysql:(MySQL固定格式)
- //127.0.0.1:(数据库ip地址)
- 3306:(MySQL默认端口,如改变,请如实填写)
- books:要连接的数据库名称
JDBC DRIVER class: com.mysql.jdbc.Driver(MySQL驱动包位置固定格式)
Username: root(连接数据库用户名,如实填写)
Password:(MySQL数据库密码,如实填写,如果密码为空不写)
1.3操作步骤
1.添加线程组 2.添加 JDBC Connection Configuration 3.添加 JDBC request 4.添加查看结果树
主要参数:
Variable Name:数据库连接池的名字,需要与JDBC Connection Configuration的Variable Name Bound Pool名字保持一致
Query:填写的sql语句未尾不要加“;”
Parameter values:参数值
Parameter types:参数类型
Variable names:保存sql语句返回结果的变量名
Result variable name:创建一个对象变量,保存所有返回的结果
Query timeout:查询超时时间
Handle result set:定义如何处理由callable statements语句返回的结果
二、JMeter逻辑控制器
1.逻辑控制器
逻辑控制器可以按照设定的逻辑控制取样器的执行顺序
1.1常用逻辑控制器
如果(If)控制器
循环控制器
ForEach控制器
2.如果(if)控制器
If控制器用来控制它下面的测试元素是否运行 添加方式:测试计划 --> 线程组--> (右键添加) 逻辑控制器 --> 如果(If)控制器
2.1案例
1. 使用‘用户定义的变量’定义一个变量name,name的值可以是‘baidu’或‘itcast’
2. 根据name的变量值实现对应网站的访问
操作步骤 :1. 添加线程组 2. 用户定义的变量 3. 添加If控制器,判断name是否等于baidu 4. 添加HTTP请求,用来访问百度 5. 添加If控制器,判断name是否等于itcast 6. 添加HTTP请求,用来访问传智播客 7. 添加查看结果树
IF控制器
3.循环控制器
通过设置循环次数,来实现循环发送请求
添加方式:测试计划 --> 线程组--> (右键添加) 逻辑控制器 --> 循环控制器
3.1案例
1. 循环访问百度10次
操作步骤 1. 添加线程组 2. 添加循环控制器 3. 添加HTTP请求 4. 添加查看结果树
线程组属性控制组内所有取样器的执行次数,而循环控制器可以控制组内部分取样器的循环次数,后者控制精度更高
4.ForEach控制器
ForEach控制器一般和用户自定义变量或者正则表达式提取器一起使用,其在用户自定义变量或者从正则表达式提取器的返回结 果中读取一系列相关的变量。 该控制器下的取样器都会被执行一次或多次,每次读取不同的变量值。 添加方式:测试计划 --> 线程组--> (右键添加) 逻辑控制器 --> ForEach控制器
4.1案例
1. 有一组关键字 [hello,python,测试],使用用户定义的变量存储
2. 要依次取出关键字,并在百度搜索,例如:https://www.baidu.com/s?wd=hello
操作步骤 :1. 添加线程组 2. 用户定义的变量 3. 添加ForEach控制器 4. 添加HTTP请求 5. 添加查看结果树
三、JMeter定时器
1. 同步定时器(Synchronizing Timer)[集合点]
1.1介绍
SyncTimer的目的是阻塞线程,直到阻塞了n个线程,然后立即释放它们。
同步定时器相当于一个储蓄池,累积一定的请求,当在规定的时间内达到一定的线程数量,这些线程会在同一个时间点一起 并发,所以可以用来做大数据量的并发请求。
添加方式:测试计划 --> 线程组--> HTTP请求 --> (右键添加) 定时器 --> Synchronizing Timer
1.2案例
场景 :模拟100个用户同时访问百度首页,统计高并发情况下运行情况
操作步骤 :1. 添加线程组,设置线程数=100 2. 添加HTTP请求 3. 添加同步定时器 4. 添加查看结果树 5. 添加监听器-聚合
操作截图
1.3 注意事项
问题: 当用户数不能整除集合点组件的一组用户数属性时,如果超时时间是 0,会导致程序挂起,怎么避免挂起?
方案1: 点击 stop 强行终止,但是不建议
方案2: 修改一组用户数,能够做到整除(治标不治本)
方案3: 修改超时时间,不设置为 0,即便一组用户数填充不满,只要超时,也会执行(建议)
2.常数吞吐定时器(Constant Throughput Timer)
2.1 介绍
常数吞吐量定时器可以让JMeter以指定数字的吞吐量(以每分钟的样本数为单位,而不是每秒)执行。 吞吐量计算的范围可以为 指定为当前线程、当前线程组、所有线程组。
添加方式:测试计划 --> 线程组--> HTTP请求 --> (右键添加) 定时器 --> Constant Throughput Timer
2.2案例
场景 :一个用户以 20QPS (20 次/s) 的频率访问百度首页,持续一段时间,统计运行情况
操作步骤 :1. 添加线程组,循环次数设置成永远 2. 添加HTTP请求 3. 添加常数吞吐定时器 4. 添加查看结果树 5. 添加监听器-聚合报告
四、jmeter分布式
1.JMeter分布式测试
在使用JMeter进行性能测试时,如果并发数比较大(比如项目需要支持10000并发),单台电脑的(CPU和内存)可能无法支持,这时 可以使用JMeter提供的分布式测试的功能。
1.1 JMeter分布式执行原理
- JMeter分布式测试时,选择其中一台作为控制机(Controller),其它机器做为代理机(Agent)。
- 执行时,控制机会把脚本发送到每台代理机上,代理机拿到脚本后就开始执行,代理机执行时不需要启动JMeter界面,可以 理解它是通过命令行模式执行的。
- 执行完成后,代理机会把结果回传给控制机,控制机会收集所有代理机的信息并汇总。
1.2 代理机(Agent)配置
- 1. Agent机上需要安装JMeter
- 2. 修改服务端口 - 注意:非必须。如果是在同一台机器上演示需要使用不同的端口,多台机器可以不修改 - 打开bin/jmeter.properties文件,修改`server_port`,比如:`server_port=2001`
- 3. 将RMI SSL设置为禁用 - 打开bin/jmeter.properties文件,修改为:server.rmi.ssl.disable=true
- 4. 运行Agent上的jmeter-server.bat文件,启动JMeter
1.3 控制机配置
- 1. 修改JMeter的bin目录下jmeter.properties配置文件,修改`remote_hosts` - 示例:`remote_hosts=192.168.182.100:1099,192.168.182.101:1099` - IP和Port是Agent机的IP以及自定义的端口,多台Agent之间用","隔开
- 2. 将RMI SSL设置为禁用 - 打开bin/jmeter.properties文件,修改为:server.rmi.ssl.disable=true
- 3. 启动JMeter
- 4. 选择菜单:运行-->远程启动/远程全部启动
五、JMeter测试报告
1.聚合报告
2.生成html测试报告
2.1命令
jmeter -n -t [jmx file] -l [result file] -e -o [html report folder]
例如: jmeter -n -t hello.jmx -l result.jtl -e -o ./report
参数描述:
- -n:非GUI模式执行JMeter
- -t [jmx file]:测试计划保存的路径及.jmx文件名,路径可以是相对路径也可以是绝对路径
- -l [result file]:保存生成测试结果的文件,jtl文件格式
- -e:测试结束后,生成测试报告
- -o [html report folder]:存放生成测试报告的路径,路径可以是相对路径也可以是绝对路径
- 注意:result.jtl和report会自动生成,如果在执行命令时result.jtl和report已存在,必须用先删除,否则在运行命令时就会报错
2.2查看测试报告
六、JMeter性能测试常用图表
1.常用平均并发数计算公式
PV:(Page View)即页面访问量,每打开一次页面PV计数+1,刷新页面也是。PV只统计页面访问次数。
UV(Unique Visitor),唯一访问用户数,用来衡量真实访问网站的用户数量。 一般用UV统计用户活跃数,用PV统计用户访问页面的频率
1.1普通计算方法
- 计算公式:TPS= 总请求数 / 总时间
- 按照需求所示,在2019年第32周,有4.13万的浏览量,那么总请求数,我们可以认为估算为4.13万(1次浏览都至少对应1个请求)
- 总请求数 = 4.13 万请求数 = 41300 请求数
- 总时间:由于不知道每个请求的具体时间,我们按照普通方法,我们可以按照一周的时间进行计算 总时间 = 1天 = 1 * 24 小时 = 24 * 3600 秒
- 套入公式可得: TPS = 41300请求数/24*3600秒 = 0.48请求数/秒
- 结论:按照普通计算方法,我们在测试环境对相同的系统进行性能测试时,每秒能够发送0.48请求就可以满足线上的需要。
1.2 二八原则
二八原则就是指80%的请求在20%的时间内完成
计算公式 : TPS = 总请求数 80% / (总时间20%)
按照公式进行计算
TPS = 41300 * 0.8请求数 / 24*3600*0.2秒 = 1.91 请求数/秒
结论:按照二八原则计算,在测试环境我们的TPS只要能达到1.91请求数每秒就能满足线上需要。二八原则的估算结果会比平均值的计算方法更能满足用户需求。
1.3按照业务数据进行计算
业务数据:有的公司会统计一定时间内的所有业务数据,我们可以根据这个业务数据曲线图,统计出最多请求的数量和时间比例。
计算模拟用户正常业务操作(稳定性测试)的并发量:
根据这些数据统计图,可以得出结论:
- 大部分订单在8点-24点之间,因此系统的有效工作时长为16个小时
- 从订单数量统计,8-24点之间的订单占一天总订单的98%左右(40474个)
结合二八原则计算公式 : TPS = 总请求数 80% / (总时间20%)
需要在测试环境模拟用户正常业务操作(稳定性测试)的并发量为:
TPS = 40474 * 0.8请求数 / 16*3600*0.2秒 = 2.81 请求数/秒
计算模拟用户峰值业务操作(压力测试)的并发量
根据这些数据统计图
订单最高峰在在21点-22点之间,一小时的订单总数大约为8853个
计算压力测试的并发数:TPS = 峰值请求数/峰值时间 * 系数
需要在测试环境模拟用户峰值业务操作(压力测试)的并发量为:
TPS = 8853 请求数 / 3600秒 * 3(系数) = 7.38 请求数/秒
2.插件管理包工具
2.1 应用步骤
1. 下载包管理工具jar包 2. 将包管理工具jar包添加到jmeter中 3. 下载性能测试常用组件
下载: https://jmeter-plugins.org/install/Install/
3.性能测试常用图表及组件
3.1 Concurrency Thread Group 线程组
说明:阶梯线程组
添加方式:测试计划 --> 线程(用户)--> Concurrency Thread Group
参数:
重点:
Target Concurrency:目标并发(线程数)
Ramp Up Time:加速时间
Ramp-Up Steps Count:加速步骤计数
Hold Target Rate Time:运行时间
Time Unit:时间单位(分钟或者秒)
了解:
Thread Iterations Limit:线程迭代次数限制(循环次数)
Log Threads Status into File: 将线程状态记录到文件中(将线程启动和线程停止事件保存为日志文件)
3.2 Transactions per Second
说明: 每秒完成事务数 场景:统计业务成功率
添加方式:测试计划 --> 线程组--> 监听器-->Transactions per Second
(提示:要配合事务控制器完成,如果不使用事务控制器,默认一个请求为一个事务)
3.3 Bytes Throughput Over Time
说明:查看服务器吞吐流量 单位/字节
添加方式:测试计划 --> 线程组--> 监听器-->Bytes Throughput Over Time
3.4 PerfMon Metrics Collector
说明:用来监控服务端的性能的工具,包括cpu、内存、磁盘、网络等性能数据
添加方法:线程组->监听器->jp@gc - PerfMon Metrics Collector
注意:使用之前需要在服务器端安装监听服务程序并启动!!!!!!!!!!!
监控服务器服务程序:
1. 下载安装包ServerAgent-2.2.3.zip,链接地址:https://github.com/undera/perfmon-agent
2. 解压ServerAgent-2.2.3.zip
3. 启动,如果是windows运行startAgent.bat,如果是linux运行startAgent.sh
4. 启动这个工具后,jmeter的插件jp@gc - PerfMon Metrics Collector就可以收集服务端的资源使用率,并在jmeter中查看