- 霍格沃兹测试开发学社
假如某外卖日订单量300W,平均一单外卖30元
中午高峰期宕机10分钟
外卖80%点单在中午和晚上 4个小时内
10 * 300w * 80% / ( 4 * 60 ) = 100w
4 * 60
总共多少分钟
300w * 80%
总共单量
一分钟单量 = 总单量 / 总分钟
10 分钟的单量
简单理解
功能测试
性能测试
接⼝响应时间
吞吐量
TPS
:Transaction Per Second
事务处理能⼒,每秒处理事务数
直接扩容解决
阿里云服务器一个服务器企业级的都要两三万
良好的容量规划能力 + 性能调优能力
给公司省钱
短时⼤并发
⻓时⼩并发
Apache AB
http
协议LoadRunner
Ngrinder
Locust
阿⾥ PTS
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
功能测试
压力测试
分布式压力测试
Apache 组织开发的开源免费压测⼯具
多平台兼容,纯JAVA开发
源程序可以从⽹上下载
各种报表数据图形展示
beanshell
JMeter
是Java
应用,需要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
JMETER_HOME/bin
放的是JMeter
的主jar包、启动脚本、配置文件
ApacheJMeter.jar
:
jmeter.bat/jmeter.sh(jmeter)
:
JMeter的启动脚本,JMeter启动脚本时的JVM参数进行调整
HEAP:="-Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m"
-Xms1g -Xmx1g
不要超过物理内存的50%
通过jconsole查看jmeter内存设置是否成功
examples
目录:
jmeter.properties
:
JMeter主要配置文件,大部分选项在该文件中配置
language=en
language=zh_CN
sampleresult.default.encoding=ISO-8859-1
sampleresult.default.encoding=UTF-8
user.properties
:
log4j2.xml
:
JMeter API
docs/api/index.html
JMeter二次开发,beanshell的使用
java请求中
Java Request
SamplerData
: Welcome ceshiren.com
beanshell
BeanShell PostProcessor
System.out.println(prev.getSamplerData());
SampleResult
http
请求中
HTTP Request
beanshell
BeanShell PostProcessor
System.out.println(prev.queryString);
System.out.println(prev.getQueryString());
SampleResult
附加目录,存放的是JMeter和其它工具集成所需要的一些文件
提供了对Ant的支持,用ant实现自动化测试 批量脚本执行,生成html报告
ant-jmeter-1.1.1.jar
JMeter启动默认的classpath路径
使用JMeter进行测试的过程中,所有依赖的(import)的类都必须以jar包的方式存放于该目录。
如果lib内对应jar包发生改变,重启JMeter才能生效
lib/ext
存放JMeter组件、第三方组件和插件
组件和插件:继承JMeter的GUI框架的对象,在GUI模式下可见
上台面的都在ext,不上台面的在lib
JMETER_HOME/printable_docs
基于Chrome浏览器的插件
在Chrome浏览器中直接生成录制脚本
默认Only Top Level Requests
改为Top Level
下的other
对录制脚本命名为demo
点击start recording
chrome浏览器打开相关网站 https://ceshiren.com/
录制成功后点击停止
save
客户端需要进行相关的设置
客户端通过代理服务器与被测服务进行通信
确定对应的压测对象,对应网站http://news.baidu.com
确定对应的压测页面:⾸⻚,国际频道,财经频道
相关的步骤确定一下:
点击页面的国际(频道)
点击页面的财经(频道)
添加 HTTP(S) 测试脚本记录器
命令行打开JMeter
新建压测脚本
添加非测试元件 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 ).
添加线程组
添加录制控制器
根据业务设定对应录制的端口及请求
打开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
添加Include
,Exclude
Include
:.*\.(jd\.com).*
Exclude
:.*\.(png|jpg|css|jsp|js|mp4|gif).*
服务器发送到客户端的文件,常见的比如js、css、图片、音频等
静态资源不占用服务器运算资源,压测不关注
静态资源放到cdn
自建 CDN
又拍云
阿里云
七牛云
Chrome
127.0.0.1
localhost

Firefox
127.0.0.1
localhost

JMeter 需要使用自己的证书才能拦截来自浏览器的 HTTPS 连接
JMeter 必须伪装成目标服务器。
对应系统没有安装jmeter证书导致
系统导入jmeter证书
检验代码的正确性
压测的话也是代码
JMeter上添加查看结果树「View Results Tree
」
检验对应请求接口是否能跑通
点击JMeter
的运行按钮
查看结果树里面检查刚刚的请求/响应是否都成功
JMeter
脚本录制之前的业务步骤梳理、明确
JMeter脚本相关组件添加
创建代理 HTTP(S) Test Script Recorder
添加 Thread Group
添加 Recorder Controller
配置相关内容
端⼝、包含URL过滤(include)、排除URL过滤 (exclude)、存放位置
录制步骤
开启JMeter代理
配置浏览器的代理
在浏览器中完成业务操作
运⾏验证
JMeter 中完成录制之后检查
运⾏单并发压测,验证是否跑通
在 View Results Tree 中查看结果
手机是iPhone
app选择哔哩哔哩,App Store上下载安装
Https对应的抓包必须有相对应的证书进行信任
JMeter的证书只能安装到用户信任的证书库里
安卓系统版本是7.0以上,不会信任用户证书库
改对应的源码
在手机上安装黑客工具
打开哔哩哔哩app
搜索: 霍格沃兹测试
切换到用户
tab,进入第一个用户
切换主页
,动态
,投稿
三个tab
添加 HTTP(S) 测试脚本记录器
命令行打开JMeter
新建压测脚本
添加非测试元件 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 ).
添加线程组
添加录制控制器
根据业务设定对应录制的端口及请求
打开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 Recorder
的Start
单击弹框中的OK
对应证书配置
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
手机端浏览器输入:
http://192.168.0.102:8080
手机打不开网页?
手机连接的Wi-Fi和电脑端是否一致
需要在一个局域网内
证书下载
通用 --> 描述文件 --> 安装信任JMeter开头的描述文件
点证书,查看页面显示到期日
设置 --> 关于本机 ,证书信任设置打开
电脑端,对应的命令行打开的服务终止
手机端网络连接 --> 配置代理,填对应服务器及端口号
只是录制**哔哩哔哩**app相关
Resquests Filtering
,
URL Include
,add
:
.*\.(bilibili\).*
去掉页面相关的静态资源
Resquests Filtering
,
URL Exclude
,add
:
.*\.(png|jpg|css|jsp|js|mp4|gif).*
检验代码的正确性
压测的话也是代码
JMeter上添加查看结果树「View Results Tree
」
检验对应请求接口是否能跑通
点击JMeter
的运行按钮
查看结果树里面检查刚刚的请求/响应是否都成功
JMeter
脚本录制之前的业务步骤梳理、明确
JMeter脚本相关组件添加
创建代理 HTTP(S) Test Script Recorder
添加 Thread Group
添加 Recorder Controller
配置相关内容
端⼝、包含URL过滤(include)、排除URL过滤 (exclude)、存放位置
录制步骤
开启JMeter代理
配置浏览器的代理
在浏览器中完成业务操作
运⾏验证
JMeter 中完成录制之后检查
运⾏单并发压测,验证是否跑通
在 View Results Tree 中查看结果
JMeter
默认的组件,不可以删除
所有组件都是位于测试计划组件之下
保存JMeter
的脚本的时候又叫做保存 测 试 计 划
全局变量的配置
配置的格式为key,value
IP
地址为:192.168.1.199
全局变量的配置
http request
组件进行引用
IP
对应的name
属性名即可:${hostname}
不同测试环境下进行相同业务的测试
JMeter
内一个测试计划下的所有线程组默认是并行运行多个线程组之间的运行为非并行运行
Run Thread Groups consecutively
「独立运行每个线程组」示例jmx:测试计划.jmx
最后一个框内是jar
包的导入
对应的最后一个框内是jar
包的导入,不建议用
拷贝到JMeter安装路径下的lib
内
JMeter
里必选组件
控制虚拟用户如何执行脚本
JMeter
的线程组件默认有三个
setUp线程组
tearDown线程组
线程组
执行顺序:
setUp线程组
--> 线程组
--> tearDown线程组
代码中的 before 和 after 的方法
setUp
线程是先进行执行,运行完成后才运行线程组tearDown
线程是最后执行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秒 = 总时间/总线程数
线程数设置为50,Ramp-Up
设置为5,那么每秒启动的线程数50/5
🤔️:10个线程,每隔5秒启动一个,该怎么设置??
线程数设置为10,Ramp-Up
设置为50
如果线程数设置为10000,Ramp-Up
设置为0/1,会发生什么?
短时间内会把线程发送完,压测机能承受住就好
压测机能不能一次性启动10000个请求?
每隔N秒启动一个线程是不是最终对服务器造成的压力是每隔N秒一次请求?
循环次数
Loop Count
;每一个线程循环执行脚本的次数
☑️永远
输入对应数字,表示请求重复指定次数,但是不支持0
遵循原则:
延迟创建线程直到需要
Delay Thread creation until needed
线程需要被执行的时候,才会被创建
不选择这个选项,在计划开始的时候,所有需要的线程就都被创建好了
调度器
勾选☑️可用
启动延迟
JMeter
点击启动按钮之后的延迟时间持续时间
一旦勾选了调度器,则要注意循环次数和持续时间对线程的影响问题
🤔: JMeter
中,线程停止的条件??
🤔: 循环次数设置为50,同时把调度器选中,并把持续时间设置为1800秒;脚本停止的条件??
🤔: JMeter
中,线程停止的条件??
循环次数
持续时间
🤔: 循环次数设置为50,同时把调度器选中,并把持续时间设置为1800秒;脚本停止的条件??
发循环50次结束
5次还没循环结束,但是持续时间到了20秒也可以进行结束
要不你就给我干8个小时的工作,要不然你就把今天的工作做完,不管你用多久
props
a
token
b
vars.get("token")
demo:跨线程传参.jmx
霍格沃兹测试开发