1、Jmeter入门

1. 安装

官方网站:http://jmeter.apache.org/

2. 快速入门

2.1 使用模板,通过"文件->Templates"即可使用Jmeter默认的模板进行生成计划
测试计划

测试计划 : Jmeter测试脚本的根节点

  • 用户定义的变量 : 可在此设置用户全局变量
  • 独立运行每个线程组 , 若计划中有多个线程组,设置此项可以生效, 不设置时每个线程组同时运行
  • Run teardown Thread Groups after shutdown of main threads , 关闭主线程后运行teardown 程序来正常关闭线程组
  • 函数测试模式, 在调试脚本的过程中,我们可能需要获取服务器返回的详情信息,就可以选择此项,会记录较多的数据,但会影响测试效率, 所以执行性能测试时请关闭此项
  • Add directory or jar to classpath , 把测试需要依赖的jar包或包所有的目录加入类路径. 但建议大家把依赖包加入%JMETER_HOME%\lib目录下.

测试计划Templates 中,默认生成三个配置元件.
分别是:用户定义的变量, HTTP请求默认值, HTTP Cookie管理器.
它们作用于全局

User Defined Variables
HTTP Request Defaults
HTTP Cookie Manager

IE访问Web页面时会记录Cookie信息,Jmeter通过加入HTTP Cookie Manager来自动记录Cookie信息, 属性选择默认即可

2.2 测试计划四要素:
  1. 脚本中测试计划只能有1个
  2. 测试计划中至少有一个线程组
  3. 至少要有一个取样器
  4. 至少要有一个监听器
2.3 添加线程组

通过"添加->Threads->线程组" 进行添加线程组

image.png

设置线程数属性,一线程即代表一用户,通过设置线程数即可模拟大量用户负载的情况
循环次数即单个线程循环执行的次数


线程属性设置
2.4 为线程组添加逻辑控制器
添加逻辑控制器

控制器分多种:事务控制器,如果控制器,循环控制器,简单控制器,随机控制器等.可根据需求进行组合应用.

2.5 为控制器添加cookie管理器和用户参数,方便后续的控制器进行调用
Cookie管理器

该控制器内的请求会共用该Cookie

用户参数

该控制器内所有请求,都可通过${参数名}的方式调用这些参数

2.6 为控制器添加一个取样器(Http 请求)
Http 请求

取样器也有多种,基础涵盖我们常见的各种协议,如Http,FTP,JAVA,JMS,LDAP,MAIL,MongoDB,SMTP,SOAP,TCP,Junit,还支持BeanShell脚本.我们这里使用最常用的HTTP 请求即可

2.7 编辑取样器(Http 请求)
编辑取样器

在该请求内,调用了全局用户自定义参数${web_ip},和web_port


HTTP请求
  • web服务器 : 指定Http 请求的主机地址, 不需要加上"http://" , Jmeter自动会加上, 普通 web服务器端口号默认是80, 邮箱端口一般是443
  • Timeouts : 指定超时时间 , 单位是毫秒.Connect指定连接超时时间, Resopnse 指定响应超时时间.
  • Content encoding : 默认iso8859
  • 路径 : 除去主机地址部分的访问链接
  • 跟随重定向 :
2.8 添加配置元件(请求信息头管理器)
添加Header管理器

为对应的请求添加Header信息

HTTP信息头管理器

管理Header信息, 如User-Agent, Content-Type , Accept , Referer, Cookie等

2.9 添加集合点,模拟多个请求同一时刻发送的场景
选择定时器
同步定时器

定时器有多个种类:同步定时器,固定定时器,随机定时器等,可根据业务需求进行选择.我们在这里使用Synchronizing Timer同步定时器

2.10 使用关联

在第一个Http Requst 中新建一个后置处理器(正则表达式提取器),在Response的值提取到变量中,提供给别的Http Request 使用.

后置处理器列表
正则表达式提取器

通过正则提取出来的值,赋值给了变量名为itemDealMoney

新建第二个Http 请求,请在参数中调用${itemDealMoney} 中的数据即可

image.png
2.11 添加断言

选择HTTP 请求, 右键 添加-> 断言-> 响应断言.

添加断言

在断言中添加 要测试的模式


添加断言响应
  • Apply to 应用范围
    • Main sample and sub-samples : 匹配范围包括当前父取样器并覆盖至子取样器
    • Main sample only : 匹配范围是当前父取样器
    • Sub-samples only : 仅匹配子取样器
    • Jmeter Variable : 支持对Jmeter变量值进行匹配
  • 要测试的响应字段
    • 响应文本 : 响应服务器返回的文本内容,HTTP排除Header部分
    • Document(text) : 对文档内容进行匹配
    • URL样本 : 匹配URL链接
    • 响应代码 : 匹配响应代码,如200
    • 响应信息 : 匹配响应信息, 如处理成功返回"OK"字样
    • Response Headers : 匹配响应中的头信息
    • Ignore Status : 一个请求有多个响应断言 , 其中一个响应断言选中此项,当第一个响应断言失败时可以忽略此响应结果,继续进行下一个断言,若下一断言成功,则还是可以判断事务成功.
  • 模式匹配规则
    • 包含 : 响应内容包括要匹配的内容,即代表响应成功
    • 匹配 : 响应内容要完全匹配需要匹配的内容,即代表响应成功,大小写不敏感,支持正则
    • Equals : 响应内容要完全匹配需要匹配的内容才代表响应成功,大小写敏感,需要匹配内容是字符串非正则
    • Substring : 响应内容包含需要匹配的内容才代表响应成功,大小写敏感,需要匹配内容是字符串非正则
    • 否 : 选择Equals 与Substring 的是字符串,大小写敏感,有时会响应rwmt,hx时可选择此项,会降低匹配级别,类似降到"包括","匹配"的级别,这样就可以响应成功.
  • 要测试的模式 :
    • 填入你需要匹配的字符串或正则表达式,注意要与模式匹配规则搭配好.
2.12 添加"断言结果" 查看 "断言" 执行的结果.

选中线程组右键 添加 -> 监听器-> 断言结果


断言结果
image.png
2.13 添加监听器(View Results Tree)查看运行结果
image.png
2.14 运行测试
运行测试

脚本就全部写好了, 运行下,看下最终结果


聚合报告
  • Label : 请求别名
  • Sample : 执行多少次取样
  • Average : 平均响应时间,单位毫秒
  • Median : 响应时间中间值
  • 90% Line : 90%事务响应时间范围
  • Min : 最小响应时间
  • Max : 最大响应时间
  • Error% : 出错率
  • Throughput : 吞吐量,可理解为TPS
  • KB/sec : 数据传输量,单位KS
Debug Sampler

通过Debug Sampler可以查看到脚本执行中,所以变量的值

3. Jmeter运行原理

Jmeter运行原理
控制机 : 运用多台Jmeter负载机进行性能测试时,被选中为管理机的那台机器即是控制机
负载机 : 向被测试应用服务器发起负载的机器

控制机发送指令启动线程->负载机运行脚本,回传状态(包括测试结果)->控制机收集结果并显示.
JMeter是以线程的方式运行的,通过线程组来驱动多线程运行测试脚本,对被测服务器发起负载,每一个负载机上都可以运行多个线程组。并且Jmeter不仅可以在GUI方式完成,还可以使用命令行,命令行的运行方式对于负载机的资源消耗会更新.

3.2 Jmeter元件运行顺序

(1) 配置元件
(2) 前置处理器
(3) 定时器
(4) 取样器
(5) 后置处理器
(6) 断言
(7) 监听器
脚本执行顺序容易引起混乱,所以在开发脚本过程中,可按照层级先后顺序来添加你的元件.

4. 基本功能介绍

4.1 Jmeter 函数助手
函数助手菜单
Random函数举例
  • Name of variable in which to store the result (optional) : 如果填了,则运行脚本后可以在Debug Sampler看到这个变量的值

5. Jmeter 配置代理进行录制

5.1 在浏览器配置代理
在浏览器配置代理
5.2 在Jmeter中配置代理
Jmeter中配置代理
HTTP代理服务器
  • 目标控制器 : 决定将来录制的脚本放在哪个目录
  • 分组 : 录制脚本时将会增加很多个节点, 通过它可以给这些节点分个组, 即可把一个URL看成一个组.
    点击启动, 然后在浏览器中浏览WEB页面,即可录制下这些HTTP请求.

6. Jmeter参数化

添加配置元件
CSV Data Set Config元件
  • Filename : 引用文件地址
  • File encoding : 读取参数文件的编码格式
  • Variable Names : 定义的参数名称
  • Delimiter : 用来分隔参数文件的分隔符
  • Allow quoted data? : 如果选择True, 则可允许拆分完成的参数里有分隔符出现
  • Recycle on EOF : 如果选择True, 则参数文件循环遍历,False参数文件遍历完成后不循环.
  • Stop thread on EOF : 和Recycle on EOF的False选择复用;True停止测试,False不停止测试
  • Sharing mode : 参数的三种共享模式, All threads , Current thread group , Current thread.

7. 非GUI运行测试

#方式1
java -jar %JMETER_HOME%\bin\ApacheJMETER.jar -n -t %JMETER_HOME%\script\Jforum4-1-01.jmx -r -l result.jtl

#方式2
%JMETER_HOME%\bin\jmeter -n -t %JMETER_HOME%\script\Jforum4-1-01.jmx -l %JMETER_HOME%\result\results.jtl

把jtl文件转成测试报告

#第一种:在测试过程中将jtl转成测试报告(在jmeter的bin目录下执行)
./jmeter -n -t xxx.jmx -r -l xxx.jtl -e -o /home/tester/apache-jmeter-3.0/resultReport
    -n : 非GUI 模式执行JMeter
    -t : 指定运行的测试脚本地址与名称,可是相对路径或绝对路径
    -r : 远程将所有agent启动用在分布式测试场景下,不是分布式测试只是单点就不需要-r
    -l : 指定生成测试结果的保存文件, jtl 文件格式
    -e : 测试结束后,生成测试报告
    -o : 指定测试报告的存放位置
    -o 指定的文件及文件夹,必须不存在 ,否则执行会失败,对应上面的命令就是resultReport文件夹必须不存在否则报错

#第二种:使用之前的测试结果,生成测试报告
./jmeter -g xxx.jtl -e -o /home/tester/apache-jmeter-3.0/resultReport

性能参数配置

#打开 %JEMETER_HOME%\bin\jmeter.bat
rem including some tuning recommendations
set HEAP=-Xms512m -Xmx1024m   #设置JVM初始堆大小和最大堆大小
set NEW=-XX:NewSize=128m -XX:MaxNewSize=512m  #设置青年代大小
set SURVIVOR=-XX:SurvivorRatio=8 -XX:TargetSurvivorRatio=50%
set TENURING=-XX:MaxTenuringThreshold=2

使用Ant建立构建文件

<?xml version="1.0" encoding="UTF-8"?>

<project name="ant-jmeter-test" default="run" basedir=".">
    <tstamp>
        <format property="time" pattern="yyyyMMddhhmm" />
    </tstamp>
    <!-- 需要改成自己本地的 Jmeter 目录-->  
    <property name="jmeter.home" value="/usr/local/jmeter" />
    <!-- jmeter生成jtl格式的结果报告的路径--> 
    <property name="jmeter.result.jtl.dir" value="/home/htdocs/t8891/report/jtl" />
    <!-- jmeter生成html格式的结果报告的路径-->
    <property name="jmeter.result.html.dir" value="/home/htdocs/t8891/report/html" />
    <!-- 生成的报告的前缀-->  
    <property name="ReportName" value="TestReport" />
    <property name="jmeter.result.jtlName" value="${jmeter.result.jtl.dir}/${ReportName}.jtl" />
    <property name="jmeter.result.htmlName" value="${jmeter.result.html.dir}/${ReportName}.html" />
    
    <target name="run">
        <antcall target="test" />
        <antcall target="report" />
    </target>
    
    <target name="test">
        <taskdef name="jmeter" classname="org.programmerplanet.ant.taskdefs.jmeter.JMeterTask" />
        <jmeter jmeterhome="${jmeter.home}" resultlog="${jmeter.result.jtlName}">
             <!-- 声明要运行的脚本。"*.jmx"指包含此目录下的所有jmeter脚本-->
            <testplans dir="/home/htdocs/t8891" includes="App20180508.jmx" />

             <property name="jmeter.save.saveservice.output_format" value="xml"/>
        </jmeter>
    </target>
    
     <path id="xslt.classpath">
        <fileset dir="${jmeter.home}/lib" includes="xalan*.jar"/>
        <fileset dir="${jmeter.home}/lib" includes="serializer*.jar"/>
     </path>
        
    <target name="report">
        <tstamp> <format property="report.datestamp" pattern="yyyy/MM/dd HH:mm" /></tstamp>    
        <xslt               
              classpathref="xslt.classpath"
              force="true"
              
              in="${jmeter.result.jtlName}"
              out="${jmeter.result.htmlName}"
              style="${jmeter.home}/extras/jmeter-results-report_21.xsl">
              <param name="dateReport" expression="${report.datestamp}"/>
        </xslt>
        
        <!-- 因为上面生成报告的时候,不会将相关的图片也一起拷贝至目标目录,所以,需要手动拷贝 --> 
        <copy todir="${jmeter.result.html.dir}">
            <fileset dir="${jmeter.home}/extras">
                <include name="collapse.png" />
                <include name="expand.png" />
            </fileset>
        </copy>
    </target>    
    
</project>

Ant采用XML格式来建立 构建文件,默认名为build.xml.在脚本目录,使用以下命令:

ant run
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,110评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,443评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,474评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,881评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,902评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,698评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,418评论 3 419
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,332评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,796评论 1 316
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,968评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,110评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,792评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,455评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,003评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,130评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,348评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,047评论 2 355