Apache JMeter是一个纯Java开发的用于负载测试或者性能测试的开源软件。JMeter起初就是被设计用来进行Web应用的压力测试,这篇文章通过使用Docker拉起一个Nginx容器,然后对其进行压测这样一个即为简单的例子来介绍一下使用JMeter进行压力测试的流程和方法。
关于Apache JMeter的概要介绍与安装的方法,可参看如下内容:
在本地机器的8088端口使用Docker启动一个Nginx应用(使用其他方式也可),示例如下所示:
liumiaocn:~ liumiao$ docker images |grep nginx |grep latest
nginx latest e445ab08b2be 2 months ago 126MB
liumiaocn:~ liumiao$ docker run -p 8088:80 -d --name=nginx-test nginx:latest
a80fb1a4fc20627891a6bd7394fd79ae9aefb7dc8cf72c12967bc2673a815308
liumiaocn:~ liumiao$
使用curl命令或者直接使用浏览器确认nginx已正常运行
liumiaocn:~ liumiao$ curl http://localhost:8088/
Welcome to nginx!
Welcome to nginx!
If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.
For online documentation and support please refer to
nginx.org.
Commercial support is available at
nginx.com.
Thank you for using nginx.
liumiaocn:~ liumiao$
使用如下步骤准备测试验证的前提准备:
步骤1: 在测试计划下添加一个线程组,选择菜单信息如下图所示:
步骤2: 在刚刚创建的线程组上添加一个HTTP请求的取样器,选择菜单信息如下图所示:
步骤4: 保存测试计划
点击保存测试计划按钮将结果保存为/tmp/nginx-test.jmx
步骤5: 在聚合报告页面设定jtl文件
在聚合报告页面设定写入和jtl文件路径为:/tmp/nginx-test.jtl
进行一次HTTP GET的成功测试,通过JMeter的HTTP取样器执行一次GET http://localhost:8088/
HTTP请求设定如下信息,建立与nginx服务之间的关联,在本例中设定内容如下所示
设定项 | 设定内容 |
---|---|
协议 | http |
服务器名称或者ip | localhost |
端口号 | 8088 |
HTT请求/方法 | GET |
HTTP请求/路径 | / |
保持线程组信息为缺省设定即可,设定内容如下所示:
设定项 | 设定值 |
---|---|
线程数 | 1 |
循环次数 | 1 |
点击绿色的启动按钮开始执行,然后点击聚合报告可以看聚合报告如下所示:
从nginx-test.jtl文件中也可以看到结果的详细信息,可以看到返回的结果200码,以及success字段的true的结果信息,说明这是一次成功的执行,另外在聚合报告中的异常%的结果是0也可以看出这一点。
liumiaocn:tmp liumiao$ cat nginx-test.jtl
timeStamp,elapsed,label,responseCode,responseMessage,threadName,dataType,success,failureMessage,bytes,sentBytes,grpThreads,allThreads,URL,Latency,IdleTime,Connect
1569663931702,5,HTTP请求,200,OK,线程组 1-1,text,true,,850,118,1,1,http://localhost:8088/,5,0,3
liumiaocn:tmp liumiao$
接下来故意修改一下HTTP请求的端口号,改成错误的本地没有HTTP服务的端口号,比如8089,设定示例如下所示:
点击绿色的启动按钮开始执行,会提示一个Warning,因为在测试中修改设定,是否还是一个压力测试是需要使用者自己判断的,这里为了演示选择“添加到现有文件”
然后点击聚合报告可以看聚合报告如下所示:
从nginx-test.jtl文件中也可以看到结果的详细信息,Connection refused的错误信息,以及success字段的false的结果信息,说明这是一次失败的执行,另外在聚合报告中的异常%的结果也变成了50%(共计两次取样测试,上一次执行的结果成功,所以异常为50%)也可以看出这一点。
liumiaocn:tmp liumiao$ cat nginx-test.jtl
timeStamp,elapsed,label,responseCode,responseMessage,threadName,dataType,success,failureMessage,bytes,sentBytes,grpThreads,allThreads,URL,Latency,IdleTime,Connect
1569663931702,5,HTTP请求,200,OK,线程组 1-1,text,true,,850,118,1,1,http://localhost:8088/,5,0,3
1569664469242,2,HTTP请求,Non HTTP response code: org.apache.http.conn.HttpHostConnectException,"Non HTTP response message: Connect to localhost:8089 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused (Connection refused)",线程组 1-1,text,false,,2673,0,1,1,http://localhost:8089/,0,0,2
liumiaocn:tmp liumiao$
执行命令:bin/jmeter -g /tmp/nginx-test.jtl -e -o /tmp/nginx-test-rpt-1 -j /tmp/nginx-rpt.log
重新将端口号修正为8080,保证HTTP测试能正确执行的基础之上,进行如下压力测试:并发用户数100、循环360次、持续时间180秒的内置HTTP请求验证
设定信息如下:
设定项 | 设定值 |
---|---|
线程数 | 100 |
循环次数 | 360 |
持续时间 | 180s |
点击绿色的启动按钮开始执行,会提示一个Warning,这里为了演示仍然选择“添加到现有文件”
然后点击聚合报告可以看聚合报告如下所示:
可以看到样本数量为36002,因为100线程组*360次循环 + 既存的两次测试结果,所以总计36002次压力测试样本,相较于前文中使用内置的Java请求,使用缺省的nginx设定的情况下,异常率已经上升至9.17%了。
执行命令:bin/jmeter -g /tmp/nginx-test.jtl -e -o /tmp/nginx-test-rpt-2 -j /tmp/nginx-rpt.log