JMeter安装及性能测试详解
JMeter介绍
(参考:http://www.importnew.com/13876.html)
JMeter使用了不同技术和协议,是一款可以进行配置和执行负载测试、性能测试和压力测试的工具。负载测试、性能测试和压力测试概念:
负载测试: 这类测试使系统或者应用程序在预先设计好的极端场景下测试运行。这类测试用来评估系统或者程序在极端条件下的行为。
性能测试: 这种测试被用来检测系统的性能表现,包括特定情况下,系统的响应能力和稳定性。
压力测试: 这类测试通过载入更多的外部资源,并使系统组件超越其所设定的能力范围,试图使系统挂掉
优点:
- 开源免费,基于Java编写,可集成到其他系统可拓展各个功能插件
- 支持接口测试,压力测试(分布式测试)等多种测试类型,支持录制回放,入门简单
- 相较于自己编写框架或其他开源工具,有较为完善的UI界面,便于接口调试
- 多平台支持,可在Linux,Windows,Mac上运行
- 提供多种报表数据图形展示
JMeter的目录文件介绍
- bin: 核心可执行文件,包含配置
- jmeter.bat: windows启动文件
- jmeter-server.bat:windows下启动负载生成器(肉鸡)服务文件
- jmeter: mac或者Liunx启动文件
- jmeter-server:mac或者Liunx下启动负载生成器服务文件
- jmeter.properties: 核心配置文件
- 设置默认语言:language=zh_CN
- 配置远程肉鸡IP和端口(服务器):remote_hosts=123.123.123.132:1099,234.234.234.234:1099
- 肉鸡上配置:server_port=1099
- 输出报告的配置,480行左右
- extras:插件拓展的包
- Lib:核心的依赖包
- Ext:核心包,协议包
- Junit:单元测试包
JMeter下载及环境配置
准备工作
安装JMeter前需要安装配置好Java,参考之前文章Java系统环境变量配置
- 1、下载地址:http://jmeter.apache.org/download_jmeter.cgi,或 https://archive.apache.org/dist/jmeter/source/(Windows版本下载.zip,Linux版本下载.tgz)
- 2、下载后无需安装,解压后即可使用。
下载后无需安装解压即可使用。
如果有idea工具或eclipse,可以双击ApacheJMeter.jar
关联启动,也可以点击jemeter.bat
进行启动
启动如下图所示:
JMeter组件
组件介绍
- 测试计划(Test Plan): 使用 JMeter 进行测试的起点,它是其它 JMeter 测试元件的容器
- 线程组(Thread Group):代表一定数量的并发用户,它可以用来模拟并发用户发送请求
- 采样器(sampler):定义实际的请求内容,被线程组包含,我们主要用HTTP请求
- 监听器(Listener) :包含查看结果树及聚合报告等图形化显示结果
- 逻辑控制器(Logic Controller):逻辑判断功能,如if、for等语句控制
- 断言(Assertions) :包含响应断言断言、xml断言等
- 配置元件(Config Element):主要包括参数化配置、JDBC配置等
- 前置处理器(Pre Processors)和后置处理器(Post Processors)
- 定时器(Timer):用于操作之间设置等待时间
测试计划
打开JMeter即显示测试计划,测试计划用来描述一个测试(性能测试或者接口测试),包含与本次性能测试所有相关的功能,即该性能测试的所有内容是于基于一个计划的。
- 用户定义的变量
一般添加一些系统常用的配置;如果测试过程中需要切换环境、配置,一般不建议在测试计划上添加变量,因为不方便启用和禁用,一般是直接添加用户自定义变量组件 - 独立运行每个线程组
用于控制测试计划中的多个线程组的执行顺序,如果勾选了,可以保证按照顺序依次执行;不然则会交替执行 - Run tearDown Thread Groups after shutdown of main threads
开启之后,当线程组遇到错误停止时,会执行tearDown线程组;不然不会执行 - 函数测试模式(Functional Testing)
如果选中了此选项,监听组件如“查看结果树”配置了保存到一个文件中,那么jmeter会将每次的请求结果保存到文件中。一般不建议勾选
线程组
常见概念:
进程: 正在运行的程序 = 程序启动,进程创建,程序退出,进程释放
线程: 进程中的执行线索 = 游戏中,能动的角色 或者 迅雷每一部电影下载,底层都对应一个线程实现
线程组: 对线程按照性质归类分组 = 比如: 植物大战僵尸,划分三组能量组、攻击组、破坏组
层级关系: 进程 > 线程组 > 线程 (一个进程包含多个线程组,一个线程组包含多个线程)
并发执行: 程序中的多个线程同时执行 = 多部电影下载 = 线程结束顺序与启动顺序不一定一致
顺序执行: 程序中的多个线程按照先后顺序依次执行 = 电影先下载完毕,然后再播放 = 线程结束顺序与启动顺序一致
线程组设置:
线程组相当于有多个用户,同时去执行相同的一批次任务。每个线程之间都是隔离的,互不影响的。一个线程的执行过程中,操作的变量,不会影响其他线程的变量值。
测试计划右键添加->threads->线程组(控制总体并发)
-
线程数
虚拟用户数,一个虚拟用户占用一个线程
-
准备时长
全部线程启动的时长,比如100个线程,20秒,则表示20秒内100个线程都要启动完成,每秒启动5个线程
-
循环次数
每个线程发送的次数,假如值为5,100个线程,则会发送500次请求,可以勾选永远循环
采样器
- 采样器定义实际的请求内容,被线程组包含,我们主要讲HTTP请求及JDBC Request
- 线程组->添加-> Sampler(采样器) -> Http
采样器参数配置:
- 名称:采样器名称
- 注释:对这个采样器的描述
- web服务器:默认协议是http、默认端口是80
- 服务器名称或IP :请求的目标服务器名称或IP地址
- 路径:服务器资源的路径
监听器
监听器包含查看结果树及聚合报告等图形化显示结果,我们主要讲查看结果树及聚合报告
线程组->添加->监听器(Listener)-> 查看结果树
断言
断言用于检查测试中得到的响应(response)数据等是否符合预期,断言用以保证接口(性能)测试过程中的数据交互是否与预期一致
a、响应断言
线程组 -> 添加 -> 断言 -> 响应断言
-
apply to(应用范围):
Main sample only: 仅当前父取样器 进行断言
-
要测试的响应字段
响应文本:即响应的数据,比如字符串、json等文本
响应代码:http的响应状态码,比如200,302,404这些
响应信息:http响应代码对应的响应信息,例如:OK, Found
Response Header: 响应头
-
模式匹配规则:
- 包括:包含在里面就成功,支持正则匹配
- 匹配:响应内容完全匹配,支持正则匹配
- equals:完全匹配,不支持正则匹配
- substring:包括子串就成功,不支持正则匹配
b、Json断言
线程组 -> 添加 -> 断言 -> json断言
1 {"avatar_large": "https://cdn.v2ex.com/navatar/6cdd/60ea/184_large.png?m=1587133817", "name": "apple"}
Assert json path exists:$.name
1 [{"avatar_large": "https://cdn.v2ex.com/navatar/6cdd/60ea/184_large.png?m=1587133817", "name": "apple"},
2 {"avatar_large": "https://cdn.v2ex.com/navatar/6cdd/60ea/184_large.png?m=1587133817", "name": "python"}]
Assert json path exists:$.avatar_large[0].name
{"avatar_large": [{"url":https://cdn.v2ex.com/navatar/6cdd/60ea/184_large.png?m=1587133817", "name": "apple"},{"url": "https://cdn.v2ex.com/navatar/6cdd/60ea/184_large.png?m=1587133817", "name": "python"}]}
Assert json path exists:$.avatar_large[0].name
- additonally assert value:勾选后可以在下方文本框中添加断言之
- match as regular expression:勾选后,文本框支持正则表达式
参数化:
Jmeter提供的参数化方式:
测试计划用户定义变量参数化
用户自定义变量参数化
用户变量
CSV文件数据参数化(文本文件)
函数助手
函数助手
通过函数助手生成,csv文件数据调用参数,直接使用即可,只能是多个线程执行才能循环拿数据,
并且是线程组共享数据。
JMeter性能测试
1. JMeter 为性能测试提供了一下特色:
JMeter 可以对测试静态资源(例如 js、html 等)以及动态资源(例如 php、jsp、ajax 等等)进行性能测试
JMeter 可以挖掘出系统最大能处理的并发用户数
JMeter 提供了一系列各种形式的性能分析报告
2.使用 JMeter 一般用于以下两种类型的性能测试**
负载测试:通过测试系统在资源超负荷情况下的表现,以发现设计上的错误或验证系统的负载能力。
压力测试:测试系统能承受的最大负载能力。目的在于发挖掘出目标服务系统可以处理的最大负载
3.基本过程
下面我们看下使用 jmeter 进行性能测试的基本过程
3.1新增线程组
创建测试线程组,并设置线程数量及线程初始化启动方式。
3.2新增 JMeter 元组
创建各种默认元组及测试元组,填入目标测试静态资源请求和动态资源请求参数及数据。
3.3新增监听器
创建各种形式的结果搜集元组,以便在运行过程及运行结束后搜集监控指标数据。
3.4运行&查看结果
调试运行,分析指标数据,挖掘性能瓶颈、评估系统性能状态;
4.实验测试
下面我们以打开百度演示上述过程。
新增线程组
在 JMeter 的 bin 目录下双击 jmeter.bat或ApacheJMeter.jar 启动 JMeter,如下图:
在左边操作栏中选择“测试计划”,右击新增一个线程组,如图所示:
初始化线程组相关信息
新增 JMeter 元组
添加默认配置元素,添加如下默认配置,如图
各默认组件配置如图所示。HTTP Cache Manager
Http请求默认值
添加HTTP取样器
在线程组上右击新增HTTP请求,如图:
Http请求设置如图:
新增监听器
在这里我们添加如下监听器,如图所示
运行&查看结果
如果启动运行 jmeter,可以单击添加的监听器查看运行过程中的监控指标数据,也可以等运行结束后,再查看。
结果说明
下面我们就监听器所采集的结果图进行简要的说明:图形结果
查看结果树:
用表格查看结果:
聚合报告查看如下图所示:
Reference
https://blog.csdn.net/yang_yang_heng/article/details/109321530