网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
The Apache JMeter™ application is open source software, a 100% pure Java application designed to load test functional behavior and measure performance. It was originally designed for testing Web Applications but has since expanded to other test functions.
大概意思就是说JMeter是一个纯java写的开源软件,用来测试可变行为和性能。起初它设计的目的是测试Web应用,但是现在已经扩展到其它的测试。
JMeter可以支持测试的应用/服务/协议有很多:Web (HTTP, HTTPS )、SOAP / REST Webservices、FTP、Database via JDBC、LDAP、Message-oriented middleware (MOM) via JMS、Mail - SMTP(S), POP3(S) and IMAP(S)、Native commands or shell scripts、TCP、Java Objects。反正就是一些服务端常用的东西都能测试就是了。
本篇介绍HTTP的压测。
一、下载
可以自行到官网找到下载链接或者使用下面的链接进行下载:
http://mirror.bit.edu.cn/apache//jmeter/binaries/apache-jmeter-5.2.1.zip
下载后直接解压,目录结构如下:
- bin:可执行脚本文件
- docs:JMeter提供的api的文档
- extras:额外的文件
- lib:JMeter本身所依赖的jar包
- licenses:JMeter依赖的jar包的license
- printable_docs:JMeter的介绍和使用手册
JMeter既提供了GUI界面方便用户使用也提供了命令行的方式让用户操作,我们先在windows下使用JMeter。
二、准备工作
2.1、运行环境
JMeter5需要至少JDK8,如果你的机器还没有安装JDK,请先安装
2.2、创建接口
这里我们使用springboot来快速构建一个接口,主要代码如下:
@GetMapping(value = "/test")
public String performanceTest(@RequestParam(value="name", defaultValue="") String name) {
log.info("进入测试,参数name的值为:{}", name);
if (StringUtils.isEmpty(name)) {
return "name cannot be null";
} else {
return RandomUtil.generateRandomString(16);
}
}
其中generateRandomString是一个生成指定长度随机字符的方法。
在application.properties中简单地指定一下log文件:
logging.file=spring.log
然后打包部署到linux下,启动命令如下:
java -jar stress-testing-0.0.1-SNAPSHOT.jar
然后用curl命令分别访问有参数和无参数的接口,也可以在浏览器访问
三、使用JMeter测试HTTP
3.1、创建测试计划
我们双击打开bin/jmeter.bat,等待JMeter的GUI程序启动,成功后如下。初次启动默认语言是英语,你可以在菜单栏的Options->Choose Language->Chinese(Simplified)切换成简体中文
右键点击TestPlan->添加->线程(用户)->线程组,完成后选择Thread Group,在这个线程组上点击右键,添加->取样器->HTTP请求;再选择HTTP请求,在这个HTTP请求上点击右键,添加->监听器->察看结果树;再次选择HTTP请求,在这个HTTP请求上点击右键,添加->监听器->聚合报告。完成后如图所示
下面来解释一下这些概念:
- TestPlan:测试计划,相当于一个工程,需要测试什么,怎么测就是定义在一个测试计划中
- Thread Group:线程组,相当于模拟的请求数。一个线程相当于一个用户请求
- 察看结果树:监听发送请求时各个请求的状态
- 聚合报告:把一次测试的数据汇总
3.2、配置参数
- 测试计划
选择左侧的Test Plan,右侧的名称就是测试计划的名字,注释就相当于代码中的注释,没什么好说的。下面有个独立运行每个线程组,在一个测试计划中可以创建多个线程组(目前我们只有一个),比如我们不同的接口的并发量是不一样的,这时可以根据需要创建多个线程组,分开测试。好了我们先默认不作修改。
- Thread Group
选择左侧的Thread Group,线程组也有名称和注释,比如我们可以填写一些并发级别之类的信息,反正就是给人看的。下面的线程属性就是核心配置了,前面也提到,一个线程相当于一个用户请求。比如线程数填10,Ramp-up时间填5,循环次数填1,就表示在5秒内发送10次请求,执行一次。
- HTTP请求
选择左侧的HTTP请求,这里我们关注Web服务器和HTTP请求这两个属性。协议就是请求的协议,默认是http,ip填服务器地址,也可以填域名,端口号是8080;因为刚才写的test接口只支持GET请求,方法选择GET,路径为url的请求路径,GET请求的参数可以直接带在路径上,也可以写到下面的参数那里,通过点击“添加”按钮来添加请求参数。
另外值得注意的是,左侧的节点很多时候是可以重复的,但是作用域不相同。比如当前察看结果树和聚合报告都是在HTTP请求下创建的,那么这个察看结果树和聚合报告监听的就是这个HTTP的结果。一个线程组下可以有多个HTTP请求,比如我们有一个H5页面要测试,打开这个页面可能会同时请求多个接口,在这种情况下就需要创建多个HTTP请求了。当察看结果树和聚合报告创建在Thread Group下,那么就是监听这个线程组下所有HTTP请求的结果。
3.3、测试
点击界面工具栏的绿色三角按钮开始压测,这时可以看到spring.log文件会不断输出信息
等待压测结束后,我们可以选择左侧的察看结果树,就可以看到本轮测试的请求情况
选择其中的请求可以在右边看到这个请求的详细信息,包括时间,请求数据长度,请求地址等等。
选择聚合报告可以看到本轮测试的数据报告
解释一下这份报告:
- 样本:请求的次数,计算公式是线程数*循环次数,如果线程组配置勾选了永远,那么就是你停止测试时实际发送的请求数
- 平均值:响应时间的平均用时,单位是毫秒。比如这里的平均响应时间是38毫秒
- 中位数:响应时间的中位数,单位是毫秒。
- 90%百分位:90%的响应时间小于该数值,单位是毫秒。这里有90%的响应时间小于22毫秒
- 95%百分位:含义和90%类似
- 99%百分位:含义和90%类似
- 最小值:本轮测试最小响应时间,单位是毫秒。
- 最大值:本轮测试最大响应时间,单位是毫秒。
- 异常%:本轮测试出现异常的请求比例。
- 吞吐量:可以理解为QPS,即是我们测试的接口处理请求的能力。比如这里是平均每秒可以处理2.2次请求
- 接收KB/Sec:响应数据的接收速率
- 发送KB/Sec:请求数据的发送速率
到此为止,你是不是觉得刚才我们写的接口很完美,服务也运行得毫无破绽?好了,我们选择界面左侧的Thread Group(线程组),然后把线程数改为5000,其它不变,模拟在5秒内有5000个用户来访问我们的接口。然后先点击界面上方的一个齿轮加两把扫帚的按钮来把结果树和聚合报告清除,然后再点击绿色的启动按钮,测试结果如下
你会发现当并发增大时,会有一部分请求出现了异常。再切换到聚合报告上,你会发现原来平均响应时间只有30多毫秒直接飙到5秒多了,异常率也出现了。这时就需要我们根据一些错误信息去做一些调优了,可能是系统级别的,也可以是jvm级别的,又或者是代码本身的问题。这不是本篇所要讲的,这里就不说了。
四、在JMeter中使用变量
在上面例子中在我们在填写HTTP配置的时候,IP直接写了IP地址,但是有一个问题,假如我们的接口在不同的机器上部署了节点,我们在对不同机器上的接口进行测试,总不能每测完一个就改一个吧,假如要测试一个服务上的30个接口,不是改到手酸了?JMeter给我们提供了变量,我们可以在HTTP请求中使用变量。
我们右键点击Thread Group,添加->配置元件->用户定义的变量,也可以在测试计划或者HTTP请求下创建,这样作用域就是整个测试计划或者HTTP请求。然后选择用户定义的变量,并在右边点击添加按钮,添加host和port两个变量:
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
(img-YkDtXPYM-1715015734025)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新