1.简介
前边一篇文章介绍了如何生成测试报告,细心地小伙伴或者同学们可以看到宏哥启动Jmeter生成测试报告不是在gui页面操作的,而是在gui页面设置好保存以后,用命令行来生成测试报告的。这一篇宏哥就详细的介绍一下为什么用命令行而不是GUI,以及启动时的一些参数的含义。
2.为什么要命令行执行脚本?
本文介绍如何从命令行运行JMeter,那么宏哥先来说说,为什么要命令行执行脚本,日常测试过程中发现,在大数量并发时,jmeterGUI界面时长宕机、卡死,在这种情况下我们就需要使用命令行来执行脚本了(非GUI也称为 no Mode模式),使用非 GUI 模式,即命令行模式运行 JMeter 测试脚本能够大大缩减所需要的系统资源。主要有以下三点:
1) 图形化界面消耗更多资源,如CPU和内存,容易使压力机达到瓶颈,从而影响测试结果。
2) 图形化界面不支持大型的负载测试和性能测试,并发较大时,jmeter会崩溃。
3) 命令行测试支持持续集成,命令行方式可以把脚本配置到Jenkins上实现持续集成,做成自动化测试。例如放到Jenkins这样的CI工具上。
3.具体步骤
这个主要是针对不会代码脚本的童鞋们或者小伙伴可以首先在图形界面将脚本调试成功,然后再在非GUI也称为 no Mode模式下运行脚本。
1. 通过双击jmeter.bat打开JMeter图形界面
2.在默认的Test Plan上创建一个Thread Group
3.在Thread Group上面添加一个Sampler,选择HTTP Request
4.在Thread Group上面添加一个View Results Tree
5.点击Run,在弹出对话框询问是否保存,点击Yes,保存脚本到桌面,Test Plant And Report.jmx
6.检查View Results Tree里面的response code 是不是200,
7.通过检查测试通过,说明测试脚本没问题,我们这里选择删除View Results Tree
8.关闭当前JMeter对话框
9. 打开cmd,通过cd命令先切换到JMeter安装路径
例如: cd C:apache-jmeter-3.2bin
10. 输入一下命令开始执行测试
上图中红色框里的内容说明:
代码语言:javascript复制summary = 60 in 00:00:05:在5秒内产生的总请求数是60个,其中的时间段是从脚本运行开始计算到当前时间为止,一般在脚本运行过程中主要关注 “summary=” 信息即可
11.8/s:系统每秒处理的请求数,相当于TPS
Avg: 83:平均响应时间
Min: 43:最小响应时间
Max: 248:最大响应时间
Err: 0 (0.00%):错误数/率
Active: 100:活动的线程数
4.命令行参数
4.1运行命令常用格式
jmeter -n -t [jmx脚本路径] -l [测试输出文件路径]
参数解释:
代码语言:javascript复制-n: 表示 non gui mode,就是非图形化模式
-t: 即testplan,后跟要运行的jmeter脚本的路径和脚本名称。
若指定路径下没有指定名称的脚本,则自动创建。
若没有路径只写脚本名称,则默认是在当前目录查找或创建。
-l: 后跟输出结果文件路径和结果文件名称。
若指定路径下没有指定名称的脚本,则自动创建,可以生成csv或者jtl文件。
若只写脚本名称,则默认是在当前目录查找或创建。
示例: jmeter -n -t testplan.jmx -l test.jtl
示例含义:以命令行模式运行当前目录下的testplan.jmx文件,并在当前目录下输出日志文件test.jtl
其他参数:
代码语言:javascript复制jmeter -n -t test.jmx -R 10.6.5.31,10.6.5.32 -l log.jtl
jmeter -n -t test.jmx -l log.jtl -H 192.168.1.1 -P 8080
-r/R 远程执行 -> 启动远程服务,即分布式执行多台压力机
-H 代理主机 -> 设置 JMeter 使用的代理主机
-P 代理端口 -> 设置 JMeter 使用的代理主机的端口号
使用-R指定节点时,要首先在这些节点上启动jmeter-server的服务
测试结果:
会在桌面生成一个html.cvs文件,这个文件刚好有60行,内容如下:
5.Linux系统运行jmeter命令行
将编辑好的脚本拷贝到Linux下
1、使用命令执行脚本:
jmeter -n -t bugfree-create.jmx -l test.jtl
注意:如果未设置Jmeter的环境变量则在执行脚本的时候需要检查当前目录是否是jmetet的bin 目录下
运行示意图:
2、运行结果的查看
(1)将运行脚本产生的test.jtl文件到处到windows系统下(注意:window下安装的Jmeter和JDK要和Linux的保持一致)
(2)在windows系统下打开Jmeter,创建一个线程组,在线程组下添加监听器,如下图:
(3)点击界面上的浏览按钮,将到处的文件添加进来即可看到脚本测试的报告,如下图:
6.windows系统下运行jmeter命令行
在windows下运行命令行跟linux下是一样的,只是通过cmd命令行工具来运行的。而且上一篇宏哥介绍的就是在在windows下运行Jmeter命令行,宏哥在这里就不做赘述了。
7.小结
使用jmeter进行压力测试时遇到一段时间后报内存溢出outfmenmory错误,导致jmeter卡死了,先尝试在jmeter.bat中增加了JVM_ARGS="-Xmx2048m -Xms2048m -Xmn256m -XX:PermSize=128m -Xss256k",但结果运行时间增加了,但最终还是报内存溢出,百度后按照网友的建议更改了如下设置后jmeter就没有再卡了:
1、windows环境下,修改jmeter.bat:
代码语言:javascript复制set HEAP=-Xms256m -Xmx256m
set NEW=-XX:NewSize=128m -XX:MaxNewSize=128m
改为:
set HEAP=-Xms256m -Xmx1024m
set NEW=-XX:NewSize=128m -XX:MaxNewSize=512m
根据经验,heap最多设置为物理内存的一半,默认设置为512M.如果heap超过物理内存的一半,可能运行jmeter会慢,甚至出现内存溢出,原因java比较吃内存,占CPU.
注意:JDK32位的电脑Xmx不能超过1500m,最大1378m.否则在启动Jmeter时会报错:
2、linux环境下,修改jmeter.sh:
java $JVM_ARGS -Xms1G -Xmx5G -XX:MaxPermSize=512m -Dapple.laf.useScreenMenuBar=true -jar `dirname $0`/ApacheJMeter.jar "$@"
3、如果查看JDK的位数
代码语言:javascript复制# java -version
java version "1.6.0_26"
Java(TM) SE Runtime Environment (build 1.6.0_26-b03)
Java HotSpot(TM) Server VM (build 20.1-b02, mixed mode)
如果是64位的话,最后一行会显示64-Bit
#java -version
java version "1.6.0_26"
Java(TM) SE Runtime Environment (build 1.6.0_26-b03)
Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02, mixed mode)
8.拓展
8.1修改配置文件
如果你是第一次使用命令行执行测试脚本,那么看到的输出结果可能是类似下面这样的:
这些信息仅仅告诉我们执行成功啦。但是我想要看到本次测试的更多结果,要怎么办呢?可以通过修改jmeter.properties配置文件来解决:
代码语言:javascript复制#---------------------------------------------------------------------------
# Results file configuration
#---------------------------------------------------------------------------
# This section helps determine how result data will be saved.
# The commented out values are the defaults.
# legitimate values: xml, csv, db. Only xml and csv are currently supported.
#jmeter.save.saveservice.output_format=csv
# The below properties are true when field should be saved; false otherwise
#
# assertion_results_failure_message only affects CSV output
#jmeter.save.saveservice.assertion_results_failure_message=true
#
# legitimate values: none, first, all
#jmeter.save.saveservice.assertion_results=none
#
#jmeter.save.saveservice.data_type=true
#jmeter.save.saveservice.label=true
#jmeter.save.saveservice.response_code=true
# response_data is not currently supported for CSV output
#jmeter.save.saveservice.response_data=false
# Save ResponseData for failed samples
#jmeter.save.saveservice.response_data.on_error=false
#jmeter.save.saveservice.response_message=true
#jmeter.save.saveservice.successful=true
#jmeter.save.saveservice.thread_name=true
#jmeter.save.saveservice.time=true
#jmeter.save.saveservice.subresults=true
#jmeter.save.saveservice.assertions=true
#jmeter.save.saveservice.latency=true
# Only available with HttpClient4
#jmeter.save.saveservice.connect_time=true
#jmeter.save.saveservice.samplerData=false
#jmeter.save.saveservice.responseHeaders=false
#jmeter.save.saveservice.requestHeaders=false
#jmeter.save.saveservice.encoding=false
#jmeter.save.saveservice.bytes=true
# Only available with HttpClient4
#jmeter.save.saveservice.sent_bytes=true
#jmeter.save.saveservice.url=true
#jmeter.save.saveservice.filename=false
#jmeter.save.saveservice.hostname=false
#jmeter.save.saveservice.thread_counts=true
#jmeter.save.saveservice.sample_count=false
#jmeter.save.saveservice.idle_time=true
# Timestamp format - this only affects CSV output files
# legitimate values: none, ms, or a format suitable for SimpleDateFormat
#jmeter.save.saveservice.timestamp_format=ms
#jmeter.save.saveservice.timestamp_format=yyyy/MM/dd HH:mm:ss.SSS
# For use with Comma-separated value (CSV) files or other formats
# where the fields' values are separated by specified delimiters.
# Default:
#jmeter.save.saveservice.default_delimiter=,
# For TAB, one can use:
#jmeter.save.saveservice.default_delimiter=t
# Only applies to CSV format files:
# Print field names as first line in CSV
#jmeter.save.saveservice.print_field_names=true
# Optional list of JMeter variable names whose values are to be saved in the result data files.
# Use commas to separate the names. For example:
#sample_variables=SESSION_ID,REFERENCE
# N.B. The current implementation saves the values in XML as attributes,
# so the names must be valid XML names.
# By default JMeter sends the variable to all servers
# to ensure that the correct data is available at the client.
# Optional xml processing instruction for line 2 of the file:
# Example:
#jmeter.save.saveservice.xml_pi=<?xml-stylesheet type="text/xsl" href="../extras/jmeter-results-detail-report.xsl"?>
# Default value:
#jmeter.save.saveservice.xml_pi=
# Prefix used to identify filenames that are relative to the current base
#jmeter.save.saveservice.base_prefix=~/
# AutoFlush on each line written in XML or CSV output
# Setting this to true will result in less test results data loss in case of Crash
# but with impact on performances, particularly for intensive tests (low or no pauses)
# Since JMeter 2.10, this is false by default
#jmeter.save.saveservice.autoflush=false
将上面的内容复制到user.properties文件中,然后注释打开,并且值修改成true,就会打开该条记录,jmeter就会将对应的信息输出到我们指定的jtl文件中(不过这样会在压测过程中产生大量的日志文件,真正压测时,最好不要开太多的日志记录),然后可以在结果文件中查看详细的信息。但是我们想在脚本执行的过程中实时查看结果信息,要怎么做呢?同样是将jmeter.properties文件中一下内容复制到user.properties文件中修改配置文件jmeter.properties。
代码语言:javascript复制#---------------------------------------------------------------------------
# Summariser - Generate Summary Results - configuration (mainly applies to non-GUI mode)
#---------------------------------------------------------------------------
#
# Comment the following property to disable the default non-GUI summariser
# [or change the value to rename it]
# (applies to non-GUI mode only)
summariser.name=summary
#
# interval between summaries (in seconds) default 30 seconds
#summariser.interval=30
#
# Write messages to log file
#summariser.log=true
#
# Write messages to System.out
#summariser.out=true
# Ignore SampleResults generated by TransactionControllers
# defaults to true
#summariser.ignore_transaction_controller_sample_result=true
打开上面的summariser.name、summariser.interval、summariser.out这三个配置项,保存,重新运行jmeter,应该就可以在shell里看到统计信息了,如下图所示:
注意:如果未设置Jmeter的环境变量则在执行脚本的时候需要检查当前目录是否是jmetet的bin 目录下
代码语言:javascript复制Remote engines have been started
Waiting for possible shutdown message on port 4445
summary 3036 in 3s = 1001.6/s Avg: 25 Min: 14 Max: 58 Err: 3036 (100.00%) Active: 61 Started: 58 Finished: 0
summary 25670 in 10.3s = 2494.7/s Avg: 61 Min: 11 Max: 190 Err: 25670 (100.00%) Active: 261 Started: 258 Finished: 0
summary = 28706 in 13.1s = 2192.0/s Avg: 57 Min: 11 Max: 190 Err: 28706 (100.00%)
summary 27300 in 10.3s = 2654.9/s Avg: 129 Min: 10 Max: 407 Err: 27300 (100.00%) Active: 461 Started: 458 Finished: 0
summary = 56006 in 23.1s = 2426.7/s Avg: 92 Min: 10 Max: 407 Err: 56006 (100.00%)
summary 27200 in 10.4s = 2606.1/s Avg: 202 Min: 10 Max: 528 Err: 27200 (100.00%) Active: 660 Started: 657 Finished: 0
summary = 83206 in 33.1s = 2512.8/s Avg: 128 Min: 10 Max: 528 Err: 83206 (100.00%)
summary 26300 in 11s = 2478.3/s Avg: 284 Min: 11 Max: 702 Err: 26300 (100.00%) Active: 861 Started: 858 Finished: 0
summary = 109506 in 43.1s = 2541.1/s Avg: 166 Min: 10 Max: 702 Err: 109506 (100.00%)
summary 26200 in 11s = 2439.0/s Avg: 355 Min: 10 Max: 866 Err: 26200 (100.00%) Active: 1000 Started: 997 Finished: 0
summary = 135706 in 53.1s = 2556.0/s Avg: 202 Min: 10 Max: 866 Err: 135706 (100.00%)
这里的错误率是100%,正常情况下应该是0%。
这里显示的信息就相当于GUI界面下聚合报告元件所显示的信息。其中主要有两种信息:summary 和summary =,其它项都是类似的
代码语言:javascript复制summary 4386 in 00:00:30:在30秒内增加了4386个请求,其中时间间隔由配置文件中的interval统计频率的值决定
summary = 27455 in 00:03:12:在3分12秒内产生的总请求数是27455个,其中的时间段是从脚本运行开始计算到当前时间为止,一般在脚本运行过程中主要关注 “summary=” 信息即可
146.2/s:系统每秒处理的请求数,相当于TPS
Avg: 684:平均响应时间
Min: 201:最小响应时间
Max: 1499:最大响应时间
Err: 0 (0.00%):错误数/率
Active: 100:活动的线程数
8.2文件路径
1、命令行中的文件路径
示例:jmeter -n -t testplan.jmx -l test.jtl
JMeter 默认去当前目录寻找脚本文件,并把日志记录在当前目录。比如你在 C:toolsapache-jmeter-3.0bin 目录下执行以上命令,JMeter 会去该目录下寻找 test.jmx 脚本并把执行结果放在该目录。如果你的脚本在其他目录,而且想要把执行结果放在另外文件夹,需要使用绝对路径告诉 JMeter,比如:
代码语言:javascript复制C:toolsapache-jmeter-3.0bin>jmeter -n -t e:addCustomer.jmx -l e:addCustomer.jtl