v Jmeter是什么
- Apache Jmeter是Apache组织开发的基于Java的压力测试工具。
- Jmeter可以用于对服务器、网络或对象模拟巨大的负载,来自不同压力类别下测试它们的强度和分析整体性能。另外,Jmeter能够对应用程序做功能、回归测试,通过创建带有断言的脚本来验证你的程序返回了你期望的结果。为了最大程度的灵活性,Jmeter允许使用正则表达式创建断言。
v Jmeter的特点
- 能够对HTTP和FTP服务器进行压力和性能测试,也可以对任何数据库进行同样的测试(通过JDBC),即支持多协议
web:HTTP HTTPS
数据库:JDBC
Mail:POP3 SMTP IMAP
FTP
LDAP
TCP
面向消息的中间件:JMS
- 完全的可移植性和100%纯JAVA,带有图形界面
- 开源应用程序
- 可以模拟多用户,进行并发负载测试
- 5>数据分析和可视化插件提供了很好的可扩展性以及个性化,测试结果可视化:图形、表格、树形、报告等
- 完全多线程框架允许通过多个线程并发取样和通过单独的线性组对不同的功能同时取样
- 具有提供动态输入到测试的功能
- 各种负载统计表和可链接的计时器可供选择
v Jmeter环境搭建
- jmeter安装运行的前置条件是安装JDK
- 1>安装JDK,默认安装路径:C:\PrograMFiles\Java\jdk1.8.0_92
- 2>配置环境变量
l JAVA_HOME C:\PrograM Files\Java\jdk1.8.0_92
l PATH C:\PrograMFiles\Java\jdk1.8.0_92\bin
- 3>测试运行
l 打开cMd,运行java –version,能出现信息输出打印环境就成功了
v JMeter安装
- 版本目前更新至5.1,我下载的是5.0版本的,需要其他版本可以到官网下载
- 官网地址: http://jmeter.apache.org/download_jmeter.cgi
- 下载之后解压即可
v JMeter运行和语言设置
运行有两种方式
1>直接命令行运行,进入bin目录运行jmeter.bat启动jMeter
2>直接双击jmeter.bat启动
启动成功之后命令行和图形界面窗口同时出现,不要关闭命令行窗口
打开之后,切换语言,有两种方法
1>
2>
v 工作原理
v jmeter和LoadRunner对比
v Jmeter目录组成
Bin目录是可执行文件,Jmeter.bat windows操作系统下启动,(Jmeter.sh linux操作系统下启动)里面可以设置jvm参数
- 根据经验,heap(堆内存)最多设置为物理内存的一半,默认设置为512M,如果heap超过物理内存的一半,可能运行jmeter会慢,甚至出现内存溢出
- Jmeter的log在jmeter.log中查看
- Jmeter.properties(配置文件)文件中有一个属性是log_level.jmeter。可以设置改变日志详细度。默认是info,可改为debug
- Docs下是jmeter的java.docs
- 常用的是Printable_docs的usermanual子目录下是jmeter用户手册,其中component_reference.html是最常用的核心元件帮助手册
- Extras目录下的文件提供了对ant的支持,可以利用ant来实现自动化,例如批量执行脚本,产生html报告等,运行jmeter的时候会产生一个jtl文件,把它放到extras目录下,运行ant.Dtest=文件名report就可以生成测试统计报表
- Lib目录下的ext子目录是jmeter的核心jar包;junit子目录是放junit脚本的。用户扩展所依赖的包直接放到lib下即可,不需要放到lib/ext下
v Jmeter的操作术语
1>测试计划:用来描述一个性能测试,所有内容都是基于这个计划的
2>
一般常用线程组:可以理解为虚拟用户组
setup线程组(设置):可用于执行预测试操作,这些线程的行为完全像一个正常的线程组元件
teardown线程组(拆卸):可用于执行测试后操作,这些线程的行为完全像一个正常的线程组元件
3>
取样器:取样器是jmeter测试脚本的基础单元,用户可以用它来向服务器发出一个特定的请求,取样器会在超时前等待服务器的响应
4>
逻辑控制器:用户通过逻辑控制器来控制jmeter测试脚本的执行顺序,以便测试能够按照用户期望的顺序和逻辑执行
5>
监听器:监听器用来收集测试结果信息,并以用户指定的方式展示出来
6>
配置元件:配置元件被用来设置一些jmeter测试脚本公用的信息
7>
断言:断言被用来验证服务器实际返回的信息与用户期望的情况是否相符
8>
定时器:定时器被用来保存jmeter测试脚本与时间相关的一些信息
- 采样器(Samplers):采样器是jmeter测试脚本的基础单元,用户可以用它来向服务器发出一个特定的请求,采样器会在超时前等待服务器的响应。
- 逻辑控制器(Logic Controllers):用户通过逻辑控制器来控制jmeter测试脚本的执行顺序,以便测试能够按照用户期望的顺序和逻辑执行。
- 监听器(Listeners):监听器被用来手机测试结果信息,并以用户指定的方式加以展示。
- 配置元件(Configuration Elements):配置元件被用来设置一些jmeter测试脚本公用的信息。
- 断言(Assertions):断言被用来验证服务器实际返回信息与用户期望的情况是否相符。
- 定时器(Timers):定时器被用来保存jmeter测试脚本与时间相关的一些信息,例如思考时间(Think Time)。
- 前置处理器(Pre-Processors):在前置处理器的作用范围内,任何采样器被执行前,都要先执行前置处理器。
- 后置处理器(Post-Processors):在后置处理器的作用范围内,任何采样器被执行后,都要执行对应的后置处理器。
- 测试计划(Test Plan):测试计划是jmeter测试脚本的根节点,关于整个测试脚本的一些基础设置,可以在测试计划中设定,例如用户定义变量。
- 线程组(Thread Group):线程组定义了一个虚拟用户池,其中每一个虚拟用户都使用同样的测试脚本。
- 工作台(WorkBench):工作台被用来保存暂时不使用的测试元素,当测试人员保存测试计划时,工作台中的内容不会被一起保存。
v Jmeter的两种录制脚本方法
录制方法一:badboy(推荐)
1.概念:badboy本身是一个独立的自动化功能或性能测试工具,可以进行脚本录制,导出的文件可以导入jmeter使用,所以一般两个搭配起来使用,它能够添加断言,对脚本进行调试
2.下载地址:http://www.badboy.com.au/download/add
双击安装,默认安装路径:C:\Program Files (x86)\Badboy,点击badboy.exe打开工具
3.页面功能分析
1>界面视图,模拟浏览器,能够进行操作
2>需要录制脚本的url
3>点击运行url
4>概要:运行的各项数据
5>参数:在录制到需要参数化的地方能够在这里操作之后导入jmeter
6>目录树:记录录制到的每一个操作
7>录制按钮:点击之后开始进行录制操作
8>停止按钮:停止录制
9>回放按钮
10>回放所有
11>倒回按钮,退回到前一步操作
12>单独运行一个请求
4.执行步骤:
1>打开badboy工具,点击录制按钮(红色圆圈),在地址栏输入被测试的项目的地址,即url
2>录制完成后,点击结束录制按钮(录制按钮后面的黑色方框),点击文件—Export to Jmeter...
3>打开jmeter工具,选择文件—打开,选择刚才保存的文件(.jmx类型),导入文件
4>演示录制gogomall.com
录制方法二:代理
操作步骤:
1.创建一个线程组(右键点击“测试计划”-“添加”-“线程组”)
2.添加HTTP代理服务器(右键点击“工作台”-“添加”-“非测试元件”-“HTTP代理服务器”)
3.代理服务器端口,默认8888,可以修改,不与其他应用端口冲突即可
4.目标控制器:录制的脚本存放的位置,可选择项为测试计划中的线程组,自己选择即可
5.分组:对请求进行分组
分组是将一批请求汇总分组,可以把url请求理解为组
1>不对样本分组:所有请求全部罗列
2>在组间添加间隔:加入一个虚拟的以分割线命名的动作,运行同【不对样本分组】,无实际意义
3>每个组放入一个新的控制器:执行时按控制器输入结果
4>只存储每个组的第一个样本:对于一次url请求,实际很多次http请求的情况
6.点击启动(最下面启动按钮)
注:要用代理服务器需要配置
打开IE浏览器——点击工具——Internet选项——Internet属性——连接——局域网设置——勾选代理服务器——输入地址(如是本机输入localhost)——输入端口号(与jmeter设置的代理端口号一致)
6.点击jmeter的启动按钮,打开IE浏览器输入需要录制的url地址,jmeter会自动记录所访问的页面
7.录制完成之后,点击jmeter的停止按钮(最下面)
注意:录制完成后,把IE浏览器中的局域网设置关掉
这种方法录制下来一些资源加载的也会显示,比较杂,所以一般还是推荐用badboy来录制导入
在使用 JMeter 做性能测试时,我们可以使用 Badboy 工具协助录制测试脚本,但录制脚本时经常会提示“当前页面的脚本发生错误”的错误信息,如下图。
这个时候我们要去设置一下 Badboy ,让 Badboy 在录制脚本时自动处理 javascript 错误。
点击Preferences,点击Playing,勾选了javascript Error Dialogs 错误对话框"选项,点击确定,再次用 Badboy 录制脚本时就不会提示上面的错误了。
v Badbaby使用
Badboy按钮功能讲解
默认情况下,badboy在双击打开的时候就自动开启录制,不过我们最好在一切准备工作就绪后再开始进行录制脚本,这时候需要我们快捷键Ctrl+Shift+P:
1.Badboby检查点
检查点就是记录被测系统某个值的预期结果
以百度搜索人人网为例子
1>录制脚本
2>鼠标选中输入框中的内容(要检查的内容),点击Tools-Add Assertion for Selection,左侧添加了一行,图标为问号
3>点击回放所有
4>新添加的一行图标变为了对勾,表示成功,如果是×,则表示没有找到改检查点
2.参数化
1.可选择www.sogou.com 或 https://www.google.com.hk/ 链接作实验,这里以www.sogou.com 为实例讲解
2.点击红色按钮,开启录制(默认是开启的),然后在地址栏输入www.sogou.com ,点击回车
3.输入要搜索的东西,如名字:张三,点击搜索
4.做数据处理,添加断言即检查点,选中搜索框中的张三,然后Tools-> Add Assertion For Selection
5.页面展开搜索结果后,停止录制,展开脚本树
6.点击Variable 标签, 空白处右击,点击Add Variable,输入参数化的名字和要搜索的内容,点击ok
7.输入任意变量名,如:“搜索词”,由于这个用例是测有效类,那么我们加入有效测试数据,如张三、李四等;然后点击OK即可
8.右击脚本树中的ie ,选择Properties,修改成gbk;
右击脚本树中的query,选择Properties,修改成${搜索词},将Value绑定参数搜索词;
check for text参数化
9.观察脚本树的变化,query的值已经被参数化
10.双击Step 1 , 或右击选择Properties,此时查看脚本树的变化。
更改回放次数,选择step,右键,选择properties ,勾选for each value of vari,点击确定按钮
11.选择Step 1 ,运行脚本
1>建立参数化列表
点击Variables标签,空白处右击,点击Add Variable,输入参数化的名字和要搜索的内容,点击ok
2>在请求中替换${参数名称}
找到实际发请求的参数,右键,properties
找到关键字请求,点击前面的加号打开列表,找到要替换的关键字(如上次搜索内容为badboby),右击,点击properties,将value的值替换成参数化列表中的名字,如${searchtxt},点击确定,如是中文会出现乱码,把ie=utf8改成gbk.
3>更改回放次数,选择step,右键,选择properties ,勾选for each value of vari,点击确定按钮。
4>进行回放
5>如果是配合检查点使用的,则还需要修改检查点,不然也会报错
注:中文可能会乱码,更改请求中的编码即可
v 使用Badbody进行数据库参数化
在Badboy里进行数据库参数化是通过ODBC进行的。
使用ODBC的前提是要在本地安装上ODBC,安装好之后要配置数据源
- 下载个odbc, 如公司项目用是MySQL,所以安装mysql-connector-odbc-8.0.11-winx64(Mysql官网下就可以https://dev.mysql.com/downloads/connector/odbc/
- 添加数据源
(1)在开始那输入数据源--打开“设置ODBC数据源64位
(2)如下图
备注:
1的位置随便写
2的位置的TCP/IP、Port、用户名和密码都需要填写你公司实际的IP,port,username和password
3的位置填完2之后,就会自动出现可用的库,选择需要的即可
添加完后,如下图片展示
在这里如果连接mysql数据库的时候报不能连接或者是拒绝连接,可能是没有权限。
1,设置访问单个数据库权限
mysql>grant all privileges on test.* to 'root'@'%';
说明:设置用户名为root,密码为空,可访问数据库test
2,设置访问全部数据库权限
mysql>grant all privileges on *.* to 'root'@'%';
说明:设置用户名为root,密码为空,可访问所有数据库*
3,设置指定用户名访问权限
mysql>grant all privileges on *.* to 'liuhui'@'%';
说明:设置指定用户名为liuhui,密码为空,可访问所有数据库*
4,设置密码访问权限
mysql>grant all privileges on *.* to 'liuhui'@'%' IDENTIFIED BY 'liuhui';
说明:设置指定用户名为liuhui,密码为liuhui,可访问所有数据库*
5,设置指定可访问主机权限
mysql>grant all privileges on *.* to 'liuhui'@'10.2.1.11';
说明:设置指定用户名为liuhui,可访问所有数据库*,只有10.2.1.11这台机器有权限访问。
一般如上步骤如果没有错误的话,我们在进入badboy工具内部进行设置数据源。
(3)Badboy配置Data source
此处遇到坑了,刚才配置的数据源没有出现在下拉列表。因为安装的ODBC是64位的,而badboy是32位的,所以重复前面的步骤,需要找个32位的odbc“mysql-connector-odbc-5.1.1-win32.exe”
选择一个需用的表
- 上面的步骤完成之后,需要把Data Source添加到脚本的最顶端,只是必须的
因为按脚本顺序执行,放到最顶端就可以先把数据取出来。
点着 Data Source拖到顶端的时候,还会出现选择数据库和表的界面,选择需要的即可
然后我们回到之前参数化设置的地方,把参数值修改为${username},username为数据库字段,也是参数列表名称。(断言处,输入数据处,操作步骤step1处双击选择,一共3个地方需要进行修改)。
修改完成后,脚本归零后,重新进行脚本运行,只要是按照数据库表customer中的字段username字段中的值进行运行就说明OK了。
v 并发
录制好脚本后,点击tools-选择Run background Threads,填写并发数量、间隔时间,点击Start开始启动
①执行并发的数量
②是否在每次执行完成之后清除cookie
③每次间隔的时间
④开始执行
⑤输出结果框
v 报告
View-Report
结果如下:
v 断点
在相应的步骤上右键—Toggle Break Point。
取消断点-重复以上操作。
v 问题记录
1>录制时一直提示错误弹窗
解决办法:可以通过设置不再显示,将“JavaScript Error Dialogs” 打勾,意思是隐藏javascript的报错对话框。
要关闭警告可以在浏览器Internet选项,然后单击“高级属性”页,进入到浏览器标签,并选中“禁止脚本调试”复选框
2>切换浏览器
在谷歌浏览器设置中操作设置为默认浏览器即可
注:设置成功之后,可以看到浏览器图标更改为谷歌,但是badboy内核为IE浏览器,所以实际上运行的还是IE
v Jmeter使用
- 添加线程组
n 名称:可以随意取,我们保持创建是自动分配的名称
n 注释:随意
n 在取样器错误后要执行的动作:我们选择继续,错误之后依然继续执行
n 线程数:一般我们用来表示多少个用户,即我们测试时的用户数量
n Ramp-up Period(in Seconds):表示每个用户启动的延迟时间,上述我设为1秒,表示系统将在1秒结束前启动我设置的1000个用户,如果设置为1000秒,那么系统将会在1000秒结束前启动这1000个用户,开始用户的延迟为1秒, 如果我设置为0秒,则表示立即启动所有用户。
n 循环次数:如果你要限定循环次数为10次的话,可以取消永远的那个勾,然后在后面的文本框里面填写10;在这里我们勾上永远,表示如果不停止或者限定时间将会一直执行下去, 是为了方便调度器的调用。
n 调度器的配置:我们勾选调度器时,将会出现这个面板
n 启动时间:表示我们脚本开始启动的时间,当你不想立即启动脚本测试,但是启动脚本的时间不会再电脑旁的时候,你可以设定一个启动的时间,然后再运行那里点击启动,系统将不会立即运行,而是会等到你填写的时间才开始运行。
n 结束时间:与启动时间对应,表示脚本结束运行的时间。
n 持续时间:表示脚本持续运行的时间,以秒为单位,比如如果你要让用户持续不断登录1个小时,你可以在文本框中填写3600。如果在1小时以内,结束时间已经到达,它将会覆盖结束时间,继续执行。
n 启动延迟:表示脚本延迟启动的时间,在点击启动后,如果启动时间已经到达,但是还没有到启动延迟的时间,那么,启动延迟将会覆盖启动时间,等到启动延迟的时间到达后,再运行系统。
n 注意:如果我们需要用到调度器来设定持续时间,如果线程数不够多到持续时间结束,我们就必须将循环次数勾选为永远,特别地,如果线程组里面有其他的循环,我们也需将该循环次数勾选为永远(如我上面录制的脚本中的Step1也是一个循环,需要将永远勾选),否则,按我如上配置,将永远去掉勾选,文本里填1,那么无论你将持续时间启动时间结束时间等设置多少,系统运行1000次后,将会停止不再运行。
- 添加HTTP请求设置
n 名称:本属性用于标识一个取样器,名称可以随意取,可以根据脚本的路径来取名
n 注释:对于测试没有任何作用,仅用户记录用户可读的注释信息,对界面做一个简单地介绍
n 服务器名称或IP:HTTP请求发送的目标服务器名称或IP地址,如是在本机上的项目,填写localhost或者127.0.0.1
n 端口号:目标服务器的端口号,默认值为80,后面的超时定义可以不用填写
n Implementation:这里我们录制时默认填写为JAVA
n 协议:向目标服务器发送HTTP请求时的协议,可以使http或者是https,默认是http
n 方法:发送http请求的方法,可用方法get、post、head、put、options、trace、delect等
n Content encoding:内容的编码方式,可以不填写
n 路径:目标URL路径(不包括服务器地址和端口)
n 自动重定向:如果选定该选项,当发送HTTP请求后得到的响应是302/301时,JMeter自动重定向到新的页面
n Parameters参数:即跟着路径一起发送的参数及文件
n 下面的代理服务器等可以忽略,按需要填写
n Use keep Alive:当该选项被选中时,jmeter和目标服务器之间使用Keep-Alive方式进行HTTP通信,默认选中
n USE multipart/from-data for HTTP POST:当发送HTTP POST请求时,使用USE multipart/from-data方式发送,默认不选中
n Parameters同请求一起发送参数:在请求中发送URL参数,对于带参数的URL,jmeter提供了一个简单地对参数化的方法。用户可以将URL中所有参数设置在本表中,表中的每一行是一个参数值对(对应URL中的名称1=值1)
n 通请求一起发送文件:在请求中发送文件,通常,HTTP文件上传行为可以通过这种方式模拟
n :当该选项被选中时,jmeter在发送HTTP请求并获得响应的HTML文件内容后,还对该HTML进行Parse并获取HTML中包含的所有资源(图片、flash等),默认不选中,如果用户只希望获取页面中的特定资源,可以在下方的文本框中填入需要下载的特定资源表达式,这样,只有能匹配指定正则表达式的URL指向会被下载
n 此取样被当成监视器,在Monitor Results Listener中可以直接看到基于该取样器的图形统计信息,默认为不选中
n 选中该项,在执行时只记录服务端响应数据的MDS值,而不记录完整的响应数据,在需要进行数据量非常大的测试时,建议选中该选项减少取样器记录响应数据的开销
- Jmeter的参数化方法
参数化:录制脚本中有登录操作,需要输入用户名和密码,假如系统不允许相同的用户名和密码同时登录,或者想更好的模拟多个用户来登录系统。
这个时候就需要对用户名和密码进行参数化,使每个虚拟用户都使用不同的用户名和密码进行访问。
一、利用函数助手获取参数值
选项->函数助手对话框
__CSVRead,
__Random,
生成的函数字符串:${__Random(,,)}第一个参数为随机数的下限,第二个参数为随机数的上限,第三个参数为储存随机数的变量名;
${__CSVRead(,)}第一个参数是文件名(包含路径),第二个参数是文件中的列(列数从0开始);
参数化数据
我们需要“参数化”的数据,用记事本写了五个用户名和密码,保存为.dat格式的文件,编码问题在使用CSV Data Set Config参数化时要求的比较严格,记事本另存为修改编码UTF-8. 注意用户名和密码是一一对应的,中间用户逗号(,)隔开。
我将这个文件放在了我的( C:\JmeterWorkSpace\t.dat )路径下。
__CSVRead:复制生成的参数化函数,打开登陆请求页面,在右则的参数化中找到我们要参数化的字段,这里对用户名和密码做参数化,第一列是用户名,列号为0;第二列是密码,列号为1;修改函数中对应的参数化字段列号就可以了,点击运行会调用相应路径下的参数文件。 CSV文件列号是从0开始的,第一列0、第二列1、第三列2、依次类推。。
_Random函数是从某数据段随机读取数据替换参数,当需要添加多条数据记录且某些字段需要唯一性时使用。
复制生成的参数化函数,打开登陆请求页面,在右则的参数化中找到我们要参数化的字段,这里对用户名和密码做参数化,第一列是用户名,列号为0;第二列是密码,列号为1;修改函数中对应的参数化字段列号就可以啦。
现在我们的参数化设置完成,在脚本的时候,会调用我们C:\JmeterWorkSpace盘下面的t.dat文件,第一列是用户,第二列是密码。
二、利用配置元件(CSV Data Set Config)
1.选中线程组,点击右键,添加-配置元件-CSV Data Set Config
Delimiter --- 如文件中使用的是逗号分隔,则填写逗号;如使用的是TAB,则填写\t;(如果此文本文件为CSV格式的,默认用英文逗号分隔)
Recycle on EOF:是否循环读入,因为CSV Data Set Config一次读入一行,分割后存入若干变量中交给一个线程,如果线程数超过
文本的记录行数,那么可以选择从头再次读入.
Recycle on EOF与Stop thread on EOF结果的关联:
Recycle on EOF :到了文件尾处,是否循环读取参数,选项:true和false
Stop thread on EOF:到了文件尾处,是否停止线程,选项:true和false
当Recycle on EOF 选择true时,Stop thread on EOF选择true和false无任何意义,通俗的讲,在前面控制了不停的循环读取,后面再来让stop或run没有任何意义
当Recycle on EOF 选择flase时,Stop thread on EOF选择true,线程4个,参数3个,那么只会请求3次
当Recycle on EOF 选择flase时,Stop thread on EOF选择flase,线程4个,参数3个,那么会请求4次,但第4次没有参数可取,不让循环,所以第4次请求错误
2.填写刚才定义好的变量
需要说明一下:函数助手方法要比CSV控件方法参数化功能要弱,推荐使用CSV控件方法。
三、用户自定义变量
一般定义测试系统的固定使用的变量,比如主机地址端口号,数据库账号密码等。选中线程组,点击右键,添加-配置元件-用户定义的变量
用户自定义变量中定义的所有参数的值在测试计划的执行过程中不能发生取值的改变,因此一般仅将测试计划中不需要随迭代发生改变的参数(只取一次值的参数)设置在此处。例如应用POST和port
取样器中的host和port用${host}和${port}代替,即使被测应用的部署服务器发生了变化,只需要简单地修改host和port参数的取值即可
值可以直接输入,也可通过函数__CSVRead从文件中读取,还可以通过前缀加随机数和方法获取。
比如用户名为user_0到user_100的用户,那么用户名可设置名user_${__Random(0,100,)}
但是这种每次执行的多个线程所替换的参数一样,因为先获取到随机参数,再执行多个HTTP请求
四、用户参数
右键快捷菜单中选择 添加-前置处理器-用户参数
与用户自定义变量不同的是,用户参数列表中的参数取值可以在测试计划执行过程中发生变化。
如图,username和password分别有两组不同的取值。通过界面右下方的四个按钮,可以向列表中增加参数,增加参数值,删除参数和删除参数值。
“每次迭代更新一次”选项控制参数取值的变化规则,如果选中该选项,则参数的值在每个迭代中保持不变,在新的迭代开始时取下一个值。如果取消该选项,则参数值在每个在其作用域内的sampler发出请求时取下一个可用值。
如果参数的取值范围很小,使用用户比较合适,如果参数的取值范围很大,建议使用csv dada set config方法
五.jmeter的属性
以命令行方式运行测试计划时,用户可指定从命令行输入的值替换测试计划中的某些值。例如:以命令行指定线程组的线程数和运行时长。
_property函数具有3个参数,分别为属性名称、存放属性值的变量名称(可选),属性默认值(可选)。
Jmeter –n –t test.jmx –Jthreadcount=10 –Jduration=60
-J表示设置property的值,以上命令行表示:10个线程运行,运行时间为60秒。
六.从数据库中获取
当参数的值没有规律且量比较大时,可以选用这种方法。
具体做法如下:
4.1 下载MySQL JDBC “http://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-5.1.12.zip/from/http://ftp.jaist.ac.jp/pub/mysql/”
4.2 解压下载的zip包后,将其中的mysql-connector-java-5.1.12-bin.jar放到Jmeter的lib目录下
4.3 添加“配置元件”->“JDBC Connection Configuration”,设置下列参数:
Database URL:jdbc:mysql://host:port/db(如jdbc:mysql://localhost:3306/testlink
JDBC Driver class:com.mysql.jdbc.Driver
username:连接数据库的用户名(如root)
password:连接数据库的密码
4.4 添加“Sampler”->“JDBC Request”,在SQL Query中输入查询语句,如下:
SELECT CONCAT (“[",
GROUP_CONCAT(
CONCAT("{username:'",login,"'"),
CONCAT("{password:'",password),"'}"),"]“) AS json FROM users
4.5 在4.4中的JDBC请求中添加“后置处理器”->“正则表达式提取器”,以提取3.4中的用户名和密码为例设置正则表达式提取器的参数:
引用名称:user
正则表达式:username:’(.+?)’\{password:’(.+?)’
模板:$1$$2$
使用时,user_g1即为用户名,user_g2即为对应用户名的密码;更多正则表达式提取方法参见Jmeter正则表达式提取器
5.用正则表达式从前面请求的响应数据中提取,具体操作见Jmeter正则表达式提取器
断言验证
在web测试中,有的时候,即使我们测试返回的response code为200,也不能保证该测试是正确的,这时候,我们可以用到响应断言,通过对比响应的内容来判断返回的页面是否是我们确定要返回的页面。
选择我们要判断的页面,点击添加断言----响应断言,将会出现如下图:
名称:随意,这里我们不做改动
注释:随意
Apply to:这里我们选择默认值
要测试的响应字段:这里我们选择响应的文本,即返回的页面信息
模式匹配规则:这里我们选择包括,即响应的文本是否包括我们验证的信息
要测试的模式:开发者名称,即我们需要验证,开发者名称是否在响应文本中存在,也可以添加更多的字段来验证。
其他还有文件大小和响应时间等的断言,后面介绍。
e、添加监听器
我们做性能测试的时候,经常需要各种数据来验证我们的测试结果,Jmeter里面也提供了相关的功能,这里主要说一下Aggregate Report聚合报告。
点击添加---监听器,选择:查看结果树,和聚合报告,如果需要看到断言信息也可以选择断言结果,将设置的一切保存之后,然后点击启动,系统将会运行,将结果在监听器中表现出来。
四、分析结果
1、查看结果树
如图所示:成功的为绿色,失败则显示为红色。如果测试的结果太多,你只需要看到错误的页面,则勾选【仅日志错误】
2、聚合报告(Aggregate Report)
其中:
Label:标签,即我们上面的请求名称
#Samples:本次场景中一共发出了多少个请求
Average:平均响应时间
Median:中位数,也就是50%的用户的响应时间
90%Line:表示90%的用户的响应时间,如果最小值和最大值相差很大的话,我们一般选择这个作为最终测试结果
Min:最小响应时间
Max:最大响应时间
Error%:出错率,本次测试中出现错误的请求的数量/请求的总数
Throughput:吞吐量
KB/sec:每秒从服务器端接受到的数据量
五、监控内存及CPU等
很多时候,我们测试性能都需要查看内存和CPU等信息来判断系统瓶颈,关于CPU和内存的监控,Jmeter并没有很好的支持,很多时候,我们都只能通过系统的资源监控器来观察,一闪而过不会记录下来,很不方便。幸好google开发了一款专门监控的Jmeter插件,弥补了Jmeter这方面的不足,下面就来介绍一些这款插件——JMeterPlugins,目前我用的是0.5.6版本。
1、JMeterPlugins的下载地址
地址:http://code.google.com/p/jmeter-plugins/downloads/list,选择需要的版本,下载
2、JMeterPlugins的配置使用
将下载的文件解压,得到如下目录:
将JMeterPlugins.jar包复制到Jmeter的lib目录下面的ext目录下面,重新启动Jmeter,我们点击添加就可以看到出现了很多的jp@gc-开头的文件.
这里监控内存我们使用的是:jp@gc - PerfMon Metrics Collectot
在使用之前,我们需要运行/serverAgent/startAgent.bat这个文件,我们需要将serverAgent目录及下面的文件复制到我们测试的服务器上,然后点击打开(我这里是本机,直接在本机上面打开这个应用系统即可),它的默认端口为4444。
一切准备好后,点击启动,即可得到如下图:
你就可以得到系统运行时,你所需要的常用的性能值了。
六、监控内存及CPU等(jconsole)
最近逛论坛的时候,发现了一个比较好的监控内存CPU等的小工具,本着开源小工具多多益善的原则,记录一下。
打开这个小工具的步骤很简单,如果你已经配置好了Jmeter运行的环境,那么你也就不用去做其他的配置,直接 点击:开始——》运行——》输入cmd——》然后在出现的命令行界面输入“jconsole”即可弹出一个【java监视和管理控制台】,
将会弹出如下界面:
这里我们选择本地进程,并点击一下sun.tools.jconsole.JConsole这一行,然后点击连接,就可以查看我们的内存和CPU的使用情况了。
当然,我们要得到服务器的内存使用等信息,也可以选择 本地进程下面的远程进程,在文本框中输入我们需要测试的服务器的IP地址:端口,然后在下面输入用户名和密码,点击连接,看看会出现什么情况。
v Jmeter元件的作用域
配置元件(config elements ):元件会影响其作用范围内的所有元件。
前置处理程序(Per-processors):元件在其作用范围内的每一个sampler元件之前执行。
定时器(timers ):元件对其作用范围内的每一个sampler 有效
后置处理程序(Post-processors):元件在其作用范围内的每一个sampler元件之后执行。
断言(Assertions):元件对其作用范围内的每一个sampler 元件执行后的结果执行校验。
监听器(Listeners):元件收集其作用范围的每一个sampler元件的信息并呈现。
在jmeter中,元件的作用域是靠测试计划的的树型结构中元件的父子关系来确定的,作用域的原则是:
- 取样器(sampler)元件不和其它元件相互作用,因此不存在作用域的问题。
- 逻辑控制器(Logic Controller)元件只对其子节点中的取样器 和 逻辑控制器作用。
- 除取样器 和逻辑控制器 元件外,其他6类元件,如果是某个sampler的子节点,则该元件公对其父子节点起作用。
- 除取样器和逻辑控制器元件外的其他6类元件,如果其父节点不是sampler ,则其作用域是该元件父节点下的其他所有后代节点(包括子节点,子节点的子节点等)。
通过两个栗子(例子)来理解一下他们的作用域。
A(注:下图只是为了说明作用域,无法正常运行)
取样器(HTTP请求1 、FTP请求2 、TCP取样器3) 逻辑控制器(循环控制器) 监听器(图形结果1、聚合报告2)
* HTTP请求1 、FTP请求2 、TCP取样器3 元件没有作用域的概念。
* 循环控制器 元件作用域名是其子节点FTP请求2 、TCP取样器3 。
* 图形结果1 元件的作用域是是FTP请求2 、TCP取样器3。
* 聚合报告2 元作的作用域是HTTP请求1 、FTP请求2 、TCP取样器3
B (注:下图只是为了说明作用域,无法正常运行)
这个例子稍微复杂一些,包含的元件较多。先来分分类。
取样器(HTTP请求 、FTP请求 、TCP取样器、 JDBC Request )逻辑控制器(循环控制器、随机控制器)定时器(固定定时器、Uniform Random Timer )断言(响应断言、XML断言)监听器(图形结果、聚合报告)
根据作用域原则,这些元件的作用域分别为:
* HTTP请求 、FTP请求 、TCP取样器、 JDBC Request 元件没有作用域名概念
* 循环控制器的作用域为 FTP请求 、TCP取样器和 随机控制器
* 固定定时器作用于HTTP请求 , Uniform Random Timer 作用于所有取样器
* 响应断言作用于JDBC Request , XML断言作用于FTP请求 、TCP取样和JDBC Request 。
* 图形结果作用于FTP请求 、TCP取样和JDBC Request ,聚合报告作用于作用于所有取样器。
其实,通过上面的分析,并没有你想象的那么复杂,我们从各个元件的层次结构就可以判断每个元件的作用域。
Jmeter 中的逻辑控制器(Config Elements)在其作用范围内的行为与其他元件相比稍有不同。逻辑控制器元件分两大类:默认配置(HTTP默认请求、FTP默认请求等)和 管理(HTTP 头管理、HTTP cookie 管理等)。
其中默认配置(Configuration Defaults)元件中设置的值可以在作用域内叠加,例如,在一个测试计划中添加两个HTTP 默认请求,其中第一个默认设置 Server name or IP 为www.google.com ,第二个默认设置Path 为/page-not-exist , 则在这两个元件作用域内的所有HTTP 默认请求,其默认的Server name or IP 和Path 均为Server name or IP 和 /page-not-exist 。(你有一个故事,我有一个笑话,我们一交换,两个人都分别拥有了一个故事加一个笑话。)
管理(Manager)类逻辑控制器元件的效果则不能进行叠加。如果两个或两个以上相同的管理类元件作用域有重叠。则在重叠作用域内的取样器元件只会随即受到其中一个的作用,这样会导致取样器行为的不确定性。因此,在使用管理类逻辑控制器时,一定要注意保证相同的管理类元件的作用域不发生重叠。
v jmeter元件的执行顺序
了解了元件有作用域之后,来看看元件的执行顺序,元件执行顺序的规则很简单,在同一作用域名范围内,测试计划中的元件按照如下顺序执行。
(1)配置元件(config elements )
(2)前置处理程序(Per-processors)
(3)定时器(timers )
(4)取样器(Sampler)
(5)后置处理程序(Post-processors) (除非Sampler 得到的返回结果为空)。
(6)断言(Assertions)(除非Sampler 得到的返回结果为空)。
(7)监听器(Listeners)(除非Sampler 得到的返回结果为空)。
关于执行顺序,有两点需要注意:
* 前置处理器、后置处理器和断言等元件功能对取样器作用,因此,如果在它们的作用域内没有任何取样器,则不会被执行。
* 如果在同一作用域范围内有多个同一类型的元件,则这些元件按照它们在测试计划中的上下顺序一次执行。
https://www.cnblogs.com/icy88/p/10456619.html
http://www.cnblogs.com/yangxia-test/p/3966154.html
http://blog.sina.com.cn/s/blog_671c968b0100jduq.html
http://www.cnblogs.com/fnng/archive/2012/12/27/2836506.html