Apache JMeter是一个纯Java开发的用于负载测试或者性能测试的开源软件。前面几片文章的介绍中都是通过使用JMeter的可视化页面进行的操作,这篇文章同样以对Web应用进行测试的压力测试为例,介绍非图形化方式进行压测的方法。
关于Apache JMeter的概要介绍与安装的方法,可参看如下内容:
jmeter通过-n来指定非GUI模式,缺省状态下会启动JMeter的GUI界面,而启动时也伴随着如下提示信息:
liumiaocn:apache-jmeter-5.1.1 liumiao$ bin/jmeter -j /tmp/jmeter-master.log
================================================================================
Don't use GUI mode for load testing !, only for Test creation and Test debugging.
For load testing, use CLI Mode (was NON GUI):
jmeter -n -t [jmx file] -l [results file] -e -o [Path to web report folder]
& increase Java Heap to meet your test requirements:
Modify current env variable HEAP="-Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m" in the jmeter batch file
Check : https://jmeter.apache.org/usermanual/best-practices.html
================================================================================
什么时候使用GUI模式,什么时候使用非GUI模式?
上述的提示已经非常清晰,不要使用GUI模式进行负载测试!只有在测试调试或者测试用例设定或者生成的时候才用GUI模式。
使用命令与参数如下所示:
执行命令:jmeter -n -t [jmx文件] -l [结果文件] -e -o [测试报告目录]
在本地机器的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$
在JMeter的非GUI方式的命令行中,jmx文件中保存了线程组和测试的设定信息,是压测的输入信息,而jmx文件的生成可以使用GUI界面生成,因为jmx就是xml文件的格式,一旦熟悉之后也可以直接编辑生成也可。
使用如下步骤准备测试验证的前提准备:
步骤5: 保存生成jmx文件
这样jmx文件就准备好了,如果当你觉得自己更熟悉这种生成的xml格式,也可以直接使用vi编辑生成如下格式的jmx文件自然也是可以的,可以看到设定的线程组的数量以及循环的次数和HTTP请求的设定,均在如下的XML格式的jmx文件中有保存。
liumiaocn:apache-jmeter-5.1.1 liumiao$ cat /tmp/jmeter-nongui-test.jmx
false
true
false
continue
false
10
100
1
false
localhost
8088
http
/
GET
true
false
true
false
liumiaocn:apache-jmeter-5.1.1 liumiao$
执行命令:jmeter -n -t [jmx文件] -l [结果文件] -e -o [测试报告目录]
以上述的jmx文件为输入,通过-t进行指定,使用上述jmeter -n命令执行并生成报告:
liumiaocn:apache-jmeter-5.1.1 liumiao$ bin/jmeter -n -t /tmp/jmeter-nongui-test.jmx -l /tmp/result.jtl -e -o /tmp/jmeter-nongui-rpt
Creating summariser
Created the tree successfully using /tmp/jmeter-nongui-test.jmx
Starting the test @ Wed Oct 02 11:31:41 CST 2019 (1569987101117)
Waiting for possible Shutdown/StopTestNow/HeapDump/ThreadDump message on port 4445
summary = 1000 in 00:00:01 = 950.6/s Avg: 13 Min: 1 Max: 67 Err: 0 (0.00%)
Tidying up ... @ Wed Oct 02 11:31:42 CST 2019 (1569987102451)
... end of run
liumiaocn:apache-jmeter-5.1.1 liumiao$
其实,从jtl这个简单的csv文件中,基本可以看到可视化的图表的所有内容,如下获取最初3行和最后2两行的数据来看,可以看到执行的相关信息
liumiaocn:apache-jmeter-5.1.1 liumiao$ tail -n2 /tmp/result.jtl
1569987102446,2,HTTP请求,200,OK,线程组 1-100,text,true,,850,118,1,1,http://localhost:8088/,2,0,0
1569987102448,1,HTTP请求,200,OK,线程组 1-100,text,true,,850,118,1,1,http://localhost:8088/,1,0,0
liumiaocn:apache-jmeter-5.1.1 liumiao$
liumiaocn:apache-jmeter-5.1.1 liumiao$ head -n3 /tmp/result.jtl
timeStamp,elapsed,label,responseCode,responseMessage,threadName,dataType,success,failureMessage,bytes,sentBytes,grpThreads,allThreads,URL,Latency,IdleTime,Connect
1569987101523,67,HTTP请求,200,OK,线程组 1-1,text,true,,850,118,17,17,http://localhost:8088/,67,0,48
1569987101523,67,HTTP请求,200,OK,线程组 1-4,text,true,,850,118,17,17,http://localhost:8088/,67,0,49
liumiaocn:apache-jmeter-5.1.1 liumiao$
另外从总的行数上来看会更加清晰,为1001(1000次测试结果+1行的表头),另外结果中包含’,true,'表明执行结果为OK的除去之后仅剩表头,说明1000行的结果都是正常执行完毕,压测中没有出现异常结果。
当然从生成的报表中,可以更为直观地看到压测结果的概要信息