学习视频

JMeter 从入门到精通 (包含作业 / 练习 / 总结 / 回顾)

JMeter 必知必会系列

教程

易百教程:https://www.yiibai.com/jmeter

下载

https://jmeter.apache.org/download_jmeter.cgi

image-20200722080233776

Mac上下载、安装

1
2
3
4
5
6
7
8
9
10
11
# 安装 brew ,非必需
/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"

# 查看是否安装
brew info jmeter
# 安装
brew install jmeter

# 启动
jmeter
# 默认英文的,如果想转换为中文: 可选择Options->Choose Language->Chiness(Simplified)

环境

需要安装 JDK 环境「JMeter 由 Java 语言实现」

安装

解压到没有中文路径的目录中

启动

  • Windows

    bin/jmeter.bat

  • Linux

    bin/jmeter.sh

切换语言

Options-Choose Language

内存配置

找到jmeter.bat文件

1
set HEAP=-Xms4g -Xmx8g -XX:MaxMetaspaceSize=256m

文件

配置文件

jmeter.properties,修改后需要重启

  • 修改语言

    1
    language=zh_CN
  • 修改编码「sampleresult」

    1
    sampleresult.default.encoding=utf-8

日志文件

jmeter.log

分布式服务配置

jmeter-server.batjmeter-server.sh

目录

docs

接口文档目录

extras

扩展插件目录

lib

依赖资源包

printable_docs

帮助文档:用户手册等

licence

许可证

入门脚本

  1. 添加测试计划-默认

  2. 添加线程组

    测试计划,鼠标右键,添加-线程「用户」-线程组

  3. 添加 Http请求

    线程组,鼠标右键,添加-取样器-Http 请求

  4. 添加结果树

    线程组,鼠标右键,添加-监听器-察看结果树

    结果树中可以切换数据显示格式:Text、XML、JSON、HTML等

线程用户

  1. 线程数:模拟的并发用户数
  2. Ramp-Up时间(秒):启动所有线程需要的时间
  3. 循环次数:线程数循环

运行原理

  1. 按照线程方式运行
  2. GUI 模式用来创建测试脚本和调试
  3. 命令行模式实现高并发和压力测试

测试计划要素

  1. 测试计划
  2. 测试计划中至少有一个线程组
  3. 线程组中至少有一个取样器
  4. 测试计划必须有监听器
  5. 保存测试计划

注意:

  1. 测试计划中「独立运行每个线程组」,默认未勾选,多个线程组并行执行。勾选,一个线程组执行完后才执行下一个线程组,按添加顺序执行

监听器「常用」

  • 察看结果树
  • 用表格察看结果
  • 聚合报告
  • 响应时间图

录制脚本

  • 使用 badboy录制

    适用于 Web 端

    1. 安装
    2. 打开「默认开始录制」,在地址栏输入测试网址,操作即可
    3. 操作完成,点击停止录制
    4. 导出脚本
      1. File-Export to Jmeter 保存
  • 在 Jmeter 中导入脚本

    • 打开-选择脚本文件
    • 添加监听器

Jmeter 自身代理录制移动端

配置 Jmeter

  1. 创建测试计划
  2. 添加线程组
  3. 添加 Http 代理服务器
    1. 测试计划-右键-非测试元件-Http 代理服务
    2. Http 代理服务器
      • 端口号默认
      • Https domains 填写本地 ip
      • Test Plan Creation-目标控制器,选择测试计划-线程组
    3. 点击启动-ok「开始录制
  4. 添加监听器

配置手机

和 fidder 配置相同

设置-WLAN-wifi 长按-高级-手动代理

  • 代理服务器主机名为上述 Https domains ip
  • 代理服务器端口为上述 8888

录制

操作手机, 请求会被Jmeter 会自动记录到线程组

接口测试

接口三要素

  • 请求地址/方式
  • 请求参数
  • 返回值

Http 协议

Get、Delete

  • 带参数 params
  • 不带参数

Post、Put

  • x-www-form-urlencoded 键值对:a=1&b=2&c=3

    Content-Type: application/x-www-form-urlencoded

  • json

    Content-Type: application/json

JMeter 取样器 - http 请求

Http 请求配置

  • 协议 http/https

  • 服务器名称或 ip

  • 端口号

  • 方法:请求方式 get post put delete

  • 路径:接口地址

  • 内容编码——utf-8,中文乱码时指定内容编码即可

  • 参数:post 请求是application/x-www-form-urlencodedform-data 格式

    从剪切板添加:每行以回车符分隔列以等号 = 分隔

    1
    2
    username=admin
    password=123456
  • 消息体数据:post 请求中 json/xml 格式请求数据,相当于 postman raw

  • 文件上传:上传文件接口

    1
    2
    文件路径   参数名称  MIME 类型
    /Users/mac126/Pictures/图片/2019-11-15-3.jpg fieldname image/jpeg

Http 信息头管理器【必需】

线程组-添加-配置元件-Http 信息头管理器

1
Content-Type=application/json

参数化

CSV 数据控件实现参数化

  • 适用范围:大量测试数据

  • 创建一个 csv 格式文件

    Excel 创建文件,另存为 CSV 格式,使用 notepad++ 转码

  • 位置:添加线程组-添加-配置元件-CSV Data Set Config

  • 配置CSV Data Set Config

    • 文件名:选择 CSV 数据文件
    • 文件编码:UTF-8
    • 变量名称:多个使用英文逗号隔开
    • 忽略首行:如果首行是变量名,选择忽略首行 true
    • 分隔符:如果 CSV 文件使用逗号隔开,就默认
    • 其它项默认配置
  • 修改线程组配置:线程数或循环数改为数据量

  • 修改请求参数为变量引用:参数引用 "${变量名}"

用户参数

  • 适用范围:小数据量测试数据设置

  • 使用方式:针对 Http 请求添加其用户参数

  • 位置:Http 请求-添加-前置处理器-用户参数

  • 配置用户参数

    参数:

    • 名称:变量名称
    • 用户——一个用户就是一组测试数据
  • 修改线程组配置:线程数改为用户参数数据量

  • 修改 Http 请求中引用变量

用户定义变量「全局定义、引用」

  • 适用:常量配置:数据库地址、测试环境地址、登录数据等

  • 位置

    • 测试计划
    • 配置元件
  • 使用定义的变量替换Http请问对应参数值,变量使用格式为:${变量名}

JMeter 连接数据库

MySQL

  1. 在测试计划中导入数据库驱动 jar 包

  2. 添加线程组

  3. 在线程组添加-配置元件- JDBC Connection Configuration

  4. 配置JDBC Connection Configuration

    1. Variable Name for created pool:连接配置名称
    2. Database URL:jdbc:mysql:// ip:3306/dbname
    3. JDBC Driver class:com.mysql.jdbc.Driver
    4. Username:用户
    5. Password:密码
  5. 在线程组添加-取样器-JDBC Request

    1. 名称:连接名称
    2. Variable Name of Pool declared in JDBC Connection Configuration:连接配置名称
    3. SQL Query
      1. Query Type
      2. SQL 语句
  6. 线程组-添加-监听器-察看结果树

  7. 获取数据查询结果

    • debug sample 显示脚本中所有变量结果

    • variable names

      用逗号分隔的变量名列表,用于保存Select语句、prepared Select语句或CallableStatement返回的值。注意,当与CallableStatement一起使用时,变量列表必须与调用返回的OUT参数序列相同。如果变量名少于输出参数,那么在线程上下文变量中存储的结果应该与提供的变量名一样多。如果存在的变量名多于OUT参数,则将忽略其他变量

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      name_#=4
      name_1=777777
      name_2=zhang daihao
      name_3=小白兔
      name_4=Sandy

      updatetime_#=4
      updatetime_1=2019-02-21 18:26:04.0
      updatetime_2=null
      updatetime_3=2019-01-19 13:13:12.0
      updatetime_4=2019-02-25 16:29:27.0
    • Result variable name 填写变量名,保存查询结果集

      将创建一个包含行映射列表的对象变量。每个映射都包含列名作为键,列数据作为值

      1
      all=[{name=小白兔, update_time=2019-01-19 13:13:12.0}]

上传文件表单

Http 请求

  1. 基本配置

    • 参数

      image-20200803191643660
    • 文件上传

      image-20200803201551146
  2. 高级

    客户端实现,选择 Java

    image-20200803201821609

Http 信息头管理器

1
Content-Type    multipart/form-data  //等价于 基本配置中 对POST使用 multipart/form-data

命令行运行 jmx 脚本

使用非 GUI 模式,即命令行模式运行 JMeter 测试脚本能够大大缩减所需要的系统资源

命令介绍

jmeter -n -t -l

示例: jmeter -n -t testplan.jmx -l test.jtl
含义:表示以命令行模式运行 testplan.jmx 文件,输出的日志文件为 test.jtl

参数介绍

  • -h 帮助

    1
    jmeter -h
  • 在非 GUI 模式下运行 JMeter

    1
    jmeter -n 
  • 指定要运行的 JMeter 测试脚本文件

    1
    jmeter -t test.jmx
  • 记录结果的日志文件

    1
    jmeter -l output.log
  • 远程执行

    1
    2
    jmeter -r
    #在 Jmter.properties 文件中指定的所有远程服务器
  • 设置 JMeter 使用的代理主机

    1
    jmeter -H 代理主机ip
  • 设置 JMeter 使用的代理主机的端口号

    1
    2
    3
    jmeter -P 代理端口

    示例:jmeter -n -t test.jmx -l output.log -H 192.168.1.1 -P 8080

后置处理器

结果状态处理器

image-20200829145231425

将上一个接口的返回值作为下一个接口的参数

正则表达式提取器

https://my.oschina.net/u/4258221/blog/3381668

  1. 第一个接口中添加正则表达式提取器

    image-20200807204922261
  2. 正则表达式提取器内容

    image-20200807204951132
    • 引用名称:verifycode 后面验证码校验接口要用到的变量名称

    • 正则表达式:

      1
      .*{"code":"(.+?)"}.*
    • 即为读取 code 返回值内容,生成验证码接口返回的报文格式为 {“data”:{“code”:”4690”},”code”:”1”,”message”:”成功”,”success”:true}

    • 模版 : 模板是使用正则表达式提取到的第几个值。因为可能有多个值匹配,所以要使用模板。从 1 开始匹配,依次类推。这里只有一个,所以填写 $1$ 即可

    • 匹配数字:0 代表随机取值,1 代表全部取值。默认 1

    • 缺省值表示参数没有取到值的话,默认给它的值。一般不填

  3. 第二个接口中填写参数变量

    image-20200807205028189

JSON Extractor

https://www.bbsmax.com/A/n2d9vnjozD/

说明

 json extractor 后置处理器用在返回格式为 json 的 HTTP 请求中,用来获取返回的 json 中的某个值。并保存成变量供后面的请求进行调用或断言等

取多个变量值

1
2
3
4
5
Variable names 设置为 id1;id2

JSON Path expressions 定义为 $.data.aList [0].id;$.data.aList [1].id

Default Values:1;1

断言

https://www.shangyexinzhi.com/article/253706.html

响应断言

JSON 断言

只能针对响应结果是 applicaton/json 格式的请求进行断言,一般是断言某个字段值是否返回的是我们需要的

1
$.success true

BeanShell 断言

使用 BeanShell 断言的好处是可以自由发挥,比如当断言失败,提示预期结果、实际结果,或者失败时把结果输出到日志

小技巧