本教程内容庞大,所以尽量写的精简,没有写出脚本的具体编写步骤,有兴趣的朋友可以下载Demo后和教程对照着看。
请求的服务端,是通过服务端模拟器来生成的。可以下载Mock服务端模拟器,设定与教程相同的请求地址来学习。
Demo下载地址:点击下载
Mock服务端模拟器:点击下载
计算机上已装好Jmeter的请跳过此步骤。本教程是根据Jmeter5.0编写的,其他版本可能有出入。
插件名 | - |
---|---|
Custom Thread Groups | - 个人觉得最好用的性能测试线程组 |
3 Basic Graphs | - 活动线程数变化曲线 |
- | - 响应时间变化曲线 |
- | - 每秒事务处理率(TPS) |
Composite Timeline Graph | - 把多个图形监听器组合起来 |
PerfMon (Servers Performance Monitoring) | - 远程监听服务器资源使用率 |
Command-Line Graph Plotting Tool | - 可以手动把jtl或csv文件转化成图片(主要用于PerfMon结果生成图形) |
*以上插件都是按需勾选,譬如你的服务器是放在阿里云上的,自带了资源监控,就不需要PerfMon插件了。
@echo off
rem 生成当前日期
set date=%date:~0,4%%date:~5,2%%date:~8,2%
if "%time:~0,2%" lss "10" (set hour=0%time:~1,1%) else (set hour=%time:~0,2%)
set time=%hour%%time:~3,2%%time:~6,2%
set d=%date%%time%
echo 当前日期: %d%
rem 配置地址
set jmxPath="E:\Desktop\博文\Demo"
set jmeterPath="F:\apache-jmeter-5.0"
rem 创建日期文件夹
mkdir %jmxPath%\%d%
if not exist %jmxPath%\%d%\PerfMon mkdir %jmxPath%\%d%\PerfMon >nul
rem 执行Jmeter
call jmeter -JjmxPath="%jmxPath%\%d%" -n -t %jmxPath%\Demo.jmx -l %jmxPath%\%d%\Result.jtl -e -o %jmxPath%\%d%\Report
rem 生成监听器截图(需要修改版本号)
call java -jar %jmeterPath%\lib\cmdrunner-2.2.jar --tool Reporter --generate-png %jmxPath%\%d%\CPUMemory.png --input-jtl %jmxPath%\%d%\PerfMon\CPUMemory.jtl --plugin-type PerfMon
call java -jar %jmeterPath%\lib\cmdrunner-2.2.jar --tool Reporter --generate-png %jmxPath%\%d%\IO.png --input-jtl %jmxPath%\%d%\PerfMon\IO.jtl --plugin-type PerfMon
:: 日志存档
move %jmxPath%\jmeter.log %jmxPath%\%d% >nul
if not exist %jmxPath%\Release mkdir %jmxPath%\Release >nul
xcopy /Y %jmxPath%\%d% %jmxPath%\Release /s /f /h >nul
:: pause
@echo off
rem 生成当前日期
set date=%date:~0,4%%date:~5,2%%date:~8,2%
if "%time:~0,2%" lss "10" (set hour=0%time:~1,1%) else (set hour=%time:~0,2%)
set time=%hour%%time:~3,2%%time:~6,2%
set d=%date%%time%
echo 当前日期: %d%
rem 创建日期文件夹
mkdir %d%
rem 执行Jmeter
call jmeter -n -t Demo.jmx -l %d%\Result.jtl -e -o %d%\Report
:: 日志存档
move jmeter.log %d% >nul
if not exist Release mkdir Release >nul
xcopy /Y %d% Release /s /f /h >nul
:: pause
@echo off
rem 生成当前日期
set date=%date:~0,4%%date:~5,2%%date:~8,2%
if "%time:~0,2%" lss "10" (set hour=0%time:~1,1%) else (set hour=%time:~0,2%)
set time=%hour%%time:~3,2%%time:~6,2%
set d=%date%%time%
echo 当前日期: %d%
rem 配置地址
set reportPath="E:\Desktop\API_TEST_RESULT"
rem 创建日期文件夹
mkdir %reportPath%\%d%
rem 执行Jmeter
call jmeter -n -t Demo.jmx -l %reportPath%\%d%\Result.jtl -e -o %reportPath%\%d%\Report
:: 日志存档
move jmeter.log %reportPath%\%d% >nul
if not exist %reportPath%\Release mkdir %reportPath%\Release >nul
xcopy /Y %reportPath%\%d% %reportPath%\Release /s /f /h >nul
:: 清除多余历史测试报告
for /f "skip=8 delims=" %%a in ('dir /b /ad /o-d "%reportPath%"\*') do @rd /s /q "%reportPath%"\"%%a" && echo del %%a
:: pause
以刚才的测试报告为例,由于测试时间比较短,尾部释放线程阶段不参考。但仍然可以看出一些趋势。
如果忽略脚本释放线程的部分,可以得出初步结论,系统最多能支持每秒处理22个事务,即TPS=22,此时对应的用户数在每秒250~300人。更多用户的情况下,系统还不至于崩溃,但响应时间会很慢。
所以,这就是真实结果了吗?不是,我们再来看一下CPU情况。
什么原因呢?有可能有以下几种情况:
性能测试易学难精,跑完脚本给开发看固然简单,但自己分析的话需要的知识面非常广,但是响应时间就包含了七八层。我推测本次测试应该是第1种情况,因为NET I/O并不高。还需要加大线程数、延长测试时间继续测试来观察一下,甚至需要用到分布式方法进行测试。第四种情况是之前测试一个WebSocket接口时发现,服务端对单个终端发出的请求会限制TPS。当时我的解决办法是写了一个并发启动脚本,让一台机器跑20个jmeter脚本,8台机器模拟160个终端,最终才测出服务器的TPS在1400多,否则无论怎么测都是20TPS。
Jmeter在规范了插件管理之后,把活动线程数、响应时间、TPS打包成一个3 Basic Graphs。就是因为日常测试中基本就是靠这3个监听器完成初步分析。而为什么监听服务器资源也很重要呢?Jmeter在规范了插件管理之后,把活动线程数、响应时间、TPS打包成一个3 Basic Graphs。就是因为日常测试中基本就是靠这3个监听器完成初步分析。而为什么监听服务器资源也很重要呢?
因为:
1.我们要验证测试结果是否准确。
2.真的对服务器造成压力了,我们要找到CPU满载的那个时间点。再结合以上3个监听器一起分析。