某知名在线教育公司测试开发
霍格沃兹测试开发助教
擅长Java,docker,python
多年自动化框架的二次开发
假如某外卖日订单量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
安装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目录结构
JMeter目录结构
JMETER_HOME/bin
放的是JMeter
的主jar包、启动脚本、配置文件
ApacheJMeter.jar
:
JMETER_HOME/bin
jmeter.bat/jmeter.sh(jmeter)
:
JMeter的启动脚本,JMeter启动脚本时的JVM参数进行调整
HEAP:="-Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m"
-Xms1g -Xmx1g
不要超过物理内存的50%
通过jconsole查看jmeter内存设置是否成功
JMETER_HOME/bin
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_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
beanshell的使用
http
请求中
HTTP Request
beanshell
BeanShell PostProcessor
System.out.println(prev.queryString);
System.out.println(prev.getQueryString());
SampleResult
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
BlazeMeter
录制脚本第三方工具录制:
BlazeMeter
{chrome浏览器
}JMeter录制
抓包手写
BlazeMeter
基于Chrome浏览器的插件
在Chrome浏览器中直接生成录制脚本
BlazeMeter
BlazeMeter
默认Only Top Level Requests
改为Top Level
下的other
BlazeMeter
对录制脚本命名为demo
点击start recording
BlazeMeter
chrome浏览器打开相关网站 https://ceshiren.com/
录制成功后点击停止
BlazeMeter
save
BlazeMeter
BlazeMeter
JMeter录制请求
JMeter录制请求原理
客户端需要进行相关的设置
客户端通过代理服务器与被测服务进行通信
确定对应的压测对象,对应网站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 ).
添加 Thread Group
添加线程组
添加 Recording Conroller
添加录制控制器
监听端口的设置
根据业务设定对应录制的端口及请求
打开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 中查看结果
JMeter代理录制APP端
代理录制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 ).
添加 Thread Group
添加线程组
添加 Recording Conroller
添加录制控制器
监听端口的设置
根据业务设定对应录制的端口及请求
打开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线程组
setUp
线程是先进行执行,运行完成后才运行线程组tearDown线程组
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.put(a,b);
props
a
token
b
vars.get("token")
demo:跨线程传参.jmx