1-性能测试 - 快速上手Jmeter
before
windows 10 + jmeter 5.2.1
测试计划
当你将语言设置为中文,打开jmeter后,就会看到如下的窗口:
各功能概述:
- 菜单栏,无需多言,对软件的各种设置。
- 快捷按钮栏,这里介绍常用的:
- 新建:新建测试计划。
- 打开:打开保存测试计划。
- 保存:保存测试计划。
- 切换:当有多个线程组的时候,可以通过切换来指定哪些线程组或线程组内的指定请求运行和禁止运行,相遇代码注释。
- 启动:运行测试计划内的线程组。
- 清除/全部清除:当线程组被执行后,可以在察看结果树中查看执行结果,通过这两个按钮来清除执行结果。
- 函数助手对话框:jmeter内置了很多的函数,如生成UUID、时间戳等函数,都管理在该对话框内,并且可以通过下载插件来丰富该对话框。
- JMeter Plugins Manager:jmeter插件管理中,管理扩展插件。
- 日志:当执行线程组时,会在快捷按钮栏的右侧,展示执行的日志结果。
- 测试计划:你把它理解为一个容器,存放所有的线程组,及存放的所有的测试内容,你的测试内容都基于测试计划。
- 名称/注释:为该测试计划起个名字和描述吧。
- 用户定义的变量:在jmeter中,除了内置的一些变量,我们也可以在这里定义一些变量,这些变量作用于全局。
- 独立运行每个线程组:默认的,当执行测试计划时,多个线程组默认会并发的执行,如果勾选该项,表示从上到下依次执行线程组。
- 添加目录或者jar包到ClassPath:当有需要使用外部的目录或者jar包时,都在此添加。
线程组
一个测试计划下,可以有多个线程组,大部分的测试内容都在线程组内实现。
如上图,jmeter提供了三种了线程组:
- 线程组:普通线程组,也是用的最多的线程组,在该线程组内实现主要的测试任务。
- setUp线程组:一种特殊类型的线程组,用于在执行常规线程组(Thread Group)之前执行一些必要的操作,这个线程组下的线程行为与常规线程组完全一致,不同的是执行顺序,它会在常规线程组执行之前被触发。主要的应用场景有:
- 测试数据库时,可以用来执行数据链接等操作
- 获取前置数据,如依赖的token和cookies。
- teraDown线程组:一种特殊类型的线程组,用于在常规线程组完成后执行一些必要的操作,这个线程组下的线程行为与常规线程组完全一致,不同的是执行顺序,它会在常规线程组执行之后被触发。主要应用场景:
- 如果关闭数据库连接。
- 处理其他善后操作。
这里主要来介绍普通的线程组,当你如上图的操作,选中测试计划右键添加一个普通的线程组时,会得到如下界面:
各参数介绍:
- 名称/描述:略。
- 在取(采)样器错误后要执行的动作:
- 继续:忽略错误,继续执行。
- 启动下一个进程循环:忽略错误,结束当前循环的线程,执行下一次循环。
- 停止线程:停止当前线程,不影响其他的线程执行。
- 停止测试:当正在执行的线程执行完毕后,停止整个测试计划。
- 立即停止测试:整个测试计划会立即停止。
- 线程属性:
- 线程数:并发用户数量,每个线程可以认为就是一个虚拟用户,即多个用户同时去做同一个操作;线程之间是互不影响的,线程A中修改的变量值,不会影响到线程B。
Ramp-Up时间(秒)
:设置启动所有线程所需要的时间。如,线程数设置为5,启动所有线程所需要的时间设置为1,意思为所有的线程要在1秒内启动完成。- 循环次数(不要勾选永远):设置线程组内个线程执行的次数。如果线程数设置为5,循环次数设置为2,那么线程组内的每个线程都会执行2次,所有线程执行了10次。
- 永远:勾选该选项,测试计划就会一直执行下去。
same user on each iteration
,每次迭代使用相同的线程,即线程复用,默认勾选即可。- 延时创建线程直到需要:勾选后,只有需要线程了才会创建。
- 调度器,搭配永远选项使用,有的时候,要长时间对系统进行压测,那么就要勾选永远选项,并且为永远选项添加配置:
- 持续时间(秒):如要对系统持续压测1小时,那么就要在此填写3600,在3600秒后结束执行。
- 启动延迟(秒):设置线程启动延时时间,是指多少秒后才开始启动所有线程,但并不是说每个线程都延迟多少秒启动。
取(采)样器
jmeter内置和很多的取样器,用来模拟各种场景下的发送请求的操作。
这里主要使用的是HTTP请求
取样器,这里以向http://www.neeo.cc:6001/get
地址发请求为例:
来看各参数:
- 名称/注释:没啥好说的,略。
- 基本:
- web服务器:
- 协议,默认HTTP,其他包括HTTPS、FILE。
- 服务器的地址或IP:不包括
协议://
前缀。 - 端口号:HTTP默认端口是80,HTTPS默认端口是443,如果端口是默认端口可以省略不写。
- HTTP请求:
- 方法:包括常见的请求类型。
- 路径:填写具体得URL路径即可。
- 编码:要使用的内容编码,适用于POST、PUT、PATCH这三种请求方法,即对Body Data部分(数字10部分)编码,要注意这里的Content encoding不是HTTP Header的Content-Encoding。
- 自动重定向:自动重定向不会将重定向视为一个单独的请求,jmeter不记录重定向过程内容。
- 跟随重定向:跟随重定向会将重定向视为一个单独的请求,jmeter会记录重定向的过程内容。
- 使用长连接(KeepAlive):设置HTTP Header中的Connection字段,如果取消勾选,Header中会记录
Connection:close
,表示请求结果结束后断开该链接。 - 对POST使用multipart/form-data:配合文件上传使用。
- 与浏览器兼容的头:使用multipart/form-data时,HTTP Header中会禁止Content-Type和Content-Transfer-Encoding,仅发送Content-Disposition,用的不多。
- 参数:如果请求类型是get请求,携带的参数可以在"同请求一起发送参数"栏填写,也可以在url上填写。
- 消息体数据:即post请求携带参数在这里填写。
- 文件上传:
- file path:要发送的文件名,如果留白,则jmeter不发送。
- 参数名称:和接口的请求参数名保持一致。
- MIME类型:就是MIME类型。
- web服务器:
- 高级:使用的频率较低,你可以在这里设置超时时间和其他诸如代理的设置。
了解了这些配置后,你可以点击运行按钮执行了,但你会发现并没有什么结果输出,想要看执行结果,还需要有个元件要了解。
察看结果树
察看结果树用来查看测试计划执行的结果。
如果为当前线程组添加一个察看结果树,来查看当前线程组内的线程执行的结果。
当你运行测试计划后,该计划内的线程组都会执行,我们这目前只有一个;然后执行线程组内每个取样器,这里也只有一个。那么执行结果将会被察看结果树收集。
你也可以点击清除按钮清除察看结果树。
关于线程组的Ramp-Up时间(秒)
现在,设置一下线程组的参数:
- 线程组设置为5。
- Ramp-Up设置为10。
这个意思是,表示要在10秒钟之内启动着5个线程。你也可以通过日志的执行时间来验证。
入上图,日志执行时间显示为大约在8秒左右启动了所有的5个线程。
关于测试计划的独立运行每个线程组
如果勾选了测试计划的"独立运行每个线程组"选项。那么从上到下,每个线程组执行完毕后再执行下一个线程组。
如上图,线程组的设置是,线程数是5,Ramp-Up是1。没有勾选测试计划中的"独立运行每个线程组"选项,多个线程组是交叉着运行。
下图是勾选了测试计划中的"独立运行每个线程组"选项,多个线程组运行的结果:
可以看到,从上下到下的顺序执行每个线程组。
另外,如果你细心也可以发现,此时的察看结果树不在位于某个线程组内了,而是跟线程组平级,处于测试计划中了,表示监听测试计划中所有线程组的执行结果,这也是即将要说的一个点——作用域的概念。
元件的作用域
元件表示,实现特定功能的元器件,插件,常用来在测试计划中,实现特定的功能,如查看请求的执行结果,查看聚合报告等。
在jmeter中,各个元件(如察看结果树),所处的位置不同,它其作用的范围也不同,常见的作用域:
- 取样器作用域:元件位于指定取样器下,它只作用于该取样器,应用场景:
- 特定请求需要携带特殊的请求头的情况。
- 线程组作用域,元件位于某个线程组内,跟取样器平台,它作用于当前线程组,应用场景:
- 一个线程组内多个取样器依赖同样的请求头或者某一个参数,如token。
- 测试计划作用域:元件位于测试计划下,跟线程组平级,那该元件的作用范围是所有线程组,应用场景:
- 查看所有线程组的请求结果。
切换
切换功能也就是禁用/启用指定的线程组、取样器、元件。就像代码注释一样,打开就执行该部分代码,注释就不执行。
这里可以有两种方式来使用切换功能,当你选中要切换的线程组、取样器、元件时:
-
右键选择:
- 禁用:在下次执行测试计划时,禁用部分不会执行。
- 启用,在下次执行测试计划时,参与执行。
如下图,我想要禁用线程组
g3
,直接选中并且右键,选择禁用,禁用后的g3
会变暗。 -
点击切换快捷键:
自定义全局变量
看图说话:
你看粗来啥了?好吧,现在我们的项目测试环境中运行,测试用例中的ip和端口这么写没问题,然后我们就写了好几百个用例.....
然后,项目上线了,IP和端口变了,我们的用例是不是都要一个个的修改成新的?是的!但是,这就太麻烦了,所以,我们要学习一种新的方式,在某个地方提前定义一些公共的变量,然后全局中都去引用,当有需要就修改变量而不用去每个具体引用地址中修改,这样岂不美哉。
在jmeter中,怎么定义变量呢?看图:
在"测试计划"的"用户定义的变量"中,我们在这里定义一些变量(作用于全局),然后其他的地方用到就可以直接引用了。
在需要的地方,使用${变量}
就可以了。
那么我们如何查看jmeter在执行请求中都使用了哪些变量了呢?比如我们要查看ip和端口这两个变量。那就是使用调试取样器。
调试取样器
如下图创建一个调试取样器:
这里,关于调试取样器的各个参数都保持默认,因为它主要配合察看结果树来使用。
然后执行测试计划,在察看结果树就可以找到ip和端口两个变量,当然还有其他的变量:
最后,请保证变量名的唯一性..........
HTTP请求默认值
除了全局变量能解决部分多个请求中的一些公共的变量问题,还有个配置元件能做这些,比如,下面这三个请求:
http://www.neeo.cc:6001/get
# get
# 参数 {"user":"zhangkai", "pwd": "666", "id": 1}
http://www.neeo.cc:6001/put
# put
# 参数 {"user":"zhangkai", "pwd": "666", "method": "put"}
http://www.neeo.cc:6001/post
# post
# 参数 {"user":"zhangkai", "pwd": "666", "sex": "male"}
向同一个地址发送请求;有相同的参数(用户名和密码);各自的请求方式不同;各自又有自己的独特的请求。这种情况就是极其适合使用"HTTP请求默认值"这个配置元件,将功能的部分当成请求默认值,然后各自的再单独配置。
来个示例:
先来添加"HTTP请求默认值"配置元件,并且将公共部分配置上:
然后为三个接口分别创建一个线程组,线程组内创建一个"HTTP请求"取样器:
配置各自需要单独携带的参数和配置。
我们来去"察看结果树"中,查看结果:
可以看到,三个请求都没有问题。
通用接口练习
win 10 + jmeter 5.2.1
我们通过几种有代表性的接口来学习jmeter的用法。
带参数的get请求
http://www.neeo.cc:6001/get?user=zhangaki&pwd=1234
在线程组内,新建一个HTTP请求取样器,然后配置如下:
参数可以在url上携带,也可以在下面的参数选项中以key:value
的形式携带。
key:value格式的post请求
http://www.neeo.cc:6001/post
# 参数
user=zhangaki
pwd=1234
在线程组内,新建一个HTTP请求取样器,然后配置如下:
要注意修改请求类型;post请求的参数都在下面"参数"选项中携带。
参数为k=json的POST接口
http://www.neeo.cc:6001/post
# 参数
info = {"phone": 10086, "address": "北京"}
在线程组内,新建一个HTTP请求取样器,然后配置如下:
这种格式参数,携带也不麻烦,把json串当成一个value值即可。
那么,要是参数是纯json类型的post接口呢?
参数为json的POST接口
http://www.neeo.cc:6001/post
# 参数
{"phone": 10086, "address": "北京"}
在线程组内,新建一个HTTP请求取样器,然后配置如下:
也是非常的简单,把json串放到"消息体数据"选项即可。
PS:如你的"消息体数据"选项点击无效,那么,请检查左侧"参数"选项的值是否都清空了......
欢迎斧正,that's all,see also: