JMeter压力测试初探
目录
1. 环境准备
JMeter 版本5.3
汉化
D:\apache-jmeter-5.3\bin\jmeter.properties
language=zh_CN
HiDPI(高分屏适配)
Jmeter在4k或者2k高分辨率屏幕下图标与字体都会过小,每次启动后再放大不方便,可以按如下配置:
jmeter.hidpi.mode=true jmeter.hidpi.scale.factor=2.0 jmeter.toolbar.icons.size=48x48 jmeter.tree.icons.size=48x48 jsyntaxtextarea.font.family=Hack jsyntaxtextarea.font.size=28
需要注意的是,使用hidpi配置的时候,外观要选择默认主题windows,实测此主题对hidpi兼容最好。
2. 线程组
就是我们通常使用的线程。通俗的讲,一个线程组可以看做一个虚拟用户组,线程组中的每个线程都可以理解为一个虚拟用户。多个用户同时去执行相同的一批次任务。每个线程之间都是隔离的,互不影响的。一个线程的执行过程中,操作的变量,不会影响其他线程的变量值。
线程组的常用设置:
- 取样器错误后要执行的动作:
- 继续:忽略错误,继续执行
- Start Next Thread Loop: 忽略错误,线程当前循环终止,执行下一个循环。
- 停止线程:当前线程停止执行,不影响其他线程正常执行。
- 停止测试:整个测试会在所有当前正在执行的线程执行完毕后停止
- Stop test now:整个测试会立即停止执行,当前正在执行的取样器可能会被中断。
- 设置线程数:
- 线程数也就是并发数,每个线程将会完全独立的运行测试计划,互不干扰。多个线程用于模仿对服务器的并发访问。
- 设置ramp-up period:
- ramp-up period用于设置启动所有线程所需要的时间。如果选择了10个线程,并且ramp-up period是100秒,那么JMeter将使用100秒使10个线程启动并运行。每个线程将在前一个线程启动后10(100/10)秒后启动。
- 当这个值设置的很小、线程数又设置的很大时,在刚开始执行时会对测试客户机产生很大的负荷。
- 设置循环次数:
- 该项设置线程组在结束前每个线程循环的次数,如果次数设置为1,那么JMeter在停止前只执行测试计划一次。
- 如果勾选永远,那么每个线程会无限循环整个测试计划,直到手动停止。(并非只有手动停止一种停止方式,定时器也可以控制停止)
- Delay Thread creation until needed:
- 默认情况下,测试开始的时候,所有线程就被创建完了。如果勾选了此选项,那么线程只会在合适的需要用到的时候创建。
3. HTTP取样器
一个基本的http请求:
- 协议: http/https
- 服务器名称或IP: baidu.com
- 端口号:默认80 可不填
- 请求方法:POST/GET等等
- 路径:/xxx/xxxx
- 参数......
4. 定时器(以jp@gc – Throughput Shaping Timer为例)
Throughput Shaping Timer 是用来控制吞吐量的定时器,通过延缓线程运行来整体控制取样器产生的RPS。
实际使用中:
- 可以通过设置在不同吞吐量分别持续一段时间,考察系统在不同吞吐量情况下的稳定性
-
可以通过设置随着时间持续增加的吞吐量,来探测系统吞吐量的的极限
举例:
Jmeter性能测试-jp@gc – Throughput Shaping Timer的使用
5. 常用监听器的使用
- jp@gc – Transactions per Second
- jp@gc – Response Times Over Time
- 聚合报告&汇总报告
6. 数据准备(以CSV data set config为例)
使用CSV data set config配置元件准备大量的测试数据
CSV 数据文件设置:
- 指定数据文件
-
设置文件编码
-
设置变量名称(后续在脚本其他位置引用)
-
是否忽略首行
-
分隔符(决定了数据如何分割)
-
是否允许带引号
-
遇到文件结束符再次循环
-
遇到文件结束符停止线程
-
线程共享模式:
-
全部线程
是指在CSV Data Set Config配置元件作用域范围内的所有线程共享一个数据源文件,也就是说在JMeter测试执行过程中,JMeter仅打开一次该数据源文件,每个线程读取的是同一个数据源文件中的数据.线程按照启动的先后顺序依次从数据源文件中获取一个值,不论该线程是否引用CSV Data Set Config中定义的变量,每个线程都会分配一个值,这样可以保证每个线程获取的是数据源文件中不同行的列值(在不循环取值的情况下).
- 当前线程组
是指在CSV Data Set Config配置元件作用域范围内的所有线程组,当JMeter执行测试时,每一个线程组都单独打开一次数据源文件(可以是相同或不同的数据源文件).每个线程组下的各个线程都是从数据源文件的起始处读取参数值.
若要线程组读取不同的数据源文件,可以对数据源文件的路径进行参数化.
这里需要使用{threadGroupName}来获取线程组的名字.
假设有n个线程组:tg1,tg2,…,tgn
每个线程组对应一个数据源文件,对应的文件名分别为: tg1.csv,tg2.csv,…,tgn.csv
在配置时将”Filename”设置为”…/{threadGroupName}.csv”即可. - 当前线程
在CSV Data Set Config配置元件作用域范围内的所有线程组,当JMeter执行测试时,每一个线程
都单独打开一次数据源文件(可以是相同或不同的数据源文件).
每个线程都是从数据源文件的起始处读取参数值.若要线程组读取不同的数据源文件,可以对数据源文件的路径进行参数化.
这里需要使用{threadNum}来获取线程编号.
假设有n个线程,线程编号为:1,2,…,n
每个线程对应一个数据源文件,对应的文件名分别为: testdata1.csv,testdata2.csv,…,testdatan.csv
在配置时将”Filename”设置为”…/testdata{threadNum}.csv”即可.
7. 断言(以json断言为例)
假设response的body是如下的json
{
“name”: “liming”,
“age”: “22”,
“SuccStat”: “0”
}
以上面的这一段json为例,判断name的值是否是liming:
- 设置要检查的json字段 Assert JSON Path exists:$.name
即 $.要检查的json字段
-
勾选是否添加断言值
-
是否支持正则表达式
-
期望值 Excepted Value:
即 用来与实际值比对的期望值
-
Except null 是否接受断言结果为null
-
取反(如匹配则认为失败)