Jmeter 入门 从0-1 基础篇
笔记有的图片链接可能失效了,等我修改好了在来编辑哈
Apache JMeter 是 Apache 组织基于 Java 开发的压力测试工具,用于对软件做压力测试。
JMeter 最初被设计用于 Web 应用测试,但后来扩展到了其他测试领域,可用于测试静态和动态资源,如静态文件、Java 小服务程序、CGI 脚本、Java 对象、数据库和 FTP 服务器等等。JMeter 可对服务器、网络或对象模拟巨大的负载,在不同压力类别下测试它们的强度和分析整体性能。另外,JMeter 能够对应用程序做功能/回归测试,通过创建带有断言的脚本来验证程序是否返回了期望结果。为了最大限度的灵活性,JMeter 允许使用正则表达式创建断言。
还可以做接口测试哈哈哈
(1)JDK安装
下载jdk:
运行jdk
配置jdk的环境变量
验证jdk是否安装成功。java -version
(2)jmeter安装
下载jmeter
官网下载地址
jmeter版本必须与jdk版本匹配
需要下载binaries的包
安装jmeter:解压缩
配置环境变量
验证jmeter是否安装成功
启动方式有:jmeter.bat/ 双击Apachejmeter.jar/ java.jar Apachejmeter.jar
JMeter文件目录
**bin目录:**用于存放可执行程序、日志文件、配置文件
**docs目录:**存放API文档,主要提供第三方插件开发
**printable_docs:**目录存放用户使用手册
**lib目录:**存放jmeter所支持的jar包,第三方的插件一般放到lib\ext目录下
1. bin目录
存放可执行文件和配置文件
jmeter.bat: windows的启动文件
jmeter.log: 日志文件
jmeter.sh: linux的启动文件
jmeter.server.bat: windows 分布式测试要用到的服务器配置
jmeter.server: linux 分布式测试要用的服务器配置
2. docs目录
docs:是Jmeter的api文档,可打开api-index.html页面来查看
3. printable_docs 目录
printable_docs的usermanual子目录下的内容是JMeter的用户手册文档
usermanual 下 component_reference.html是最常用到的核心元件帮助文档
提示:printable_docs的demos子目录下有一些常用的Jmeter脚本案例,可以作为参考
汉化:
. 临时修改:菜单栏选择–>options-language-choose language-Chinese
. 永久修改: 打开bin目录下-jmeter.propertles,修改language=zh CN,重启jmeter
. 主题修改:选项-主题–选择对应的主题.并重启
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hcONnrdk-1660616309244)(image/clip_image002.jpg)]
(1.1.3 汉化)
操作步骤
1.启动jmeter
2.在"测试计划"下添加"线程组"
3.在"线程组"下添加"HTTP请求"取样器
4.填写"HTTP请求"的相关请求数据
5.在"线程组"下添加"查看结果树"监听器
6.点击"启动"按钮运行,并查看结果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ajk9AFSJ-1660616309248)(image/clip_image004.jpg)]
元件:多个类似功能组件的容器统称
组件:实现独立某个功能的统称(类似函数)
取样器:不同协议实现的组件
*基本元件:*
线程组:模拟用户的
配置元件:进行测试环境和测试数据的初始化。类似自定化脚本中的setup
前置处理器:对要发送的请求进行预处理。类似自动化脚本中的参数化
取样器:往服务器发送请求。类似于自动化脚本中的发送请求代码
后置处理器:对收到的服务器的响应进行数据提取。类似自动化脚本中获取响应中特定字段的语句
断言:将收到的响应结果与预期结果做对比。类似自动化脚本中的断言
监听器:查看测试脚本运行的结果和日志,类似自动化脚本中的测试报告
定时器:等待一定时间。类似自动化脚本中的sleep
测试片段:封装基本功能,不单独执行,需要通过脚本调用才能执行。类似自动化脚本中封装的函数。
在JMeter中,元件的作用域是靠测试计划树形结构中元件的父子关系来确定的
提示:核心是“取样器”,其他组件都是以取样器为核心运行的,组件添加的位置不同,生效的取样器也不同。
作用域的原则
1.取样器:元件不和其他元件相互作用,因此不存在作用域的问题;
2.逻辑控制器:元件只对其子节点中的取样器和逻辑控制器作用;
3.其他六大元件:除取样器和逻辑控制器外,如果是某个取样器的子节点,则该元件对其父子节点起作用;
4.如果其父节点不是取样器,则其作用域是该元件父节点下的其他所有后代节点(包括子节点,子节点的子节点等)
提示:以上元件中还没开始学习,暂时理解jmeter这种树形结构影响作用域即可。
(2.2.2 元件的作用域)
作用域的原来:
核心:根据测试计划中的树形结构的父子节点来确定的
原则:
.取样器是没有作用域的
.逻辑控制器:只针对其子节点下的所有元件有小
.其他元件
如果其父节点是取样器,只针对父节点(取样器)有效
如果父节点是非取样器,针对父节点下的所有子节点及子节点有效
1.配置元件(config elements)
2.前置处理器程序(Per-processors)
3.定时器(timers)
4.取样器(Sampler)
5.后置处理程序(Post-processors)
6.断言(Assertions)
7.监听器(listenres)
注意:
.配置元件、前置处理器、后置处理器都需要依赖取样器才能运行
.在同一个作用域下,相同类型元件的执行顺序是从上到下按顺序执行
提示:
.前置处理器、后置处理器、断言等元件功能对取样器器作用(如果在它们的作用域内没有任何取样器,则不会执行)
.如果在同一作用域范围内有多个同一类型的元件,则这些元件按照它们在测试计划中的上下顺序依次执行
(1.2.3 元件的执行顺序)
线程组是控制JMeter将用于执行测试的线程组数,也可以把一个线程理解为一个测试用户
(作用:通过配置线程组中的线程数来模拟用户。线程数就是用户数,线程组就是用户组)
位置:右键点击测试计划–>添加-线程(用户)–线程组
. 模拟多用户:设定线程数(模拟多人操作)
. 取样器(请求)和逻辑控制器必须依赖线程组才能使用
. 一个测试计划下可以添加拖个线程组,他们可以并行或者串行执行
并行:默认情况下线程组为并行执行
串行:在测试计划下勾选“独立运行每个线程组”
(1.3.1.1 并行) (1.3.1.2 串行)
清除全部执行结果操作[ 快捷键:ctrl+E ]
. setup****线程组:用于测试前的预处理操作,在所有的线程组最先执行
. 普通线程组:用于执行业务测试脚本
. teardown****线程组:用于测试后的后置处理(恢复环境,数据)的操作,在所有的线程组最后执行
线程数:模拟虚拟用户数
Ramp-up****时间:虚拟用户启动所需要的时间
循环次数:
.配置指定次数:控制脚本循环执行的次数
.配置循环永远
。需要和调度器配置使用
。运行时间:脚本执行的时间
。延时启动时间:脚本等待特定的时间才能开始运行
线程数m和循环次数n的关系:
. 如果同时配置,实际发送的HTTP请求数应该为m*n
. 虽然发送请求的次数相同,但不能相互替换
线程组:代表并发用户数,体现服务器的负载量
循环次数:代表执行时间
(线程组名不同1-1——1-10)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MWIuYN1t-1660616309253)(image/clip_image020.jpg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hHh1ZReP-1660616309254)(image/clip_image022.jpg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dDpgT44g-1660616309255)(image/clip_image024.jpg)]
循环次数 (线程组名相同1-1)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TcVrow79-1660616309256)(image/clip_image026.jpg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1hK7eaaW-1660616309257)(image/clip_image028.jpg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Syqgnmnv-1660616309258)(image/clip_image030.jpg)]
循环次数永远-调度器配置
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sYMlhyPk-1660616309259)(image/clip_image032.jpg)]
**http****协议:**可以填写为HTTP或者HTTPS,默认不填写为HTTP协议
http****主机名/ip:
**端口:**可以填写为任何值,默认不填写时为80端口
**请求方法:**HTTP协议所支持的所有方法
**路径:**目录+参数
**编码格式:**默认IOS国际标准,推荐使用utf-8
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m8h3a8Vt-1660616309260)(image/clip_image034.jpg)]
取样器结果:统计请求相关的信息
请求:HTTP请求的请求头和请求体的详细信息
响应: HTTP响应的响应头和响应体的详细信息
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iWVaQP3s-1660616309261)(image/clip_image036.jpg)]
应用场景:全局参数
添加方式: 测试计划->线程组->配置元件->用户定义的变量
场景样例:
请求:https://www.baidu.com:443
要求:使用用户定义的变量配置被系统的协议、域名和端口
操作步骤:
1.添加线程组
2.添加用户定义的变量
3.添加HTTP请求
4.添加查看结果树
总结
配置:参数名+参数值
使用:在HTTP请求的取样器中引用定义的变量。 ${参数名}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XtSSxSov-1660616309262)(image/clip_image038.jpg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tzzIytmT-1660616309263)(image/clip_image040.jpg)]
用户定义的变量2
或者在直接在 测试计划 中配置用户定义的变量
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7W4AIYZw-1660616309264)(image/clip_image042.jpg)]
应用场景:可以针对不同的用户获取不同的参数值(不能针对同一个用户循环取不同的值)
添加方式:测试计划->线程组->前置处理器->用户参数
场景样例:
请求:https://www.baidu.com
要求:第一次请求附带参数: name=“张三”&age=28;
第二次请求附带参数: name=“李四”&age=30
操作步骤:
1.添加线程组
2.添加用户参数
3.添加HTTP请求
4.添加查看结果树
总结
参数:添加变量
参数值:添加用户-针对每个用户配置不同的参数值
使用:在HTTP请求的取样器中引用定义的变量。${参数名}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hAtlywu1-1660616309265)(image/clip_image044.jpg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Pb7gZ5aM-1660616309266)(image/clip_image046.jpg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-o3LyvBYE-1660616309267)(image/clip_image048.jpg)]
应用场景:针对每个用户每次循环取不同的值
添加方式:测试计划->线程组->配置元件->CSV数据文件设置
场景样例:
请求:https://www.baidu.com
要求:循环3次,每次请求时附带参数username,password,code的值不相同
操作步骤:
1.定义CSV数据文件
2.添加线程组
3.添加csv数据文件设置
4.添加HTTP请求
5.添加查看结果树
编写CSV数据文件(.csv后缀) data.csv
多个参数写为多列,其中用英文逗号分隔
多组参数值,则使用多行来设置
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FuiEA5dP-1660616309268)(image/clip_image049.png)]
配置:
. 文件名:填写CSV文件的路径。建议使用相对路径
. 文件编码:UTF-8
. 变量名称:从CSV数据文件中读取的数据需要保存的变量名,有多个变量时用逗号分隔
. 是否忽略首行: 是否从CSV数据文件第一行开始读取
. 分隔符: 要求与CSV数据文件中多列的分隔符一致
. 遇到文件结束符是否在次循环:默认TRUE
. 遇到文件结束符是否停止线程:当前一个参数为FALSE,改参数有效,一般设置为TRUE
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QbFjKBt1-1660616309268)(image/clip_image051.jpg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oPOiGGAL-1660616309269)(image/clip_image053.jpg)]
同一个用户循环3次
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-o1P7nZtS-1660616309270)(image/clip_image055.jpg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0xQy2Jnh-1660616309271)(image/clip_image057.jpg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vInoMFvP-1660616309272)(image/clip_image059.jpg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wo7iJysR-1660616309273)(image/clip_image061.jpg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4emytVd9-1660616309273)(image/clip_image063.jpg)]
应用场景:当需要参数化的数据只有唯一性要求,但对具体的参数无明确要求时,建议使用函数方式 (不需要提前准备数据,jmeter自动添加计数的方式来完成参数化)
计数函数,一般做执行次数统计使用;
位置:工具条 函数助手 工具按钮
(JMeter5.3 及以后的版本jmeter函数助手生成的字符在置灰无法复制,其实新版的的jmeter点“生成”按钮时 jmeter已经自动复制了,ctrl+v直接粘贴到需要的位置即可)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bKg7mlOA-1660616309274)(image/clip_image065.jpg)]
counter:
.TRUE:每个用户使用独立的计数器
.FALSE: 所有用户使用全局的计数器
引用:在取样器中使用${__counter(TRUE,)}来引用对应的值
作用:让脚本自动化执行的过程中,能够自动的判断执行结果是否正确,需要添加断言
.响应断言
.JSON断言
.持续时间断言(Duration Assertion)
添加方式:测试计划->线程组->HTTP请求->(右键添加)断言->响应断言
场景样例:
请求:https://www.baidu.com
检查:让程序检查响应数据中是否包含"百度一下,你就知道"
操作步骤:
1.添加线程组
2.添加HTTP请求
3.添加响应断言
4.添加断言结果
5.添加查看结果树
配置:
.测试字段:需要检查的字段
.模式匹配规则:需要使用什么规则来进行检查
。且、或者、非
.测试模式:需要校验的值
。填写多个值
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-e0yxigyo-1660616309275)(image/clip_image067.jpg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HxZJK376-1660616309275)(image/clip_image069.jpg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kyFLImI6-1660616309276)(image/clip_image071.jpg)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gGMOdly7-1660616309277)(image/clip_image073.jpg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UNz8p7WI-1660616309278)(image/clip_image075.jpg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JP7COokp-1660616309279)(image/clip_image077.jpg)]
适用于返回的HTTP响应为JSON格式
添加:线程组–HTTP请求–断言–JSON断言
场景样例:
请求:http://www.weather.com.cn/data/sk/101010100.html
检查:让程序检查响应的JSON数据中,city对应的内容是否为“北京”
操作步骤
1.添加线程组
2.添加HTTP请求
3.添加JSON断言
4.添加断言结果
5.添加查看结果树
配置:
.JSON PATH: $weatherinfo.city
.勾选“Additonal assert value”
.在expected value 里填写期望值
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6tDOHIEE-1660616309280)(image/clip_image079.jpg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ciCywE0c-1660616309280)(image/clip_image081.jpg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O2Kz1Hss-1660616309281)(image/clip_image083.jpg)]
当期望值没有时
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-unKJw7pI-1660616309282)(image/clip_image085.jpg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R9bSsZxf-1660616309283)(image/clip_image087.jpg)]
适用于性能测试时候,检查HTTP请求的响应时间是否超过预期值
添加:线程组–HTTP请求–断言–断言持续时间
场景样例:
请求:https://www.jd.com
检查:让程序检查响应时间是否大于500毫秒
操作步骤
1.添加线程组
2.添加HTTP请求
3.添加断言持续时间
4.添加断言结果
5.添加查看结果树
配置:预期时间
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6C8w6XqF-1660616309284)(image/clip_image089.jpg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q6ZnYTbV-1660616309284)(image/clip_image091.jpg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QNcOhzZz-1660616309285)(image/clip_image093.jpg)]
重复访问时间会少
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ktyoTJpy-1660616309286)(image/clip_image095.jpg)]
当设置响应时间20毫秒
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cPKpqMl0-1660616309287)(image/clip_image096.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iXguNjxI-1660616309288)(image/clip_image098.jpg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ePUOtMgg-1660616309288)(image/clip_image100.jpg)]
如果响应数据中中文显示乱码可以修改 \bin jmeter.properties配置文件
#sampleresult.default.encoding=ISO-8859-1
改为
sampleresult.default.encoding=UTF-8 重启jmeter
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aFXoWUW8-1660616309289)(image/clip_image102.jpg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d2aDdBLz-1660616309290)(image/clip_image104.jpg)]