JMeter性能压测

  • 霍格沃兹测试开发学社

ceshiren.com

扫码领取本节课相关资料

About Me

夏微凉

  • 某知名在线教育公司测试开发

  • 霍格沃兹测试开发助教

  • 擅长Java,docker,python

  • 多年自动化框架的二次开发

为什么做性能测试?

  • 假如某外卖日订单量300W,平均一单外卖30元

  • 中午高峰期宕机10分钟

  • 外卖80%点单在中午和晚上 4个小时内

单量损失

10 * 300w * 80% / ( 4 * 60 ) = 100w
  • 4 * 60 总共多少分钟

  • 300w * 80% 总共单量

  • 一分钟单量 = 总单量 / 总分钟

    • 300w * 80% / (4 * 60)
  • 10 分钟的单量

    • 10 * 300w * 80% / (4 * 60)

金额损失

  • 100w * 30 = 3000w

性能测试是什么?

  • 简单理解

    • 对于性能指标的测试就是性能测试
  • 功能测试

    • 能不能⽤
  • 性能测试

    • 好不好⽤

什么时候开始性能测试?

  • 功能测试基本完成之后

性能测试需要关注什么?

  • 接⼝响应时间

    • 50毫秒 ~ 1000毫秒
  • 吞吐量

    • 1000万每天,2000万每天 。。。,10亿每天
  • TPSTransaction Per Second 事务处理能⼒,每秒处理事务数

    • 打开⻚⾯、登录、选择商品、加⼊购物⻋、下单、付款

性能测试解决问题?

  • 直接扩容解决

  • 阿里云服务器一个服务器企业级的都要两三万

  • 良好的容量规划能力 + 性能调优能力

  • 给公司省钱

性能测试中有哪些压力类型?

  • 短时⼤并发

    • 验证最⼤处理能⼒
  • ⻓时⼩并发

    • 验证⻓时间运⾏的稳定性

⾏业流⾏性能测试⼯具

  • Apache AB

    • ⼩快灵的⼯具
    • 只支持http协议
    • 不支持场景化东西
    • 单接口,快速查看小场景
  • LoadRunner

  • Ngrinder

  • Locust

  • 阿⾥ PTS

为什么用JMeter做压测?

JMeter支持协议

  • Web - HTTP, HTTPS (Java, NodeJS, PHP, ASP.NET, …)

  • SOAP / REST Webservices

  • FTP

  • Database via JDBC

  • LDAP 轻量目录访问协议

  • Message-oriented middleware (MOM) via JMS

  • Mail - SMTP(S), POP3(S) and IMAP(S)

  • TCP

JMeter使用场景有哪些?

使用场景

  • 功能测试

  • 压力测试

  • 分布式压力测试

JMeter做压测的有哪些优点?

优点

  • Apache 组织开发的开源免费压测⼯具

  • 多平台兼容,纯JAVA开发

  • 源程序可以从⽹上下载

  • 各种报表数据图形展示

  • beanshell

shili.png 10.png

扫码领取本节课相关资料

JMeter 安装

JMeter 基础安装和环境配置

  • 官网地址

  • 下载链接

  • 历史版本

  • 解压缩到本地文件路径下

      /Users/***/apache-jmeter-5.4.1
    
  • 配置环境变量:

      export JMETER_HOME=/Users/***/apache-jmeter-5.4.1
      export PATH=$PATH:$JMETER_HOME/bin
      
      source .zshrc
    

jmeter1.png Down arrow

  • JMeterJava应用,需要jdk环境支持

  • 建议安装JDK环境,JRE也可以,但是https需要JDK里面的 keytool

  • jdk安装 最低版本1.8 下载链接

  • 配置jdk环境变量:

      export JAVA_HOME=/***/jdk1.8.0_291.jdk/Contents/Home
      export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
      export PATH=$PATH:$JAVA_HOME/bin

扫码领取本节课相关资料

erweima.png

JMeter目录结构

JMeter目录结构

  • JMETER_HOME/bin

    • 放的是JMeter的主jar包、启动脚本、配置文件

    • ApacheJMeter.jar

      • 主jar,JMeter运行的所有脚本依赖于它

JMETER_HOME/bin

  • jmeter.bat/jmeter.sh(jmeter)

    • JMeter的启动脚本,JMeter启动脚本时的JVM参数进行调整

    • HEAP:="-Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m"

    • -Xms1g -Xmx1g 不要超过物理内存的50%

    • 通过jconsole查看jmeter内存设置是否成功

111.png

JMETER_HOME/bin

  • examples目录:

    • 官网示例,csv相关示例
  • jmeter.properties

    • JMeter主要配置文件,大部分选项在该文件中配置

    • language=en
      language=zh_CN

    • sampleresult.default.encoding=ISO-8859-1 sampleresult.default.encoding=UTF-8

  • user.properties

    • 用户配置文件
  • log4j2.xml

    • JMeter日志格式,和Java的log4j2.xml功能一致

JMETER_HOME/docs

  • JMeter API

  • docs/api/index.html

  • JMeter二次开发,beanshell的使用

beanshell的使用

  • java请求中

    • Java Request
      • SamplerData : Welcome ceshiren.com
  • beanshell

    • BeanShell PostProcessor
      • System.out.println(prev.getSamplerData());
      • SampleResult
  • 9.png

beanshell的使用

  • http请求中

  • beanshell

    • BeanShell PostProcessor

      • System.out.println(prev.queryString);

      • System.out.println(prev.getQueryString());

      • SampleResult

  • 10.png

JMETER_HOME/extras

  • 附加目录,存放的是JMeter和其它工具集成所需要的一些文件

  • 提供了对Ant的支持,用ant实现自动化测试 批量脚本执行,生成html报告

  • ant-jmeter-1.1.1.jar

JMETER_HOME/lib

  • JMeter启动默认的classpath路径

  • 使用JMeter进行测试的过程中,所有依赖的(import)的类都必须以jar包的方式存放于该目录。

  • 如果lib内对应jar包发生改变,重启JMeter才能生效

  • lib/ext

    • 存放JMeter组件、第三方组件和插件

    • 组件和插件:继承JMeter的GUI框架的对象,在GUI模式下可见

  • 上台面的都在ext,不上台面的在lib

JMeter目录结构

  • JMETER_HOME/printable_docs

    • JMeter官方帮助文档,En

扫码领取本节课相关资料

erweima.png

BlazeMeter录制脚本

JMeter生成脚本

脚本生成方式

  • 第三方工具录制:

    • BlazeMeter{chrome浏览器}
  • JMeter录制

  • 抓包手写

BlazeMeter

  • 官网帮助文档

  • 基于Chrome浏览器的插件

  • 在Chrome浏览器中直接生成录制脚本

BlazeMeter

  • 登录账号

BlazeMeter

  • 默认Only Top Level Requests

  • 改为Top Level下的other

11.png

BlazeMeter

  • 对录制脚本命名为demo

  • 点击start recording

img_111.png

BlazeMeter

img_9.png

BlazeMeter

  • 进行保存点击save

img_10.png

BlazeMeter

  • 选择自己要保存对网页

img_11.png

BlazeMeter

  • Jmeter命令行打开查看刚刚保存的jmx文件

扫码领取本节课相关资料

erweima.png

JMeter录制请求

JMeter录制请求原理

  • 客户端需要进行相关的设置

  • 客户端通过代理服务器与被测服务进行通信

daili.png

业 务 步 骤

  • 确定对应的压测对象,对应网站http://news.baidu.com

  • 确定对应的压测页面:⾸⻚,国际频道,财经频道

  • 相关的步骤确定一下:

    • 访问首页:http://news.baidu.com

    • 点击页面的国际(频道)

    • 点击页面的财经(频道)

JMeter录制步骤

  • 添加 HTTP(S) 测试脚本记录器

    • 命令行打开JMeter

    • 新建压测脚本

    • 添加非测试元件 HTTP(S) Test Script Recorder

HTTP(S) Test Script Recorder

To use the recorder, add the HTTP(S) Test Script Recorder element. Right-click on the Test Plan element to get the Add menu: (Add → Non-Test Elements → HTTP(S) Test Script Recorder ).

scriptRecorder.png

添加 Thread Group

  • 添加线程组

  • thread_group.png

添加 Recording Conroller

添加录制控制器

RecordingConroller.jpg

监听端口的设置

  • 根据业务设定对应录制的端口及请求

  • 打开HTTP(S) Test Script Recorder

  • 设置监听浏览器端口号,默认是8888,要求是本地没有被占用 6666

    • mac:netstat -an|grep "8888"

    • window:netstat -an|findstr "8888"

脚本存放路径的设置

  • 设置录制请求的路径

    • 目标控制器:该选项是用来指定最终生成的脚本的存放位置。
  • 录制出来的请求放在 线程组/Recording Conroller

    • 测试计划–线程组

    • 测试计划–线程组–Recording Conroller

录制乱码问题

  • Recording's default encoding

    • 录制的默认编码格式 utf8

    • 解决中文乱码

请求过滤

  • Exclude

    • 去掉一些静态资源
  • Include

    • 请求包含内容,只抓京东URL的内容,不抓其他网站的内容

    • Requests Filtering添加IncludeExclude

  • Include.*\.(jd\.com).*

  • Exclude.*\.(png|jpg|css|jsp|js|mp4|gif).*

静态资源

  • 服务器发送到客户端的文件,常见的比如js、css、图片、音频等

  • 静态资源不占用服务器运算资源,压测不关注

  • 静态资源放到cdn

    • 自建 CDN

    • 又拍云

    • 阿里云

    • 七牛云

  • 2.png

浏览器配置拦截

  • Chrome

  • 127.0.0.1
    localhost 

chrome.png

浏览器配置拦截

  • Firefox

  • 127.0.0.1
    localhost 

Firefox.jpg

录制踩坑

3.png

录制踩坑

4.png

录制踩坑

  • JMeter 需要使用自己的证书才能拦截来自浏览器的 HTTPS 连接

  • JMeter 必须伪装成目标服务器。

  • 对应系统没有安装jmeter证书导致

    系统导入jmeter证书

系统导入jmeter证书

5.png

信任证书

6.png

回放验证

  • 检验代码的正确性

  • 压测的话也是代码

添加结果树

  • JMeter上添加查看结果树「View Results Tree

    • 作用:查看对应请求Request和响应Response的详情

设置并发数

  • 检验对应请求接口是否能跑通

    • 一个并发,一次循环

开始验证

  • 点击JMeter的运行按钮

  • 查看结果树里面检查刚刚的请求/响应是否都成功

小结

  • JMeter 脚本录制之前的业务步骤梳理、明确

  • JMeter脚本相关组件添加

    • 创建代理 HTTP(S) Test Script Recorder

    • 添加 Thread Group

    • 添加 Recorder Controller

小结

  • 配置相关内容

    • 代理中的配置: 端⼝、包含URL过滤(include)、排除URL过滤 (exclude)、存放位置
  • 录制步骤

    • 开启JMeter代理

    • 配置浏览器的代理

    • 在浏览器中完成业务操作

  • 运⾏验证

    • JMeter 中完成录制之后检查

    • 运⾏单并发压测,验证是否跑通

    • 在 View Results Tree 中查看结果

JMeter代理录制APP端

  • 霍格沃兹测试开发学社

ceshiren.com

扫码领取本节课相关资料

erweima.png

代理录制APP端

  • 手机是iPhone

  • app选择哔哩哔哩,App Store上下载安装

为什么不用安卓?

  • Https对应的抓包必须有相对应的证书进行信任

  • JMeter的证书只能安装到用户信任的证书库里

  • 安卓系统版本是7.0以上,不会信任用户证书库

非要用安卓怎么办?

  • 改对应的源码

  • 在手机上安装黑客工具

业务步骤

  • 打开哔哩哔哩app

  • 搜索: 霍格沃兹测试

  • 切换到用户tab,进入第一个用户

  • 切换主页动态投稿三个tab

录制步骤

JMeter录制步骤

  • 添加 HTTP(S) 测试脚本记录器

    • 命令行打开JMeter

    • 新建压测脚本

    • 添加非测试元件 HTTP(S) Test Script Recorder

HTTP(S) Test Script Recorder

To use the recorder, add the HTTP(S) Test Script Recorder element. Right-click on the Test Plan element to get the Add menu: (Add → Non-Test Elements → HTTP(S) Test Script Recorder ).

scriptRecorder.png

添加 Thread Group

  • 添加线程组

  • thread_group.png

添加 Recording Conroller

添加录制控制器

RecordingConroller.jpg

监听端口的设置

  • 根据业务设定对应录制的端口及请求

  • 打开HTTP(S) Test Script Recorder

  • 设置监听浏览器端口号,默认是8888,要求是本地没有被占用 6666

    • mac:netstat -an|grep "8888"

    • window:netstat -an|findstr "8888"

脚本存放路径的设置

  • 设置录制请求的路径

    • 目标控制器:该选项是用来指定最终生成的脚本的存放位置。
  • 录制出来的请求放在 线程组/Recording Conroller

    • 测试计划–线程组

    • 测试计划–线程组–Recording Conroller

录制乱码问题

  • Recording's default encoding

    • 录制的默认编码格式 utf8

    • 解决中文乱码

开始录制

  • 打开JMeter代理
    • HTTP(S) Test Script RecorderStart

Start.png

开始录制

  •                                     单击弹框中的OK 
    
  • img_1.png

img_3.png

证书配置

  • 对应证书配置

    • iPhone配置JMeter证书

    • 7天有效期

    • 证书位置

      • JMETER_HOME/bin/ApacheJMeterTemporaryRootCA.crt

手机端证书配置

  • 电脑上安装了对应的python环境

  • cd到对应JMeter的安装路径下

  • python环境是2.*版本

    •   python -m SimpleHTTPServer 8080
      
  • python环境是3.*版本

    •   python3 -m http.server 8080
      

手机端证书配置

  • 查看本地ip,命令行输入

    ifconfig | grep inet
    
  • inet.png

手机端证书配置

  • 手机端浏览器输入:

    http://192.168.0.102:8080
    

IMG_9658.PNG

避坑

  • 手机打不开网页?

    • 手机连接的Wi-Fi和电脑端是否一致

    • 需要在一个局域网内

手机端证书配置

  • 证书下载

IMG_9659.PNG

手机端证书配置

  • 通用 --> 描述文件 --> 安装信任JMeter开头的描述文件

IMG_9662.PNG

手机端证书配置

  • 点证书,查看页面显示到期日

    • 安装证书的第7天

IMG_9667.PNG

手机端证书配置

  • 设置 --> 关于本机 ,证书信任设置打开

  • 电脑端,对应的命令行打开的服务终止

IMG_9670.PNG

手机端代理配置

  • 手机端网络连接 --> 配置代理,填对应服务器及端口号

IMG_9671.PNG

代理业务演示

请求过滤

  • 只是录制**哔哩哔哩**app相关

  • Resquests Filtering

    • URL Includeadd

      • .*\.(bilibili\).*

请求过滤

  • 去掉页面相关的静态资源

  • Resquests Filtering

    • URL Excludeadd

      • .*\.(png|jpg|css|jsp|js|mp4|gif).*

回放验证

  • 检验代码的正确性

  • 压测的话也是代码

添加结果树

  • JMeter上添加查看结果树「View Results Tree

    • 作用:查看对应请求Request和响应Response的详情

设置并发数

  • 检验对应请求接口是否能跑通

    • 一个并发,一次循环

开始验证

  • 点击JMeter的运行按钮

  • 查看结果树里面检查刚刚的请求/响应是否都成功

小结

  • JMeter 脚本录制之前的业务步骤梳理、明确

  • JMeter脚本相关组件添加

    • 创建代理 HTTP(S) Test Script Recorder

    • 添加 Thread Group

    • 添加 Recorder Controller

小结

  • 配置相关内容

    • 代理中的配置: 端⼝、包含URL过滤(include)、排除URL过滤 (exclude)、存放位置
  • 录制步骤

    • 开启JMeter代理

    • 配置浏览器的代理

    • 在浏览器中完成业务操作

  • 运⾏验证

    • JMeter 中完成录制之后检查

    • 运⾏单并发压测,验证是否跑通

    • 在 View Results Tree 中查看结果

测试计划 + 线程组

测试计划

img_4.png

测试计划

  • JMeter默认的组件,不可以删除

  • 所有组件都是位于测试计划组件之下

  • 保存JMeter的脚本的时候又叫做保存 测 试 计 划

测试计划

  • 全局变量的配置

    • 配置的格式为key,value

    • IP地址为:192.168.1.199

img_1.png

测试计划

  • 全局变量的配置

    • 相关配置如右图:

img_2.png

请求引用

  • http request组件进行引用

    • IP对应的name属性名即可:${hostname}
  • 不同测试环境下进行相同业务的测试

img_3.png

测试计划

  • JMeter内一个测试计划下的所有线程组默认是并行运行

测试计划.png

测试计划

  • 多个线程组之间的运行为非并行运行

    • 选中Run Thread Groups consecutively「独立运行每个线程组」
  • 示例jmx:测试计划.jmx

img_6.png

测试计划

  • 最后一个框内是jar包的导入

    • 对应的最后一个框内是jar包的导入,不建议用

    • 拷贝到JMeter安装路径下的lib

线程组

img_9.png

线程组

  • JMeter里必选组件

  • 控制虚拟用户如何执行脚本

  • JMeter的线程组件默认有三个

    • setUp线程组

    • tearDown线程组

    • 线程组

区 别

  • 执行顺序:

    • setUp线程组 --> 线程组 --> tearDown线程组

    • 代码中的 before 和 after 的方法

setUp线程组

  • setUp线程是先进行执行,运行完成后才运行线程组

img_7.png

tearDown线程组

  • tearDown线程是最后执行

img_8.png

线程组

线程组

  • JMeter中,场景计划通过线程组设置来实现的

  • 场景是组计划模式,不是全局模式

    • 单一场景,就是一个测试计划下有一个线程组

    • 混合场景,就是一个测试计划下有多个线程组组成

组件中各个字段的相关含义

第一部分

第一部分

  • 名称

    • 这个名称只是随意起的名字

    • 没有实质性的作用,只是该组件代号

    • 类比到代码里相当于声明的方法名

    • 起名为setUp线程组,运行的时候也不是提前运行,只是显示名称为setUp

  • 注释

    • 和代码中的注释一样

    • 自己想写什么就写什么,结果树里不会显示出来

第二部分

第二部分

  • 继续「Continue

    • 继续执行接下来的操作
  • 启动下一进程循环「Start Next Loop

    • 忽略错误,执行下一个循环

    • 执行到第5个请求报错,对应到下面到请求取样器不会进行执行,直接进行一个新一轮到测试,从第一个取样器请求开始

第二部分

  • 停止线程「Stop Thread

    • 退出该线程(不再进行此线程的任何操作)
  • 停止测试「Stop Test

    • 等待当前执行的采样器结束后,结束整个测试
  • 立即停止测试「Stop Test Now

    • 直接停止整个测试

第三部分

第三部分

  • 线程属性

    • 线程数

      • Number of Thread (users);虚拟用户数,模拟的用户数量

      • 在整个测试过程中所启动的线程的总数

      • ⚠️ 线程数不等于并发用户数,也不等于在线用户数

    • Ramp-Up period(in seconds)

      • 设置启动所有线程所花费的总时间

      • 线程启动的方式:

        • 平均每隔N秒启动一个线程
        • N秒 = 总时间/总线程数

举例

  • 线程数设置为50,Ramp-Up设置为5,那么每秒启动的线程数50/5

    • 每秒启动的线程数是10
  • 🤔️:10个线程,每隔5秒启动一个,该怎么设置??

举例

  • 线程数设置为10,Ramp-Up设置为50

  • 如果线程数设置为10000,Ramp-Up设置为0/1,会发生什么?

举例

  • 短时间内会把线程发送完,压测机能承受住就好

  • 压测机能不能一次性启动10000个请求?

    • 压测器的配置
  • 每隔N秒启动一个线程是不是最终对服务器造成的压力是每隔N秒一次请求?

举例

  • 跑到你的那个请求的对应服务器上的时候就可能会有差异了

第三部分

  • 循环次数

    • Loop Count;每一个线程循环执行脚本的次数

    • ☑️永远

      • 请求一直继续,除非停止或者崩溃
    • 输入对应数字,表示请求重复指定次数,但是不支持0

    • 遵循原则:

      • 循环次数的设置,以获取足够多、足够稳定的数据为准

第三部分

  • 延迟创建线程直到需要

    • Delay Thread creation until needed

    • 线程需要被执行的时候,才会被创建

    • 不选择这个选项,在计划开始的时候,所有需要的线程就都被创建好了

第三部分

  • 调度器

    • 勾选☑️可用

    • 启动延迟

      • JMeter点击启动按钮之后的延迟时间
    • 持续时间

      • 整个线程组从启动到结束的总时间「一节课从开始到结束1个小时」
    • 一旦勾选了调度器,则要注意循环次数和持续时间对线程的影响问题

  • 🤔: JMeter中,线程停止的条件??

  • 🤔: 循环次数设置为50,同时把调度器选中,并把持续时间设置为1800秒;脚本停止的条件??

思考

  • 🤔: JMeter中,线程停止的条件??

    • 循环次数

    • 持续时间

img_25.png

思考

  • 🤔: 循环次数设置为50,同时把调度器选中,并把持续时间设置为1800秒;脚本停止的条件??

    • 发循环50次结束

    • 5次还没循环结束,但是持续时间到了20秒也可以进行结束

  • 要不你就给我干8个小时的工作,要不然你就把今天的工作做完,不管你用多久

面试题:跨线程组传参

props.put(a,b);

  • props

    • property变量
    • vars 中的变量仅对当前线程组内可见,跨线程组则需要使用属性
    • props 继承了 Hashtable 的类,所以拥有与 vars 类似的 get 和 put 方法,另外还继承了 Hashtable 的其他方法
  • a

    • token
    • 对应的值放在token的系统环境变量名中
  • b

    • vars.get("token")
    • 去正则表达式提取器内拿token的值
  • demo:跨线程传参.jmx