JMeter压力测试初探

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. 线程组

就是我们通常使用的线程。通俗的讲,一个线程组可以看做一个虚拟用户组,线程组中的每个线程都可以理解为一个虚拟用户。多个用户同时去执行相同的一批次任务。每个线程之间都是隔离的,互不影响的。一个线程的执行过程中,操作的变量,不会影响其他线程的变量值。

线程组的常用设置:

  1. 取样器错误后要执行的动作:
    • 继续:忽略错误,继续执行
    • Start Next Thread Loop: 忽略错误,线程当前循环终止,执行下一个循环。
    • 停止线程:当前线程停止执行,不影响其他线程正常执行。
    • 停止测试:整个测试会在所有当前正在执行的线程执行完毕后停止
    • Stop test now:整个测试会立即停止执行,当前正在执行的取样器可能会被中断。
  2. 设置线程数:
    • 线程数也就是并发数,每个线程将会完全独立的运行测试计划,互不干扰。多个线程用于模仿对服务器的并发访问。
  3. 设置ramp-up period
    • ramp-up period用于设置启动所有线程所需要的时间。如果选择了10个线程,并且ramp-up period是100秒,那么JMeter将使用100秒使10个线程启动并运行。每个线程将在前一个线程启动后10(100/10)秒后启动。
    • 当这个值设置的很小、线程数又设置的很大时,在刚开始执行时会对测试客户机产生很大的负荷。
  4. 设置循环次数:
    • 该项设置线程组在结束前每个线程循环的次数,如果次数设置为1,那么JMeter在停止前只执行测试计划一次。
    • 如果勾选永远,那么每个线程会无限循环整个测试计划,直到手动停止。(并非只有手动停止一种停止方式,定时器也可以控制停止)
  5. 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。

实际使用中:

  1. 可以通过设置在不同吞吐量分别持续一段时间,考察系统在不同吞吐量情况下的稳定性

  2. 可以通过设置随着时间持续增加的吞吐量,来探测系统吞吐量的的极限

举例:

Jmeter性能测试-jp@gc – Throughput Shaping Timer的使用

5. 常用监听器的使用

  1. jp@gc – Transactions per Second
  2. jp@gc – Response Times Over Time
  3. 聚合报告&汇总报告

Jmeter性能测试-常用监听器的使用

6. 数据准备(以CSV data set config为例)

使用CSV data set config配置元件准备大量的测试数据

CSV 数据文件设置:

  1. 指定数据文件

  2. 设置文件编码

  3. 设置变量名称(后续在脚本其他位置引用)

  4. 是否忽略首行

  5. 分隔符(决定了数据如何分割)

  6. 是否允许带引号

  7. 遇到文件结束符再次循环

  8. 遇到文件结束符停止线程

  9. 线程共享模式:

  • 全部线程

    是指在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:

  1. 设置要检查的json字段 Assert JSON Path exists:$.name

    $.要检查的json字段

  2. 勾选是否添加断言值

  3. 是否支持正则表达式

  4. 期望值 Excepted Value:

    即 用来与实际值比对的期望值

  5. Except null 是否接受断言结果为null

  6. 取反(如匹配则认为失败)