点读系列《jmeter官方用户手册》

北城以北 提交于 2019-12-03 12:01:15

官网:http://jmeter.apache.org/usermanual/

说明:十八元件、十九属性、二十函数,涉及清单内容暂未仔细阅读,个人觉得一是仅供使用参考,二是适合单独写文章来解读

一、让我们开始吧

  1. 千万不要在GUI模式下来做负载测试,要用CLI模式

  2. jmeter不带jdbc驱动程序,如果使用jdbc,就需要去网上下载,然后添加到classpath

  3. jmeter是100%的java应用程序

  4. 在jmeter的classpath中添加加密包,更新system.properties来注册ssl支持

  5. jmeter http默认协议级别为TLS,可以编辑修改:jmeter.properties或user.properties的https.default.protocol

  6. 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
  7. bin目录

    1567871093004

  8. 可以在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"
  9. 可以配置环境变量

    1567871133296

  10. 可以在启动jmeter直接指定环境变量

    JVM_ARGS="-Xms1024m -Xmx1024m" jmeter -t test.jmx [etc.]
  11. 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

  12. jmeter只能找到.jar而不是.zip

  13. 执行java -jar时,设置的java环境变量classpath是不会起作用的,-jar就是牛

  14. 代理

    jmeter -E https -H my.proxy.server -P 8000 -u username -a password -N localhost

    1567871176828

  15. HTTP Request Defaults和HTTP Request元件可以设置代理

  16. CLI模式

    jmeter -n -t my_test.jmx -l log.jtl -H my.proxy.server -P 8000

    1567871207765

  17. 服务器模式

    jmeter-server -H my.proxy.server -P 8000

    1567871231625

    server.exitaftertest = true可以设置在单个测试后退出服务器

    CLI模式运行

    jmeter -n -t testplan.jmx -r [-Gprop = val] [-Gglobal.properties] [-X]

    1567871254750

  18. jmeter命令行设置properties

    jmeter -Duser.dir=/home/mstover/jmeter_stuff \
        -Jremote_hosts=127.0.0.1 -Ljmeter.engine=DEBUG

    1567871309683

    jmeter -Ljmeter.engine = DEBUG
    jmeter -Lorg.apache.jmeter.engine = DEBUG
    jmeter -Lcom.example.foo = DEBUG
    jmeter -LDEBUG

    1567871330265

  19. log4j2.xml位于bin目录下

  20. 要将org.apache.http的日志级别调到debug,加上

    <记录仪>
        <! -  SNIP  - >
        <Logger name =“org.apache.http”level =“debug”/>
        <! -  SNIP  - >
      </记录器>
  21. 命令行和属性文件的处理顺序

    1. -p propfile
    2. jmeter.properties (or the file from the -p option) is then loaded
    3. -j logfile
    4. Logging is initialised
    5. user.properties is loaded
    6. system.properties is loaded
    7. all other command-line options are processed
  22. 使用模板创建测试计划

    image-20190907211241972

image-20190907211347974

二、创建测试计划

  1. 完整的测试计划包括:one or more Thread Groups, logic controllers, sample generating controllers, listeners, timers, assertions, and configuration elements

  2. "merge" "Save Selection As …" 右键选择这些选项,可以只加载/保存部分元件,而不用整个测试计划

  3. 再次强调!只能在调试测试计划时使用GUI模式,实际测试要使用CLI模式

  4. stop和shutdown的区别。

    stop:立即停止所有正在运行的线程
    shutdown:等待当前正在运行线程结束后,停止所有线程
  5. CLI模式,就使用bin目录下的stoptest[.cmd|.sh] or shutdown[.cmd|.sh]

  6. jmeter.log记录了日志

三、测试计划的元件

  1. 最小的测试包括测试计划、线程组、采样器

  2. Functional Test Mode,意思是说,在listener选择了保存文件的情况下,勾选上这个复选框,就会把返回数据保存到文件中去

    image-20190916170551524

  3. 可以在listener中点击Configure来选择保存的字段

    image-20190916194605397

  4. 所有控制器和采样器必须位于线程组下,而listener可以放在测试计划下,作用于所有线程组

  5. 线程组可以设置3项:the number of threads, the ramp-up period,the number of times to execute the test

  6. 线程组的Scheduler可以配置Startup Delay (seconds)Duration (seconds)

  7. 采样器就是用来发请求的

  8. HTTP Cookie Manager应该添加到所有的web测试中,否则jmeter将会忽略cookie

  9. 加载搜索,搜索“A”,加载搜索,搜索“B”,可以用Interleave Controller来实现

    image-20190917192759353

  10. HTTP Request Defaults可以在多个http请求中共享同样的请求信息

    image-20190917193421069

    HTTP采样器中需要共享的就留空

  11. 所有的listener都保存相同的数据,只是展示的不同而已

  12. timers = time.sleep()

  13. 断言是适用于范围内的,如果要断言单个sampler,则需要添加为sampler的子级

  14. 执行顺序

    image-20190917203202238

  15. 有sampler才会执行Pre-Processors Timers Post-Processors Assertions

  16. 执行顺序示例

    image-20190917203536643

  17. 严格分层的元件:Listeners, Config Elements, Post-Processors, Pre-Processors, Assertions, Timers

    有序的元件:controllers, samplers

  18. Assertions Timers分层示例

    image-20190917204529361

    更复杂的

image-20190917204712518

  1. 变量和属性都区分大小写

  2. 如果线程更新变量,则仅更改变量的线程副本

  3. 使用属性来定义变量的值

    image-20190918084028316

四、创建测试计划-Web

  1. 使用测试计划的第一步就是,创建线程组
  2. Ramp-Up Period是指启动用户的总耗时,eg1:设置为0则立即启动所有用户,eg2:5个用户设置为5s则每1s启动1个用户
  3. HTTP Request Defaults不会发请求,只是设置默认值
  4. 如果有cookie,添加HTTP Cookie Manager就完事
  5. 测试计划的图标image-20190919113305968线程组的图标image-20190919113243822

五、创建测试计划-高级Web

  1. 在不能确定浏览器是否支持Cookie的情况下,采用url重写来传session id

  2. jmeter可以用HTTP URL Re-writing Modifier来支持

    img

Figure 2 - Request parameters

​ 这样就会把session id添加到每个请求中。

​ Path Extension:session id作为path一部分,用;分隔

​ Cache Session Id?:保存最后找到的session id,如果前一个http请求没有session id,那么就用缓存这个

  1. HTTP Header Manager和HTTP Cookie Manager一般都添加在线程组级别,也就是在线程组右键添加

六、创建测试计划-数据库

  1. 数据库驱动程序需要放到 ./lib 目录,如mysql-connector-java-XXX-bin.jar

  2. JDBC Connection Configuration配置了数据库连接,JDBC Request是sql请求,二者通过Variable name bound to pool来绑定关联

    Figure 6.3. JDBC Configuration

Figure 6.5. JDBC Request for the first SQL request

七、创建测试计划-FTP

  1. FTP Request Defaults也是用来设置默认值的

  2. 示例

    Figure 7.4. FTP Defaults for our Test Plan

Figure 7.5. FTP Request for file1

Figure 7.6. FTP Request for file2

Figure 7.7. View Results in Table Listener

八、创建测试计划-LDAP、扩展LDAP

  1. LDAP(Light Directory Access Portocol)轻量级目录访问协议

  2. 4个LDAP请求示例:http://jmeter.apache.org/usermanual/build-ldap-test-plan.html

    image-20190923085706126

  3. 9个LDAP请求示例,http://jmeter.apache.org/usermanual/build-ldapext-test-plan.html

image-20190923085528431

九、创建测试计划-Webservice

  1. FileTemplates…选择Building a SOAP Webservice Test Plan,按模板创建
  2. 添加路径,修改HTTP Header Manager
  3. http://jmeter.apache.org/usermanual/build-ws-test-plan.html

十、创建测试计划-JMS点对点

  1. 把jar放入JMeter的lib目录后,需要重启JMeter

  2. AddListenerGraph Results

    Figure 10.2. Graph Results Listener

  3. http://jmeter.apache.org/usermanual/build-jms-point-to-point-test-plan.html

十一、创建测试计划-JMS主题

  1. JMeter会自动保存在控制面板所做的更改
  2. http://jmeter.apache.org/usermanual/build-jms-topic-test-plan.html

十二、监听器

  1. 输出类型有树、表、图形、日志文件

  2. csv文件比xml文件小得多,如果要生成大量数据,请使用csv

  3. 相对路径是相对于当前工作目录,默认为bin/目录

  4. 如果路径以“~/”开头(或jmeter.save.saveservice.base_prefix JMeter属性中的任何名称),则是相对于当前测试计划(jmx文件)所在目录的路径

  5. 如果仅希望记录某些样本,则将监听器添加为采样器的子节点。或者,可以使用“简单控制器”对一组采样器进行分组,然后向其添加“监听器”。多个采样器可以使用相同的文件名-但请确保它们都使用相同的配置!

  6. jmeter.properties(或user.properties)可以配置默认保存项

  7. jmeter.save.saveservice.output_format若设置为csv,那么default_delimiter要设置为逗号","

  8. 配置说明

    #------------------------------------------------- -------------------------- 
    #结果文件配置
    #------------------- -------------------------------------------------- ------ 
    
    #本部分有助于确定如何保存结果数据。
    #注释掉的值是默认值。
    
    #合法值: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
  9. SimpleDateFormat:https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html

  10. 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
  11. 为每次测试运行生成唯一的名称:log_file = 'jmeter_'yyyyMMddHHmmss'.tmp'

  12. 大多数监听器都会保留它们显示的样本的副本,除了

    • Simple Data Writer
    • BeanShell/JSR223 Listener
    • Mailer Visualizer
    • Monitor Results
    • Summary Report

    这2个使用的内存更少:

    • Aggregate Report
    • Aggregate Graph

    如果需要保存大量数据,请使用Simple Data Writer + csv

  13. csv,xml,sample attribute配置说明http://jmeter.apache.org/usermanual/listeners.html

  14. 可以使用Save_Responses_to_a_file,为每个样本生成一个新文件

  15. 为了正确解析无标题的csv文件,必须设置适当的jmeter属性

  16. 可以通过EditSave Node As Image把监听器保存为PNG文件

    Figure 1 -

十三、远程测试

  1. 从单个JMeter客户端控制多个远程JMeter引擎

  2. jmeter客户端的实例可以控制任意数量的远程jmeter实例

  3. 所有服务器都运行相同的测试计划,这意味着,如果设置了1000个线程,有6台jmeter服务器,那么将运行6000个线程

  4. 推荐将一台或多台计算机,与配置为运行jmeter engine的应用服务器,位于同一以太网段上,这将最大程度减少网络对测试结果的影响,而且不会影响应用服务器本身的性能

  5. 需确保多台服务器的jmeter和java版本完全相同

  6. 启动服务器组件

    JMETER_HOME/bin/jmeter-server (unix)
    JMETER_HOME/bin/jmeter-server.bat (windows) 
  7. 添加服务器ip

    JMETER_HOME/bin/jmeter.properties
    remote_hosts

    也可以通过-R来指定

    jmeter -Rhost1,127.0.0.1,host2
  8. 通过新菜单来启动/停止

    图1-运行菜单

  9. CLI模式启动远程

    jmeter -n -t script.jmx -r  # 从remote_hosts读取
    jmeter -n -t script.jmx -R server1,server2,…  # 指定
  10. 生成密钥的脚本,默认密码为'changeit'

    bin/create-rmi-keystore.bat  # windows
    bin/create-rmi-keystore.sh  # unix

    生成rmi_keystore.jks,复制到jmeter/bin目录或在server.rmi.ssl.keystore.file中引用它

  11. 默认情况下,jmeter使用标准rmi端口1099

  12. 处理启动失败的节点

    client.tries
    client.retries_delay
    client.continue_on_fail = true
  13. java有安全管理器概念,它会在执行潜在危险操作前(如解析主机名,创建或读取文件在OS中执行命令),被JVM询问,可以通过java.security.managerjava.security.policy来启用安全管理器

十四、Dashboard报表

  1. dashboard是jmeter的模块化扩展,默认会从csv读取数据,生成html报告

  2. 提供的内容见http://jmeter.apache.org/usermanual/generating-dashboard.html

  3. 可以在reportgenerator.properties中找到相关属性,要自定义这些属性,需要复制到user.properties文件中并进行修改

  4. 所有属性必须以jmeter.reportgenerator开头,图属性必须以jmeter.reportgenerator.graph开头,导出属性必须以jmeter.reportgenerator.exporter开头

  5. 过滤机制是正则匹配的

  6. 生成报告的方式

    CLI:

    # 从现有csv文件生成报告
    jmeter -g <log file> -o <Path to output folder>
    # 测试结束后自动生成
    jmeter -n -t <test JMX file> -l <test log file> -e -o <Path to output folder>

    GUI:

    Tools → Generate HTML report

    Figure 14.1. HTML Report Dialog Menu

  7. 默认生成目录为${JMETER_HOME}/bin/report-output

  8. 报告生成超时设置generate_report_ui.generation_timeout

十五、实时结果

  1. 通过实现AbstractBackendListenerClient类,把实时结果发给后端
  2. 线程指标、响应时间指标
  3. 使用InfluxDBBackendListenerClient 添加一个BackendListener,使用CLI连接到InfluxDB
  4. 还可以配置Grafana
  5. http://jmeter.apache.org/usermanual/realtime-results.html

十六、最佳实践

  1. 使用最新版本,jmeter的性能一直在优化

  2. 合理的线程数,过多可以考虑分布式多台服务器

  3. cookie manager的位置

  4. authorization manager的位置

  5. 使用HTTP(S) Test Script Recorder

  6. 使用用户变量参数化

  7. 减少资源的建议,很重要

    使用CLI模式 jmeter -n -t test.jmx -l test.jtl

    去掉无用的监听器

    实际运行测试时,去掉察看结果树,仅在调试时使用

    太多相同的采样器,建议改成循环

    不要使用功能模式

    输出csv而不是xml

    只保存需要的数据

    尽可能少的断言

  8. BeanShell服务器

  9. vars.get()和vars.put(),访问jmeter变量,作用范围是线程内

  10. 线程间共享变量

    方式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();
  11. CLI模式下可以通过属性来参数化变量

    LOOPS=${__P(loops,10)}  # 默认10
    jmeter … -Jloops=12 …  # 指定12
  12. 属性对于jmeter实例是全局的

  13. 修改属性时,不要修改jmeter.properties文件,而是从jmeter.properties中复制属性到user.properties,这样方便升级到下个版本时,直接拿来用

十七、帮帮忙!老板想让我给webapp做负载测试

  1. 需要思考:平均用户数、高峰用户数、压测时机、应用程序状态、测试目的
  2. 网络和应用资源
  3. 操作系统

十八、元件参考

  1. jdbc的sql不要输入分号
  2. 元件清单:http://jmeter.apache.org/usermanual/component_reference.html

十九、属性参考

  1. 重启jmeter,加载类时,才会解析属性
  2. 属性列表:http://jmeter.apache.org/usermanual/properties_reference.html

二十、函数

  1. 函数调用

    ${__functionName(var1,var2,var3)}
  2. 注意\转义参数中的逗号

  3. jmeter会将${x}中x的空格自动删除

  4. 属性使用**__P** or **__property**函数引用

  5. 函数有2种,变量和内置函数

  6. 函数在线程之间共享

  7. 有些字段不允许随机字符串,它们需要数字,不接受函数

  8. 要注意${}两边的引号,比如接口参数、sql

  9. 函数名称以"**__**"开头

  10. 如果函数不带参数,可以省略括号,这操作666,跟编程语言有明显差异

  11. 查看变量的值,**__logn()**函数或Debug Sampler,还可以建一个包括变量引用的Java Request sampler,在listener中查看

  12. 自定义变量会覆盖同名的内置函数

  13. The Function Helper Dialog

  14. 内置函数说明:http://jmeter.apache.org/usermanual/functions.html

  15. 预定义变量COOKIE_cookiename JMeterThread.last_sample_ok START

  16. 预定义属性START.MS START.YMD START.HMS TESTSTART.MS

二十一、正则表达式

  1. 添加Debug Sampler和Tree View Listener,可以用来测试正则

  2. View Results Tree包含RegExp Tester

  3. 包含是指正则表达式是其中一部分,匹配是指全部匹配,例如alphabet包含ph.b.,匹配al.*t,注意alp|.lp.*是包含而不是匹配,因为alp包含后不会再继续寻找了

  4. ^表示非,一个例子

    name="file" value="([^"]+)">
    [^"]表示除"以外的任何
  5. . 任何

    + 一个或多个

    ? 非贪婪

二十二、提示与技巧

  1. jmeter的变量是线程作用域,要共享线程变量,一属性,二文件(Save Responses to a file或BeanShell写文件,HTTP Sampler "file:" protocol或BeanShell读)

  2. 调试日志选项

    jmeter.loggerpanel.display = true
  3. 通过菜单的搜索,搜索树中元件

  4. 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
  5. gui.quick_*属性用于设置键盘快捷键

版权申明:本文为博主原创文章,转载请保留原文链接及作者。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!