Jmeter 性能测试实战教程
1.JMETER介绍
1.1 Jmeter 有什么样功能
Apache JMeter 是一个开源、纯 Java、优秀的性能测试工具
能够测试许多不同的应用程序/服务器/协议类型:
- HTTP、HTTPS
- REST、SOAP
- JDBC
- FTP
- JMS 消息类
- 命令或 shell 脚本
- TCP 等等
主要特性:
可视化设计、功能齐全 (可视化)
快速设计测试计划、简单构建和调试程序 (简易性)
内置八大组件,功能强大 (高灵活)
完全、快速的可移植性 (跨平台)
可以进行二次开发 (高扩展)
1.2 性能测试工具如何选型
Jmter 使用场景:免费+复杂场景化
LoadRunner 使用场景:商业+复杂场景化
Jmeter、LoadRunner 任意掌握一种,以后有需要可学习其它的工具
1.3 Jmeter三种模式
1.4 Jmter 学习目标
- 初步学会用 Jmeter 做功能测试、接口测试、性能测试 (熟悉 Jmeter 界面化操作、录制脚本)
- 能够熟练使用 Jmeter 做性能测试,独立完成性能场景设计和测试任务 (熟悉常用组件、参数设计、变量设计、简单关联分析)
- 能够熟练使用 Jmeter 脚本编程,完成复杂的测试任务 (要掌握一门编程语言,比如java)
- 学会 Jmeter 的二次开发 (高高手)
2. JMETER安装
2.1 官方地址
官网链接: https://jmeter.apache.org
2.2 环境配置
- windows 下面环境变量设置(JDK1.8+)
JAVA_HOME=D:\Program Files\Java\jdk1.8(JDK安装位置)
PATH=%JAVA_HOME%\bin;(JDK的bin目录)
CLASSPATH=.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar
3. 初步了解Jmeter
3.1 了解测试计划
基本概念认识:
A:测试计划是用来描述一个性能测试的顺序与动作,它包含了若干测试组件以及若干个线程组
B:我们通常所说的所有测试元素在 Jmeter 中均属于属于某一个测试计划
C:测试计划可以添加除采样器与控制器外的所有组件
D:测试计划中可以添加自定义变量
3.2 了解线程组
基本概念认识:
A:线程组是 jmeter 压测中的一个调度框架,所有的压力测试均是通过线程组来调度
B:线程组可以添加 8 大组件为子元素
3.3 . 线程组中的执行计划
- 线程数,可以理解为并发用户数、系统并发数
- 线程启动时间,比如线程数为 3,启动时间为 6 秒,大概执行计划就是线程 1 开始(0 秒),线程 2 开始(3 秒),线程 3 开始(6 秒)
- 每一个线程执行次数,如果线程数为 3,迭代数量为 2,那么总共执行 16次
- 相同用户迭代,一般用在有 Cookie 的场景
- 延迟创建线程组
- 持续时间,如果同时设置有迭代次数,则谁先到达则谁先生效
- 启动延迟
3.4 测试计划中的并行与串行
串行与并行规则如下:
- 测试计划中的执行顺序遵循:setUp Thread Group->Thread Group->tearDown Thread Group
- 如果将线程组独立运行勾选上,则多个 Thread Group 串行执行,否则并发执行
3.5 八大组件件功能介绍
配置元件:配置元件主要用于设置一些默认值以供后续范围内的组件使用
控制器:控制器主要为 Jmeter 提供基本逻辑控制
预处理器:预处理器主要用于执行采样器的预处理逻辑,主要包括参数的设定和传递
定时器:定时器主要作用于线程延迟,用来达到业务上更真实的模拟
采样器:采样器为 Jmeter 测试的真正工作者,来用采集测试程序的数据
后置处理器:后置处理器主要用于采样器后的业务处理,比如判断、参数关联、逻辑处理等,为业务逻辑中的重要环节
断言器:断言器主要为 Jmeter 采样器提供成功与否的判断机制,通常用于检查采样器的结果是否正确
监听器:监听器主要为 Jmeter 采样器提供结果检查机制,用于查看、检查、汇总、分析采样结果
3.6 Jmeter 变量&属性
- 在 Jmeter 中,如果线程内部多个地方用到了同一个常量,那么可以用 Jmeter 的变量进行替代
使用场景:
A:可以用在 8 大组件中的大多数输入元素中使用,如${变量名}
B:可以在脚本中使用,如 vars.get(“变量名”) - 在 Jmeter 中,属性一个跨线程的变量
使用场景:
A:可以用在 8 大组件中的大多数输入元素中使用,如KaTeX parse error: Expected group after '_' at position 2: {_̲_P(属性名)},{__property(属性名)}
B:可以在脚本中使用,如 props.get(“属性名”)
3.7 Jmeter 函数
Jmeter 函数可以计算一些特殊值,它的作用域非常广泛,可以填充测试计划中所有组件的大多数输入元素,如${__functionName(……)}
Jmeter 函数参考手册,在 Tools->Function Helper Dialog
Jmeter 函数官方手册:https://jmeter.apache.org/usermanual/functions.html#functions
3.8 Jmeter 的脚本录制
3.8.1 脚本录制简介
- 能够将可视化操作转为脚本代码,我们只要稍加调整,就能成为真正的测试代码
- 简化操作,大大降低工作量和难度
脚本录制的方式有多种,可以分为 - 原生录制/代理录制
通过 jmeter 代理,直接进行录制 - loadrunner 转换
可以快速将 loadrunner 脚本转换为 jmeter 脚本 - fidller 录制方式
采用 fidller 代理方式录制脚本,然后利用 har 转 jmx - 其它方法
A:其它 har 转 jmx,有兴趣的同学可以去网上找下,但大部分没有专门社区和团队维护,目前很多不可用,不建议使用
B:badboy 也是一款性能测试工具,它能够录制脚本,但存在一个兼容性问题,有部分网站用 badboy 打不开,不建议深入学习
C:jmeter 与 selenium 自动化测试等工具结合
3.8.2 原生录制方式(http)
- 新建一个 HTTP Request Defaults 设置好协议、IP、端口号
- jmeter 当中建立 http
- 启动代理服务器,并将浏览器的设置为代理上网,代理地址为:127.0.0.1:8888,端口与上述保持一致
- 打开浏览器开始录制脚本
3.8.2 原生录制方式(https)
-
新建一个 HTTP Request Defaults 设置好协议、IP、端口号
-
jmeter 当中建立 http 代理服务器
-
启动代理服务器
-
浏览器安装证书,证书路径在$JMETER_HOME/bin/ApacheJMeterTemporaryRootCA.crt
-
jmeter导入证书
-
览器的设置为代理上网,代理地址为:127.0.0.1:8888,端口与上述保持一致
-
打开浏览器开始录制脚本
4. 配置元件介绍及实战
4.1. 配置元件功能&执行顺序
功能作用:
配置元件主要用于设置一些默认值以供后续范围内的组件使用
执行顺序:
- 配置元件优先执行
- 按深度优先算法,依次寻找采样器,找到采样器后,逐个执行,遵循第 3 条规则
- 组件执行顺序:预处理器->定时器->采样器>后置处理器->断言器->监听器
- 执行多个同类型配置元件组件时,在范围内按照广度优先策略依次执行(先外后内,反向执行)
- 配置元件无子元素
配置元件的执行是相互独立的,谁先执行谁后执行,一般意义不
4.2. CSV 配置元件加载变量
功能:通过该元件,我们可以通过 csv 初始化变量,并给后续组件使用
- 组件位置:线程组右击,Add->Config Element->CSV Data Set Config
- 默认情况下,文件只打开一次,所以大家无需担心性能问题
- 默认为线程共享模式,如若每个线程打开不一致,采用文件名采用 test${__threadNum},并将 Sharing Mode 修改为当前
文件名:不要填绝对路径,要填相对于脚本的路径,否则远程压测时可能会有问题
变量名:表示每一列对应的变量名称,针对带有头部的这里不需要填
线程共享模式->当前线程:假设为 3 个线程循环一次,则取值分别为 a1,a2,a3(All threads),a1,a1,a1(Current thread)
4.3. HTTP 请求默认简化脚本
功能:通过该元件,我们可以对后续所有 http 请求进行一些默认设置,这样大大简化了代码
- 组件位置:线程组右击,Add->Config Element->HTTP Request Defaults
- 常用的包括协议、主机名、端口、以及默认参数等等
- 针对 http 类,大家养成用 HTTP Request Defaults 设置默认值的习惯
5.4. HTTP 头部管理应用
功能:通过该元件,我们可以对后续所有 http 请求进行一些头部默认设置,这样大大简化了代码
- 组件位置:线程组右击,Add->Config Element->HTTP Header Manager
- 针对头部信息,我们通过浏览器开发模式下查看