Apache JMeter是一个纯Java开发的用于负载测试或者性能测试的开源软件。JMeter起初就是被设计用来进行Web应用的压力测试,这篇文章通过使用Docker拉起一个Nginx容器,然后对其进行压测这样一个即为简单的例子来介绍一下使用JMeter进行压力测试的流程和方法。
环境准备
关于Apache JMeter的概要介绍与安装的方法,可参看如下内容:
- https://liumiaocn.blog.csdn.net/article/details/101264380
压力测试应用准备
在本地机器的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/
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
liumiaocn:~ liumiao$
使用如下步骤准备测试验证的前提准备:
-
步骤1: 在测试计划下添加一个线程组,选择菜单信息如下图所示:
-
步骤2: 在刚刚创建的线程组上添加一个HTTP请求的取样器,选择菜单信息如下图所示:
-
步骤3: 添加一个聚合报告,选择菜单信息如下图所示:
-
步骤4: 保存测试计划
点击保存测试计划按钮将结果保存为/tmp/nginx-test.jmx -
步骤5: 在聚合报告页面设定jtl文件
在聚合报告页面设定写入和jtl文件路径为:/tmp/nginx-test.jtl
HTTP测试
进行一次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
- 测试报告的概要信息如下所示:
转载:https://blog.csdn.net/liumiaocn/article/details/101596482