学习JMeter一般遵循如下过程
为实现测试计划构建,你将会使用JMeter图形界面。
你也可以选择通过浏览器录制应用,或者原生应用,你可以通过菜单File-》Templates -》Recording
注意你也可以手动构建你项目,但是要确保你已经读取相关文档,并理解主要的概念
你如下过程可以进行调试:
然后View Results Tree(察看结果树)渲染器 或者Testers(CSS/JQUERY,JSON,Regexp,XPath)看结果
在构建你的测试几乎之前确保你已经学习过最佳实践课程
一旦你测试计划准备好了,你就可以开始你的加载测试,在运行前第一步就是配置注入器,也就是其他任何加载测试工具,包括如下:
一旦一切就绪,你就可以使用命令行模式去运行你的测试计划
不要运行测试使用GUI模式!(译者:表情是惊讶的。。。。)
使用命令行模式,你可以生成一个CSV(或XML)测试的结果文件,JMeter在测试结束后会生成一个HTML报告,JMeter在运行的时候默认会提供加载测试的摘要。
你可以通过使用Backend Listener获取实时结果
一旦你加载测试完成之后,你可以使用HTML报告去分析你加载的test结果
最简单使用JMeter的方式就是下载最新发布产品然后安装它
发布产品包含所有你在构建或者运行时需要的文件,例如:Web(HTTP/HTTPS), FTP, JDBC, LDAP, Java , JUnit等等
如果你想进行JDBC性能测试,首先你需要从对应供应商获取JDBC 驱动jar包,JMeter不会包含任何JDBC驱动jar包
JMeter 包含JMS API jar,但并没包含JMS客户端的实现,如果你想运行JMS测试,你需要下载合适JMS jar包
详情参考JMeter 类路径获取更多额外的jar包
接下来,启动JMeter,然后构建一个测试计划,在用户指导中有详细的介绍(例如,添加和移除元素)
最后,通过合适区域去获取构建特定类型测试计划的教程,例如,如果你对测试Web应用非常感兴趣,然后你可以看Building a Web Test Plan. 还有其它特殊的测试计划
JMeter要求你电脑环境满足最小要求
JMeter全部兼容JVM 8,我们建议你安装最新主版本号最小的jdk,Java 9 在JMeter3.2并没有完全测试完
因为JMeter使用只有标准JavaAPIs,请不要因为JRE运行JMeter失败提交文件bug
JMeter是100%的java应用程序,所以它可以运行在任何兼容JDK的机器上。
关于JMeter操作系统兼容测试情况可以去wiki一下JMeter
甚至你的操作系统不在列出wiki测试操作系统中,JMeter依然可以运行,只要JVM满足要求。
如果你的计划是做JMeter开发,你需要更多可选包。
如果你想要构建JMeter源码或者开发JMeter插件,你需要JDK1.8或以上
JMeter默认使用的是Apache的Xerces XML 解析器,如果你想使用自己第三方不同解析器,你要把第三方的jar放入到JMeter的类路径下,同时更新jmeter.properties文件使用实现的解析全路径类名。
JMeter已经扩展邮箱能力,它可以基于测试结果发送邮件,它有POP3(S)/IMAP(S) 取样器,它也有SMTP(S) 取样器
当测试web服务器使用SSL加密的时候,JMeter要求提供一个实现SSL的实现类,这个要求JDK在1.4或以上。如果你的JDK版本并不包含SSL支持的话,你可能需要添加额外的实现,在JMeter类路径下包含必要的加密包,也可以 更新system.properties 去注册SSL Provider
JMeter HTTP 默认协议水平是TLS。可以通过编辑jmeter.properties或user.properties 文件中改变JMeterproperty https.default.protocol 属性的值
JMeter HTTP 取样器被配置支持所有证书,不管信任与否,尽管日期失效等待,它在服务器中遵循最大的灵活性
如果服务器要求一个客户端证书,它可以被提供出来
这里有一个SSL Manager,它可以更好管理证书
JMeter代理服务器支持录制HTTPS(SSL)
SMTP取样器可以使用本地信任存储或信任所有证书
如果你想要进行JDBC测试,你需要添加你数据库供应商JDBC驱动jar到类路径下,注意是jar而不是zip文件
JMeter现在已经从Apache Geronimo包含JMS API,所以你需要从JMS提供商获取合适JMS 客户端的实现jar。具体详情请参考他们的文档,你可以通过wiki获取更多信息
你将需要添加jar activemq-all-x.x.x.jar 类路径下,比如通过存储到lib目录下
详情请参考 ActiveMQ initial configuration page
查看JMeter类路径下获取更多额外jar详情
我们推荐使用最多用户使用的最新版本
为了安装JMeter发布包,只要简单解压JMeter压缩包到任意你喜欢放置的目录,除此之外你需要安装合适的JDK或JRE环境,例如现在你需要安装JDK1.8,同时需要配置一个JAVA_HOME环境变量名,它值就是你安装JDK的根目录,其他没有条件了。
注意:这里将会出现一些问题(尤其是客户端-服务端模式),也就是路径中包含空格,这是不允许的。
安装的目录结构如下,其中 X.Y表示版本号
你可以重新命名根目录名称(例如 apache-jemter-X.Y)修改成你喜欢的名称,但是不要修改任何子目录名
如何运行JMeter,对于Windows用户运行 jmeter.bat,对于Unix用户运行jmeter, 这个文件都可以在bin目录找到,在点击文件很短的时间内,JMeter 图形界面将会出现
注意:用户界面模式应该只能用于创建测试脚本,非用户界面必须用来加载测试计划
在bin目录下还有一些额外的脚本,Windows脚本文件(.CMD文件要求Win2K或以上系统)
jmeter.bat
运行JMeter(默认图形界面启动)
jmeterw.cmd
运行JMeter不会出现window Shell控制台(默认图形界面)
jmeter-n.cmd
拖拽一个JMX文件到这个文件上去执行非图形界面测试
jmeter-n-r.cmd
拖拽一个JMX文件到这个文件上去执行远程非图形界面测试
jmeter-t.cmd
拖拽一个JMX文件到这个文件上去加载成图形界面模式
jmeter-server.bat
启动JMeter服务器模式
mirror-server.cmd
运行非图形界面JMeter镜像服务器
shutdown.cmd
通过运行关闭客户端优雅暂停非图形界面的测试实例
stoptest.cmd
通过运行关闭客户端程序暴力暂停非图形界面的测试实例
注意:
最近添加的脚本有jmeter-n.cmd,jmeter-t.cmd和jmeter-n-r.cmd ,这就意味着,最近测试计划在运行时候有更好的交互性。
这个环境变量JVM_ARGS被用来重写JVM设置在jmeter.bat脚本的值,例如
Un*x 脚本文件表示它必须工作在Linux/Unix系统中
jmeter
运行JMeter(默认图形化界面)定义一些JVM设置可能不能满足所有工作要求,可以进行修改
jmeter-server
启动jmeter服务器模式(通过合理参数去调用jmeter脚本)
jmeter.sh
非常基础的JMeter脚本(你可能需要适应JVM默认选项例如:内存设置)
mirror-server.sh
运行JMeter镜像服务(非图形化界面)
shutdown.sh
优雅暂停非图形化界面测试实例
stoptest.sh
暴力暂停非图像化界面的测试实例
有可能你需要修改jmeter脚本,JVM设置可能不适合你当前机器的JVM,JVM_ARGS环境变量可以重写,或者设置额外JVM属性,例如
将会在脚本中重写堆的设置。
JMeter会自动从如下目录下找jars包
JMETER_HOME/lib
用工具包
JMETER_HOME/lib/ext
JMeter组件和插件
如果你已经开发新JMeter组件,将你需要的jar拷贝到JMeter lib/ext目录下,JMeter会自动发现JMeter组件在任何jar中。不要使用lib/ext放置工具包,或者将插件依赖包放入到lib下,它只是JMeter组件和插件引用的。
工具包和依赖包(各种库)将会被放置到lib目录下
如果你不想将jars放入到lib目录下,你可以在jmeter.properties定义user.classpath或者plugin_dependency_paths,可以参考下面介绍两个属性不同之处
其他jars(例如JDBC、JMS 和其他支持的库)应该被放置到lib目录下,而不是lib/ext目录,或者添加属性user.classpath
注意:JMeter将会找.jar 而不是.zip
你可以根据已经存在的模板进行创建测试计算
操作如下:
菜单 -文件-》Templates(模板)
··
如果你正在测试一个防火墙或代理服务器,你可能需要给JMeter 提供防火墙或者代理服务的主机名和端口号,如何操作呢?命令行运行jmeter[.bat] 文件,有如下参数
-H :【代理服务主机名或者IP地址】
-P : 【代理服务器端口】
-N :【没有代理主机名】(例如 *.apache.org|localhost)
-u : 【代理验证的用户名-如果需要的话】
-a :【代理验证的密码- 如果需要的话】
例子:
你也可以使用 -proxyHost , -proxyPort, -username, 和 -password 做为参数名
注意:参数会显示在命令行,对他人可见。
如果代理主机和端口被提供的话,那么JMeter将会设置如下系统属性
如果非代理主机列表被提供,那么Jmeter将会设置如下系统属性
如果你不想设置http和https代理,你可以在system.properties定义相关属性去替换使用命令行参数。
代理设置也可以定义在一个测试计划中,使用HTTPRequest Defaults 配置或者 HTTPRequest 取样器元素
注意:
Jmeter也有它自己内置代理服务器,在HTTP(S) Test Script Recorder,它只是使用记录浏览器HTTP或者HTTPS的Session。它并不与上面描述混淆一谈,也就是使用HTTP 或者HTTPS请求它本身。
为了加载测试,你必须运行JMeter非图形界面模式去得到测试结果,如果操作呢?,使用如下命令选项:
-n :这表示使用非图形界面
-t :【JMX文件中包含测试计划】
-l :【JTL文件会记录简单日志结果】
-j :【JMeter运行的日志文件】
-r :运行测试服务器通过设置属性"remote_hosts"
-R :【列出运程服务器列表】运行测试具体远程服务器
-g : 【CSV文件路径】只是生成报表
-e : 在加载测试之后生成报表
-o:输出生成报表文件到文件夹中,文件必须不存在或为空
这个脚本让你确定可选防火墙或代理服务器信息:
-H 【代理服务器主机或ip 地址】
-P 【代理服务端口】
例子:
如果属性jmeterengine.stopfail.system.exit 设置为true(默认是false),如果他不能暂停所有线程,那么Jmeter将会调用System.exit(1),一般情况下它不是必要的。
为了分布式测试,在远程节点上运行JMeter服务器模式,你可以通过界面控制这些服务器,你也可以是通过非图形模式运行运程测试,为启动服务器,请在每个服务器主机运行jmeter-server[.bat]文件
这个脚本文件需要让你具体可选防火墙或代理服务器信息:
-H 【代理服务器主机或ip地址】
-P【代理服务端口】
例子:
如果你想要在单次测试运行完之后服务器退出,你可以定义JMeter属性server.exitaftertest = true
运行测试使用非客户端界面模式,使用如下命令
注解:
-G 被用来定义在服务器JMeter属性
-X 意味着在测试完退出服务器
-Rserver1, server2 :可以使用替换-r去提供启动的服务器列表,重写remote_hosts, 但是并不会定义这个属性
如果属性jmeterengine.remote.system.exit 被设置为TRUE(默认为false),那么jMeter会在运程调用测试完之后会调用System.exit(0),一般这个是没有必要设置
java系统属性和JMeter属性可以在通过命令行进行重写(替代jmeter.properties修改),如何操作?使用如下命令选项
-D【属性名】=【值】 定义一个java系统属性值
-J 【属性名】= 【值】定义本地Jmeter属性
-G 【属性名】=【值】定义一个Jmeter属性将会发送所有远程服务器
-G【属性文件】 定义一个文件包含Jmeter属性将会发送到所有远程服务器
-L 【目录】=【优先级】 重写日志设置,设置特定的目录的优先级
-L标志可以不用设置目录表示设置根目录的日志级别
命令行属性在启动时被早期处理,但在建立日志系统之后。
从3.2开始,JMeter日志不在通过jmeter.properties 属性进行配置,而是通过Apache Log4j2 配置文件 log4j2.xml,这个文件所在的目录是Jmeter启动目录,也就是从3.2开始JMeter和插件MUST使用SLF4J库记录日志
这里有一个log4j2.xml文件,对于每个目录将会定义appenders和loggers
%d %p %c{1.}: %m%n
%d %p %c{1.}: %m%n
所以,如果你想改变日志级别,可以通过修改org.apache.http的值,重启jmeter就行
更多的详情如何配置log4j2.xml文件,请参考点击打开链接
对特定目录和root日志级别可以直接通过命令行设置(替换修改log4j2.xml),如何操作,使用如下操作
-L【目录】=【优先级】
重写日志设置,设置特定目录的日志级别,从3.2开始,它推荐使用全目录名(例如:org.apache.jmeter 或者 com.example.foo)如果目录采用是jmeter或jorphan,org.apache.它会默认补全成一个全路径(例如:org.apache.jmeter 或 org.apache.jorphan),它为了向后 兼容。
例子:
日志不同:旧的和新的实践
从3.2开始JMeter使用SLF4J作为日志的API和Apache Log4j2 作为日志框架,并不是旧的日志级别与SLF4/Log4j2一一对应,所以,如果你想要从旧的日志配置和日志代码,请遵循如下不同点和实践建议。
目录 | 在3.2之前 | 在3.2之后 |
日志参考 | 日志参考通过 LoggingManager: |
使用SLF4j目录或class |
日志级别 | DEBUG INFO WARN ERROR FATAL_ERROR NONE |
DEBUG INFO WARN ERROR ERROR NONE |
‘TRACE’级别比‘DEBUG’级别要高,它被3.2之后支持,详情查看SLF4J或者Apache Log4j2 文档
在运行测试的时候JMeter一般不会对于错误使用弹出框,对于一个mis-spelt变量和函数也不会报道任何错误,而是只是引用,详情参考:点击打开链接
如果JMeter 在运行测试时候检测出错误,这个信息将会被写入日志文件中,这日志文件名通过log4j2.xml文件(或者使用-j 选项,如下所示)。它默认是jmeter.log,可以在Jmeter启动目录找到这个文件。
也可以通过图像界面 选项-》Log VIewer 或者 三角形中一个感叹号
在任何更深属性被处理,命令行可以使用选项 -j jmeterlogfile 可以设置初始化属性文件为可读,它所以允许默认jmeter.log可以被重写,采用jmeter脚本来测试计划(例如jmeter-n.cmd),那么日志文件的名称为测试计划的名称,例如测试计划为Text27.jmx 那么日志文件设置为Test27.log
当运行在Windows上,这个文件可以只是显示jmeter,除非你设置扩展名可见。
日志文件会记录测试的一些信息
2017-03-01 12:19:20,314 INFO o.a.j.JMeter: Version 3.2.20170301
2017-03-01 12:19:45,314 INFO o.a.j.g.a.Load: Loading file: c:\mytestfiles\BSH.jmx
2017-03-01 12:19:52,328 INFO o.a.j.e.StandardJMeterEngine: Running the test!
2017-03-01 12:19:52,384 INFO o.a.j.e.StandardJMeterEngine: Starting 1 threads for group BSH. Ramp up = 1.
2017-03-01 12:19:52,485 INFO o.a.j.e.StandardJMeterEngine: Continue on error
2017-03-01 12:19:52,589 INFO o.a.j.t.JMeterThread: Thread BSH1-1 started
2017-03-01 12:19:52,590 INFO o.a.j.t.JMeterThread: Thread BSH1-1 is done
2017-03-01 12:19:52,691 INFO o.a.j.e.StandardJMeterEngine: Test has ended
调用 JMeter 作为 “jmeter -?” 将会打印如下命令行选项:
D:\install\apache-jmeter-3.2\bin>jmeter -?
_ ____ _ ____ _ _ _____ _ __ __ _____ _____ _____ ____
/ \ | _ \ / \ / ___| | | | ____| | | \/ | ____|_ _| ____| _ \
/ _ \ | |_) / _ \| | | |_| | _| _ | | |\/| | _| | | | _| | |_) |
/ ___ \| __/ ___ \ |___| _ | |___ | |_| | | | | |___ | | | |___| _ <
/_/ \_\_| /_/ \_\____|_| |_|_____| \___/|_| |_|_____| |_| |_____|_| \_\ 3.
2 r1790748
Copyright (c) 1999-2017 The Apache Software Foundation
--?
print command line options and exit
-h, --help
print usage information and exit
-v, --version
print the version information and exit
-p, --propfile
the jmeter property file to use
-q, --addprop
additional JMeter property file(s)
-t, --testfile
the jmeter test(.jmx) file to run. "-t LAST" will load last
used file
-l, --logfile
the file to log samples to
-i, --jmeterlogconf
jmeter logging configuration file (log4j2.xml)
-j, --jmeterlogfile
jmeter run log file (jmeter.log)
-n, --nongui
run JMeter in nongui mode
-s, --server
run the JMeter server
-H, --proxyHost
Set a proxy server for JMeter to use
-P, --proxyPort
Set proxy server port for JMeter to use
-N, --nonProxyHosts
Set nonproxy host list (e.g. *.apache.org|localhost)
-u, --username
Set username for proxy server that JMeter is to use
-a, --password
Set password for proxy server that JMeter is to use
-J, --jmeterproperty =
Define additional JMeter properties
-G, --globalproperty =
Define Global properties (sent to servers)
e.g. -Gport=123
or -Gglobal.properties
-D, --systemproperty =
Define additional system properties
-S, --systemPropertyFile
additional system property file(s)
-f, --forceDeleteResultFile
force delete existing results files before start the test
-L, --loglevel =
[category=]level e.g. jorphan=INFO, jmeter.util=DEBUG or com
.example.foo=WARN
-r, --runremote
Start remote servers (as defined in remote_hosts)
-R, --remotestart
Start these remote servers (overrides remote_hosts)
-d, --homedir
the jmeter home directory to use
-X, --remoteexit
Exit the remote servers at end of test (non-GUI)
-g, --reportonly
generate report dashboard only, from a test results file
-e, --reportatendofloadtests
generate report dashboard after load test
-o, --reportoutputfolder
output folder for report dashboard
如果具体名LAST被用来对于-t,-j或者-l标志,那么JMeter意味着最后的测试计划将会采用交互式模式。
在2.5.1版本之前,Jmeter在非图像界面完成测试的时候将会调用System.exit(), 这就是导致应用的问题直接调用Jmeter,所以JMeter在正常测试完之后不在调用System.exit()【有些致命的错误也仍然调用System.exit()】在启动的时候,JMeter会退出所有非守护线程,但还是有可能一些非守护线程仍然存在,它们将会阻止JVM退出。为了检测这个情况,JMeter会在退出之前启动一个新的守护线程,这个守护线程将会等待一会儿,如果它从等待中返回,它将会清除不能退出的JVM,然后所的线程将会打印为什么的信息。
这个属性jmeter.exit.check.pause 将会被重写默认暂停2秒,如果设置为0,那么Jmeter将会不会启动守护线程。
如果你想要修改JMeter运行时需要的属性,可以修改bin目录下user.properties文件,或在命令行设置jmeter.propeties属性
注意:你可以在user.properties文件定义额外的属性,这么文件将会在当前目录下自动加载,类似,system.properties 被用更新系统属性
ssl.provider 如果你不想要使用内嵌java实现类,你可以具体指定实现SSL的实现类
xml.parser 你可以指定xml 解析类,它默认值为org.apache.xerces.parsers.SAXParser
remote_hosts 冒号分割一个远程JMeter主机列表(host:port)如果JMeter运行在分布式环境中,你需要列出所有运行远程服务器,它允许你使用图形界面控制远程服务器
not_in_menu 自定义JMeter图像界面菜单,当更多JMeter的组件被添加到UI中,你可以自定义界面,你可能需要列出类名或者这个类的标签(也就是出现在UI的名称)它将不会出现在图像界面中。
search_paths 用分号分割路径,JMeter将会在这些路径下搜索插件类,例如额外取样器,这个路径可以是一个jar文件或目录,任何jar文件将会自动包含search_paths,jar文件子目录将会被忽略,它将会在lib/ext 目录下找。
user.classpath 路径列表,jmeter将会在这个路径下搜索工具和插件依赖类,使用平台路径分隔符去分割多个路径,一个路径可以是一个jar或目录,任何设置user.classpath的jar或目录将会自动加载,不过子目录将会忽略。
plugin_dependency_paths 路径列表通过分号分割,jmeter将会在这个路径下搜索工具和插件依赖类,使用平台路径分隔符去分割多个路径,一个路径可以是一个jar或目录,任何设置plugin_dependency_paths的jar或目录将会自动加载,不过子目录将会忽略。如果它与user.classpath冲突了,plugin_dependency_paths优先级更高
user.properties 这个包含额外JMeter属性,将会在初始化之后将会被添加,但是在 -q 和 -J选项之前被处理
system.properties 包含额外的系统属性, 它会在-S 和-D选择之前被添加处理。
这些命令行选项和属性文件将会根据如下顺序进行处理:
1.-p propfile
2. jmeter.properties
3. -j logfile
4.日志被初始化
5.user.properties 被加载
6. system.properties 被加载
7.所有其他命令行选被处理
其他详情可以参考jmeter.properties, user.properties 和system.properties文件中的注释。