安装
1.官网下包,免安装的,最新版本下zip的
2.设置环境变量
复制粘贴jmeter的bin目录的地址(注意:要;号结尾,英文的)其他软件设置环境变量同此法;设置这个的目的是你可以不用到bin目录下点击执行文件打开程序,而是通过敲命令打开程序。
3.打开jmeter:bin目录下的jmeter.bat或者cmd:jmeter
接口
那么接口就很重要,如果不了解接口的构成,是无法自己写脚本的,也无法看懂录制的脚本;一个接口构成:
1.接口类型:get;post
Get和post的区别就是传参方式的不同;get会把传参放在url地址后面;而post会放在这次传参的结尾;(目前只用知道这两种接口类型就行了,99%都是这两种,有兴趣的可以自己扩展)
录制
1.自动录制:类似lr,可以用第三方工具bedboy录制,然后生成一个.jmx的文件,用jmeter打开这个文件就可以(bedboy不支持谷歌浏览器录制);jmeter也自带录制工具:
2.手动生成脚本:
最简单的脚本由:测试计划;线程组;http信息头管理器;控制器;HTTP请求构成;
做性能测试其实就是模拟服务器与前端接口的请求接收发送;通过大量的长时间的变化的数据量,来模拟实际生产环境下用户访问服务器的过程。
测试计划
略
线程组
知识点:
1.线程组相当于lr里的用户数;
2.循环次数如果勾选了永远,一定要勾选调度器限制运行时间;运行时间分两种模式,设置了持续时间就不会执行启动时间和结束时间;
3.(在取样器错误后要执行的动作)这一行设置是说:用户在线程组里执行请求时报错后执行什么操作,如上图,我的一个用户会一次执行学生列表,1对1学员直到执行完员工管理,那么如果在执行班课学员时报错了之后会执行什么动作。
继续:班课报错后这个用户会继续执行1对N学员直到员工管理;
Start next thread loop:停止这个用户,执行下一个用户;
其他字面意思,一般选择前两个。
取样器(sample)
http请求
编写http请求就是把接口相关项复制过来的一个过程
截获到的学生列表的接口如下:
协议:http
服务器名称ip:待测网址
端口:windows默认80,linux默认(可不填)
方法:get
路径:url地址去掉ip地址的后面那一段
Content encoding:编码方式;windows下gbk,linux下utf-8(可不填)
由于是get,参数跟着url一起发送了,所以不需要再填参数;
http信息头管理器
我们系统接口传输只有cookie,放在里面就行,cookie相当于密钥;确认你是登陆状态。
http请求默认值
如果你有多个取样器,如图(学生列表、1对1学员等)那么你可以添加一个请求默认值,把相同的信息填入这里,然后线程组里的这些信息可以为空。
查看结果树(监听器)
当你添加完脚本信息后,要看这个脚本有没有问题,就需要添加一个查看结果树的模块,当你运行脚本时,他会显示你脚本的一些详细信息,方便你调试;
如果图标是红色,就证明你这个取样器有问题,看响应数据返回的结果判断问题;
脚本录制完成后,去到线程组修改用户,时长等信息,保存脚本(YC730181601.jmx)就可以开始执行脚本了;
运行脚本
执行命令行打开jmeter时候会看到这样一句话:不要使用图形界面模式进行测试,图形界面只是用来调试的。
So:正确的运行脚本方式是命令行模式下运行脚本。
首先创建一个文件夹来存放jmeter运行时产生的文件和刚才新增的脚本,我的地址是G:\jmeter\pre;
然后命令行模式下,前往这个目录。运行脚本命令:
jmeter –n –t 脚本名称 –l 生成运行文件名(注意,生成运行文件名要用.jtl结尾)
运行完成
接下来,打开jmeter,添加一个聚合报告的模块,在浏览处打开刚才生成的文件就可以预览到压测结果了
补充知识点
参数化:CSV Data Set Config
1.本地参数化文件地址
2.文件编码形式(包含中文才要填写,windows下gbk,linux下utf-8)
3.变量名(参数化文件里有则可以不填,如果填写也是用英文逗号隔开)
4.参数化文件里是否忽略第一行(一般不改,第一行是变量名)
5.分隔符(默认填写的英文逗号,不用管)
6.是否允许双引号(一般不改,用于数据本身带有英文逗号的情况下)
7/8.循环模式:Recycle/Stop thread当参数文件遇到结尾的时候是循环使用还是结束线程;
Recycle:例:参数文件里有三行参数值,跑的时候线程循环5次,那么三行参数值会依次循环完5次,12312;
Stop thread:例:参数文件里有三行参数值,跑的时候线程循环5次,那么三行参数值跑完则线程停止,123.
注意:两个选项是对立的,只能有一个是true。
9.分享模式:
All threads:所有线程共享一份参数文件
线程组里有2个线程,循环4次,参数文件里有三个参数,那么这三个参数会被2个线程依次循环使用,直到跑完8次循环且当1线程使用1参数时,2线程只能使用2和3参数,直到1参数被1线程释放;
Current thread group:线程组内共享一份参数文件
Current thread:单线程享受一份参数文件
参数化的意思:
数据传输中,有些值是可以或者必须改变的,例如电话号码,姓名,我们叫这些值为变量,我们可以用一个文档记录下这些变量,然后用参数的方式给jmeter脚本提取数值,传给服务器。
参数化步骤:
1. 在本地建一份XXX.csv的文档
2. 填入数据,格式如下(英文逗号隔开字段,每一组数据都要另起一行,需要参数化哪些值就添加该值对应的字段名)
3.把csv文件的路径复制到filename
4.把csv文件里的变量名称赋值给接口里字段(格式${XXX})
5.运行程序,看看是否有效
函数助手
可以在运行线程组后面加上编号,区分哪些结果是哪些线程跑的
线程1跑的和线程2跑的接口数一目了然,方便调试代码。(注意:这里只是举了个例子,函数助手里有许多好用的函数,可以点击右上角蓝色的书查看用途,当然他是全英文版的)
响应断言
这里添加返回参数里必然有的值或者是预期值,如果没有返回这个值那么判断这次数据交互失败;例:登录时输入账号密码,返回值是登录成功或者登录失败;但是运行时不管成功还是失败,系统都会认为你这次数据交互是成功的;而你期望的返回值是登录成功,加上断言则可以区分得出你的期望值。(注意:加不加断言不会影响数据交互的结果,除非你取样器本身有问题)
测试数据都相同,加上断言
测试数据都相同,不加断言
定时器
定时器知识点:
1.定时器就是lr里的thinktime,执行请求前等待的时间;
2.注意作用域,放在哪个下面则作用哪个及其下所有分支;
3.不同定时器时间是根据作用域叠加的。
定时器1作用线程组1下所有请求和线程组;
定时器2作用线程组1下所有请求;
定时器3作用添加客户;
固定定时器
用法字面意思
Uniform Random Timer(均匀随机定时器)
用法和固定定时器一致,这里只解释两个输入框的用法。
1. 随机延迟最大值,输入3000,意思是0到3000毫秒内概率均匀的随机值;
2. 偏移量,输入1000,意思是上面0到3000毫秒随机取值变成1000到4000毫秒随机取值。
高斯随机定时器(正态随机定时器)
用法跟固定定时器一致,这里主要讲意思,其实就是取值的概率不均匀,概率呈正态分布。
如图设值,会从4秒开始左右偏差2秒之间取值,4秒概率最高,2秒和6秒概率最低。
Synchronizing Timer(同步定时器)
Synchronizing Timer类似lr里的集合点,当线程执行到某个请求时候停止,然后同时执行该请求。
知识点:
1. 同步定时器放在哪个请求,表示先在该请求集合,集合完成再同步执行该请求;
2. 等待超时时间:如果设定等待30个进程再执行请求,设置超时时间是2000毫秒,则2000毫秒后,不管有多少个等待进程,都往下执行请求。
3. 同步定时器同样有作用域,如果放在线程组下,则线程组下所有请求都会进行集合动作,一般是放在请求下。
后置处理器(正则表达式提取器)
查询客户后,在结果树中用正则表达式测试器模式,选择一个需要用正则表达式提取的值(正则表达式匹配的意思就是通过一个独一无二的条件搜索出符合你期望的所有数值)
注意:正则表达式自己百度看一下,常用的就那么几个,这里给大家推荐两个:(.*?)匹配非回车符换行符类型的字符;(\d+)匹配数字类型的字符。不懂规则的就死记硬背,套用公式
上图搜索出来的就是客户列表里id字段所有的值。
知识点:
1.引用名称:提取出来的值要放到变量里,需要自己取一个名字,之后赋值的格式:{XXXX};
2.正则表达式:把刚才查询的表达式粘过来;
3.模板:对应刚才查询里的match后面的数字,格式$1$,需要第几个就填第几个模板的编号;
4.匹配数字:如果一个模板里有多个匹配值,则填入你需要的值对应的编号;
缺省值:表示没有匹配到值时填入一个我们设定的值
4. 提取 出来值后再通过参数化的形式放入你需要的字段里例如:{id}