官网:http://jmeter.apache.org/usermanual/
说明:十八元件、十九属性、二十函数,涉及清单内容暂未仔细阅读,个人觉得一是仅供使用参考,二是适合单独写文章来解读
一、让我们开始吧
千万不要在GUI模式下来做负载测试,要用CLI模式
jmeter不带jdbc驱动程序,如果使用jdbc,就需要去网上下载,然后添加到classpath
jmeter是100%的java应用程序
在jmeter的classpath中添加加密包,更新system.properties来注册ssl支持
jmeter http默认协议级别为TLS,可以编辑修改:jmeter.properties或user.properties的https.default.protocol
jmeter安装目录(XY是版本号)
apache-jmeter-X.Y # 可以修改根目录,不能修改子目录 apache-jmeter-X.Y/bin apache-jmeter-X.Y/docs apache-jmeter-X.Y/extras apache-jmeter-X.Y/lib/ apache-jmeter-X.Y/lib/ext apache-jmeter-X.Y/lib/junit apache-jmeter-X.Y/licenses apache-jmeter-X.Y/printable_docs
bin目录
可以在bin目录下创建setenv.bat来配置jvm
rem This is the content of bin\setenv.bat, rem it will be called by bin\jmeter.bat set JVM_ARGS="-Xms1024m -Xmx1024m -Dpropname=value"
可以配置环境变量
可以在启动jmeter直接指定环境变量
JVM_ARGS="-Xms1024m -Xmx1024m" jmeter -t test.jmx [etc.]
jmeter的类路径
JMETER_HOME/lib (jmeter.properties的user.classpath可以设置)
used for utility jars
JMETER_HOME/lib/ext (jmeter.properties的search_paths可以设置)
used for JMeter components and plugins
jmeter只能找到.jar而不是.zip
执行java -jar时,设置的java环境变量classpath是不会起作用的,-jar就是牛
代理
jmeter -E https -H my.proxy.server -P 8000 -u username -a password -N localhost
HTTP Request Defaults和HTTP Request元件可以设置代理
CLI模式
jmeter -n -t my_test.jmx -l log.jtl -H my.proxy.server -P 8000
服务器模式
jmeter-server -H my.proxy.server -P 8000
server.exitaftertest = true可以设置在单个测试后退出服务器
CLI模式运行
jmeter -n -t testplan.jmx -r [-Gprop = val] [-Gglobal.properties] [-X]
jmeter命令行设置properties
jmeter -Duser.dir=/home/mstover/jmeter_stuff \ -Jremote_hosts=127.0.0.1 -Ljmeter.engine=DEBUG
jmeter -Ljmeter.engine = DEBUG jmeter -Lorg.apache.jmeter.engine = DEBUG jmeter -Lcom.example.foo = DEBUG jmeter -LDEBUG
log4j2.xml位于bin目录下
要将org.apache.http的日志级别调到debug,加上
<记录仪> <! - SNIP - >
<! - SNIP - > 记录器> 命令行和属性文件的处理顺序
- -p propfile
- jmeter.properties (or the file from the -p option) is then loaded
- -j logfile
- Logging is initialised
- user.properties is loaded
- system.properties is loaded
- all other command-line options are processed
使用模板创建测试计划
二、创建测试计划
完整的测试计划包括:one or more Thread Groups, logic controllers, sample generating controllers, listeners, timers, assertions, and configuration elements
"merge" "Save Selection As …" 右键选择这些选项,可以只加载/保存部分元件,而不用整个测试计划
再次强调!只能在调试测试计划时使用GUI模式,实际测试要使用CLI模式
stop和shutdown的区别。
stop:立即停止所有正在运行的线程 shutdown:等待当前正在运行线程结束后,停止所有线程
CLI模式,就使用bin目录下的stoptest[.cmd|.sh] or shutdown[.cmd|.sh]
jmeter.log记录了日志
三、测试计划的元件
最小的测试包括测试计划、线程组、采样器
Functional Test Mode,意思是说,在listener选择了保存文件的情况下,勾选上这个复选框,就会把返回数据保存到文件中去
可以在listener中点击Configure来选择保存的字段
所有控制器和采样器必须位于线程组下,而listener可以放在测试计划下,作用于所有线程组
线程组可以设置3项:the number of threads, the ramp-up period,the number of times to execute the test
线程组的Scheduler可以配置Startup Delay (seconds)和Duration (seconds)
采样器就是用来发请求的
HTTP Cookie Manager应该添加到所有的web测试中,否则jmeter将会忽略cookie
加载搜索,搜索“A”,加载搜索,搜索“B”,可以用Interleave Controller来实现
HTTP Request Defaults可以在多个http请求中共享同样的请求信息
HTTP采样器中需要共享的就留空
所有的listener都保存相同的数据,只是展示的不同而已
timers = time.sleep()
断言是适用于范围内的,如果要断言单个sampler,则需要添加为sampler的子级
执行顺序
有sampler才会执行Pre-Processors Timers Post-Processors Assertions
执行顺序示例
严格分层的元件:Listeners, Config Elements, Post-Processors, Pre-Processors, Assertions, Timers
有序的元件:controllers, samplers
Assertions Timers分层示例
更复杂的
四、创建测试计划-Web
- 使用测试计划的第一步就是,创建线程组
- Ramp-Up Period是指启动用户的总耗时,eg1:设置为0则立即启动所有用户,eg2:5个用户设置为5s则每1s启动1个用户
- HTTP Request Defaults不会发请求,只是设置默认值
- 如果有cookie,添加HTTP Cookie Manager就完事
- 测试计划的图标线程组的图标
五、创建测试计划-高级Web
这样就会把session id添加到每个请求中。
Path Extension:session id作为path一部分,用;分隔
Cache Session Id?:保存最后找到的session id,如果前一个http请求没有session id,那么就用缓存这个
- HTTP Header Manager和HTTP Cookie Manager一般都添加在线程组级别,也就是在线程组右键添加
六、创建测试计划-数据库
数据库驱动程序需要放到 ./lib 目录,如mysql-connector-java-XXX-bin.jar
JDBC Connection Configuration配置了数据库连接,JDBC Request是sql请求,二者通过Variable name bound to pool来绑定关联
七、创建测试计划-FTP
八、创建测试计划-LDAP、扩展LDAP
LDAP(Light Directory Access Portocol)轻量级目录访问协议
4个LDAP请求示例:http://jmeter.apache.org/usermanual/build-ldap-test-plan.html
9个LDAP请求示例,http://jmeter.apache.org/usermanual/build-ldapext-test-plan.html
九、创建测试计划-Webservice
- File → Templates…选择Building a SOAP Webservice Test Plan,按模板创建
- 添加路径,修改HTTP Header Manager
- http://jmeter.apache.org/usermanual/build-ws-test-plan.html
十、创建测试计划-JMS点对点
把jar放入JMeter的lib目录后,需要重启JMeter
Add → Listener → Graph Results
http://jmeter.apache.org/usermanual/build-jms-point-to-point-test-plan.html
十一、创建测试计划-JMS主题
- JMeter会自动保存在控制面板所做的更改
- http://jmeter.apache.org/usermanual/build-jms-topic-test-plan.html
十二、监听器
输出类型有树、表、图形、日志文件
csv文件比xml文件小得多,如果要生成大量数据,请使用csv
相对路径是相对于当前工作目录,默认为bin/目录
如果路径以“~/”开头(或jmeter.save.saveservice.base_prefix JMeter属性中的任何名称),则是相对于当前测试计划(jmx文件)所在目录的路径
如果仅希望记录某些样本,则将监听器添加为采样器的子节点。或者,可以使用“简单控制器”对一组采样器进行分组,然后向其添加“监听器”。多个采样器可以使用相同的文件名-但请确保它们都使用相同的配置!
jmeter.properties(或user.properties)可以配置默认保存项
jmeter.save.saveservice.output_format若设置为csv,那么default_delimiter要设置为逗号","
配置说明
#------------------------------------------------- -------------------------- #结果文件配置 #------------------- -------------------------------------------------- ------ #本部分有助于确定如何保存结果数据。 #注释掉的值是默认值。 #合法值:xml,csv,db。当前仅支持xml和csv。 #jmeter.save.saveservice.output_format = csv #应该保存字段时为true;否则为false #assertion_results_failure_message只影响CSV输出 #jmeter.save.saveservice.assertion_results_failure_message =真 # #合法值:无,首先,所有 #jmeter.save.saveservice.assertion_results =无 # #jmeter.save.saveservice.data_type = true #jmeter.save.saveservice.label = true #jmeter.save.saveservice.response_code = true #CSV输出当前不支持response_data #jmeter.save.saveservice.response_data = false #将ResponseData保存为失败的样本 #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 #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 #jmeter.save.saveservice.sent_bytes = true #jmeter.save.saveservice.url = false #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 #时间戳格式-仅影响CSV输出文件 #合法值:无,ms或适用于SimpleDateFormat的格式 #jmeter.save.saveservice.timestamp_format = ms #jmeter.save.saveservice.timestamp_format = yyyy / MM / dd HH:mm:ss.SSS #用于逗号分隔值(CSV)文件或其他格式 #字段'值由指定的分隔符分隔。 #默认值: #jmeter.save.saveservice.default_delimiter =, #对于TAB,由于JMeter 2.3可使用: #jmeter.save.saveservice.default_delimiter = \ t #仅适用于CSV格式文件: #将字段名称打印为第一行在CSV中 #jmeter.save.saveservice.print_field_names = true #JMeter变量名称的可选列表,其值将保存在结果数据文件中。 #使用逗号分隔名称。例如: #sample_variables = SESSION_ID,REFERENCE #NB当前的实现将XML值保存为属性, #因此名称必须是有效的XML名称。 #JMeter将变量发送到所有服务器 #以确保客户端上可获得正确的数据。 #文件 第2行的可选xml处理指令:#jmeter.save.saveservice.xml_pi = <?xml-stylesheet type =“ text / xsl” href =“ sample.xsl”?> #用于标识文件名的前缀相对于当前基准 #jmeter.save.saveservice.base_prefix =〜/ #用XML或CSV输出编写的每一行上的AutoFlush #设置为true可以减少测试结果数据丢失(如果发生崩溃) #但会影响性能,特别是对于密集测试(低暂停或无暂停) #从JMeter 2.10开始,默认情况下为假 #jmeter.save.saveservice.autoflush = false #将开始时间戳记记入日志,而不是结束 sampleresult .timestamp.start = true #是否使用System.nanoTime()-否则仅使用System.currentTimeMillis() #sampleresult.useNanoTime = true #使用后台线程计算nanoTime偏移量 #将此值设置为≤0 可禁用背景线程 #sampleresult.nanoThreadSleep = 5000
SimpleDateFormat:https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html
CLI模式下,-1 可以用于创建顶级监听器,一般用来为每次运行指定不同的数据和日志文件。因为默认是写入jmeter.log文件,所以如果要重命名,需要使用 -j
jmeter -n -t testplan.jmx -l testplan_01.jtl -j testplan_01.log jmeter -n -t testplan.jmx -l testplan_02.jtl -j testplan_02.log
为每次测试运行生成唯一的名称:log_file = 'jmeter_'yyyyMMddHHmmss'.tmp'
大多数监听器都会保留它们显示的样本的副本,除了
- Simple Data Writer
- BeanShell/JSR223 Listener
- Mailer Visualizer
- Monitor Results
- Summary Report
这2个使用的内存更少:
- Aggregate Report
- Aggregate Graph
如果需要保存大量数据,请使用Simple Data Writer + csv
csv,xml,sample attribute配置说明http://jmeter.apache.org/usermanual/listeners.html
可以使用Save_Responses_to_a_file,为每个样本生成一个新文件
为了正确解析无标题的csv文件,必须设置适当的jmeter属性
可以通过Edit → Save Node As Image把监听器保存为PNG文件
十三、远程测试
从单个JMeter客户端控制多个远程JMeter引擎
jmeter客户端的实例可以控制任意数量的远程jmeter实例
所有服务器都运行相同的测试计划,这意味着,如果设置了1000个线程,有6台jmeter服务器,那么将运行6000个线程
推荐将一台或多台计算机,与配置为运行jmeter engine的应用服务器,位于同一以太网段上,这将最大程度减少网络对测试结果的影响,而且不会影响应用服务器本身的性能
需确保多台服务器的jmeter和java版本完全相同
启动服务器组件
JMETER_HOME/bin/jmeter-server (unix) JMETER_HOME/bin/jmeter-server.bat (windows)
添加服务器ip
JMETER_HOME/bin/jmeter.properties remote_hosts
也可以通过-R来指定
jmeter -Rhost1,127.0.0.1,host2
通过新菜单来启动/停止
CLI模式启动远程
jmeter -n -t script.jmx -r # 从remote_hosts读取 jmeter -n -t script.jmx -R server1,server2,… # 指定
生成密钥的脚本,默认密码为'changeit'
bin/create-rmi-keystore.bat # windows bin/create-rmi-keystore.sh # unix
生成rmi_keystore.jks,复制到jmeter/bin目录或在server.rmi.ssl.keystore.file中引用它
默认情况下,jmeter使用标准rmi端口1099
处理启动失败的节点
client.tries client.retries_delay client.continue_on_fail = true
java有安全管理器概念,它会在执行潜在危险操作前(如解析主机名,创建或读取文件在OS中执行命令),被JVM询问,可以通过java.security.manager和java.security.policy来启用安全管理器
十四、Dashboard报表
dashboard是jmeter的模块化扩展,默认会从csv读取数据,生成html报告
提供的内容见http://jmeter.apache.org/usermanual/generating-dashboard.html
可以在reportgenerator.properties中找到相关属性,要自定义这些属性,需要复制到user.properties文件中并进行修改
所有属性必须以jmeter.reportgenerator开头,图属性必须以jmeter.reportgenerator.graph开头,导出属性必须以jmeter.reportgenerator.exporter开头
过滤机制是正则匹配的
生成报告的方式
CLI:
# 从现有csv文件生成报告 jmeter -g
-o # 测试结束后自动生成 jmeter -n -t -l -e -o GUI:
Tools → Generate HTML report
默认生成目录为${JMETER_HOME}/bin/report-output
报告生成超时设置generate_report_ui.generation_timeout
十五、实时结果
- 通过实现AbstractBackendListenerClient类,把实时结果发给后端
- 线程指标、响应时间指标
- 使用InfluxDBBackendListenerClient 添加一个BackendListener,使用CLI连接到InfluxDB
- 还可以配置Grafana
- http://jmeter.apache.org/usermanual/realtime-results.html
十六、最佳实践
使用最新版本,jmeter的性能一直在优化
合理的线程数,过多可以考虑分布式多台服务器
cookie manager的位置
authorization manager的位置
使用HTTP(S) Test Script Recorder
使用用户变量参数化
减少资源的建议,很重要
使用CLI模式 jmeter -n -t test.jmx -l test.jtl
去掉无用的监听器
实际运行测试时,去掉察看结果树,仅在调试时使用
太多相同的采样器,建议改成循环
不要使用功能模式
输出csv而不是xml
只保存需要的数据
尽可能少的断言
BeanShell服务器
vars.get()和vars.put(),访问jmeter变量,作用范围是线程内
线程间共享变量
方式1
import org.apache.jmeter.util.JMeterUtils; String value = JMeterUtils.getPropDefault("name",""); JMeterUtils.setProperty("name", "value");
方式2
if (bsh.shared.myObj == void){ // not yet defined, so create it: myObj = new AnyObject(); } bsh.shared.myObj.process();
CLI模式下可以通过属性来参数化变量
LOOPS=${__P(loops,10)} # 默认10 jmeter … -Jloops=12 … # 指定12
属性对于jmeter实例是全局的
修改属性时,不要修改jmeter.properties文件,而是从jmeter.properties中复制属性到user.properties,这样方便升级到下个版本时,直接拿来用
十七、帮帮忙!老板想让我给webapp做负载测试
- 需要思考:平均用户数、高峰用户数、压测时机、应用程序状态、测试目的
- 网络和应用资源
- 操作系统
十八、元件参考
- jdbc的sql不要输入分号
- 元件清单:http://jmeter.apache.org/usermanual/component_reference.html
十九、属性参考
- 重启jmeter,加载类时,才会解析属性
- 属性列表:http://jmeter.apache.org/usermanual/properties_reference.html
二十、函数
函数调用
${__functionName(var1,var2,var3)}
注意\转义参数中的逗号
jmeter会将${x}中x的空格自动删除
属性使用**__P** or **__property**函数引用
函数有2种,变量和内置函数
函数在线程之间共享
有些字段不允许随机字符串,它们需要数字,不接受函数
要注意${}两边的引号,比如接口参数、sql
函数名称以"**__**"开头
如果函数不带参数,可以省略括号,这操作666,跟编程语言有明显差异
查看变量的值,**__logn()**函数或Debug Sampler,还可以建一个包括变量引用的Java Request sampler,在listener中查看
自定义变量会覆盖同名的内置函数
The Function Helper Dialog
内置函数说明:http://jmeter.apache.org/usermanual/functions.html
预定义变量COOKIE_cookiename JMeterThread.last_sample_ok START
预定义属性START.MS START.YMD START.HMS TESTSTART.MS
二十一、正则表达式
添加Debug Sampler和Tree View Listener,可以用来测试正则
View Results Tree包含RegExp Tester
包含是指正则表达式是其中一部分,匹配是指全部匹配,例如alphabet包含ph.b.,匹配al.*t,注意alp|.lp.*是包含而不是匹配,因为alp包含后不会再继续寻找了
^表示非,一个例子
name="file" value="([^"]+)"> [^"]表示除"以外的任何
. 任何
+ 一个或多个
? 非贪婪
二十二、提示与技巧
jmeter的变量是线程作用域,要共享线程变量,一属性,二文件(Save Responses to a file或BeanShell写文件,HTTP Sampler "file:" protocol或BeanShell读)
调试日志选项
jmeter.loggerpanel.display = true
通过菜单的搜索,搜索树中元件
jmeter会为每个jmx备份10个文件在$ {JMETER_HOME} / backups,相关属性
jmeter.gui.action.save.backup_on_save = false jmeter.gui.action.save.backup_directory=/path/to/backups/dir jmeter.gui.action.save.keep_backup_max_hours=0 jmeter.gui.action.save.keep_backup_max_count=10
gui.quick_*属性用于设置键盘快捷键
版权申明:本文为博主原创文章,转载请保留原文链接及作者。