一个好的项目不仅需要完整的业务功能,
更应该保证处理响应的效率!
在业务中经常需要检验并发的可靠性,特别是多人同时操作对业务的影响。
这时候就可以借助 JMeter 进行测试。
本文提供两种方式:串行测试、全局属性
基本使用
首先介绍下 JMeter 的基本使用。
一个完整的测试分为创建线程组,创建取样器(请求),定义响应结果断言。
创建线程组目的是设置并发量。
创建线程组
线程组大致分为三类:
- 启动线程组,最开始执行的线程
- 销毁线程组,最后才执行的线程
- 普通线程组,除启动和销毁外被放在中间执行的线程
(以上待考证,因为是我猜的)
一般来说随便选一个线程组都可以,如果同时只需要用到一个线程组的话
参数介绍
Name:线程组的名称
Action to be token after…:当某个线程失败后的执行策略
Number of Threads:总线程数
Ramp-up period:执行完全部线程的时间(秒)
Loop Count:该线程组的循环次数
Same user on…:每个线程是否采用同一个数据(当你读取文件时有用)
常用的就是设置线程数和总时间,比如设置 threads: 1000 period: 10,就是 10 秒内跑完 1000 个线程,平均每秒 100 个并发。
注意:实际情况下线程数是不断递增的,因为启动需要时间。
创建取样器
以创建 HTTP 请求为例
右键线程组弹出菜单,点击 Add -> Sampler -> HTTP Request
参数介绍
分别通过 protocal, server name(domain), port, path 设置请求的 URL 路径。
再通过 HTTP Request 选择请求的方式,下面的 Parameters, Body Data … 可携带请求参数/请求体。
定义响应结果断言
以 JSON 断言为例,
在此之前需声明响应头信息的 Content-Type 为 JSON
添加响应头配置
右键取样器,点击 Add -> Config Element -> HTTP Header Manager
然后就是根据 Name-Value 的规则添加信息头了。
再右键取样器创建断言,点击 Add -> Assertions -> JSON Assertion
参数介绍
Assert JSON Path exists:表示响应结果 JSON 对象中包含 xx 属性。
Additionally assert value:同时断言这个属性的值。
Match as regular expression:以正则表达式的语法匹配。
Expected Value:期望的属性值。
添加结果分析报告
根据上述定义的断言,可以确定结果是否正确,并能够通过 Listener 监听器显示测试的结果。
聚合报告
将所有的结果进行分析。
包含样本数,平均响应时间,中位数、90%以下、95%以下、99%以下、最小、最大响应时间,错误率,吞吐量等数据。
结果树
展示每一条请求的具体内容
包括请求头,请求体,响应内容等。
开启测试
右键线程组,点击 Start 即可开始测试。
如果点击界面上方的开始按钮,会开始全部的线程组。
业务测试
下文以实际多种测试为例,讲解如何进行常用的业务的测试。
登录测试
创建线程组
图中的 Same User… 需要取消勾选,确保每个线程都取不同行的数据
添加 CSV 数据配置
通过配置数据文件,可以在线程组内通过变量的方式读取文件内的数据。
比如用于 token,session,用户登录账号密码信息 的输入。
参数介绍
Filename:文件路径,也可以是其他文件,只要正确指定分隔符就行。
Variable Names:在 CSV 文件中,通过“,”分隔的列名。
也可以没有列名,这个变量名只是用来指定根据“分隔符”划分的每一列的名称。
Ignore first line…:是否忽略文件的第一行
Delimiter:数据之间的分隔符
Recycle on EOF:是否循环读取文件数据
Sharing mode:数据共享模式
注意:只有取消勾选 Same User… 才会应用这些变量的时候选取不同行的数据
应用变量
通过 ${variables} 的方式,可以在线程组的任意一处应用
创建取样器
以上是错误示范:并不满足 JSON 格式。
属性和值必须用双引号包裹
变量即使为双引号包括,也会正常解析,解析结果其实就相当于一个字面量,
如果和其他字符在一起如:123_${userAccount}
结果会拼接在一起:123_xxxxxxx
填写好测试的 api 地址,和请求体内容。
定义响应头信息,结果断言。
保证响应结果能以 JSON 形式解析。
定义结果内容断言:必须要有 code 属性,且值为 0。
添加监听报告省略…
右键线程组点击 Start,即可开始测试。
多人并发测试
由于多人并发测试,需要用到用户信息,测试并不好办。
所以需要先登录拿到用户信息,再进行接下来的测试。
串行测试(推荐)
在一个线程组内,创建两个取样器,并勾选 keep-alive 保证 cookie 不会丢失。
第二个取样器就可以基于第一个的用户信息发出请求了
此处就利用登录的 session 信息,进行个人信息的再一步请求。
全局属性
也可以分开两个线程组,先通过“登录”的取样器发出请求,并添加一系列处理程序来将 session 存储到全局属性中,
再需要用户信息的测试中,再通过获取全局属性的方式来获取到 session,进行请求。
以 Session 为例,
由于 session 的设置包含在响应头里,就需要通过先提取响应头。
添加 正则后置处理器,提取 session 变量
“session” 表示提取出来的变量的名称。
注意:捕获组从 1 开始,Match No. 表示捕获匹配的哪一句。
添加 BeanShell 处理程序,设置全局属性
Parameters 表示从 CSV 数据配置传来的变量名,
大概因为 session 同处于后置处理器环节,所以直接写就可以了。
通过 ${__setProperty()}
设置全局属性。
将 session 和 userAccount 绑定,存储所有用户的 session 值。
添加 HTTP Cookie 管理器
通过 $(__property(variable_name))
获取全局属性值。
接下来就可以进行测试了,请求会自动携带 cookie 中的 sessionID