笔者最近了解 Apache组织开发了基于Java的压力测试工具Apache JMeter。如有兴趣可自行搜索它的相关信息。笔者记录了一些使用方法,如有错误或遗漏,欢迎联系改正。
官方下载地址:
https://jmeter.apache.org/download_jmeter.cgi
(注意选择对应自己机器的版本)
安装完成之后在 apache-jmeter/bin文件下点击jmeter.bat打开。注意这里会打开一个界面+一个控制台,不要关闭控制台。
记录这篇内容时使用的是Jmeter5.1.1版本。
你可以像拼积木一样的使用Jmeter,需要什么东西就添加什么东西,Jmeter自身会把它们以树的结构组装起来。下文以一个login获取token的API例子来进行记录:
TestPlan(测试计划):
Jmeter中你想要测试的内容即为TestPlan,可以把它理解成树的根节点。打开时默认会有一个空的TestPlan。你也可以把整理好的TestPlan保存下来成为.jmx文件,以便下次使用。
在TestPlan下你可以添加各种元件,如线程组,监听器,定时器,等等。
Thread Group(线程组):
在TestPlan下添加节点Thread Group,线程组元件主要控制这么几件事。
- 当测试用例出现error时,测试计划怎样执行
- 用多少个线程(user)去模拟这个请求
- 循环多少次
压力测试,其实我们是要知道server的承受能力,像平常码代码的时候,自己测试时自己点一点是看不出来好坏的,所以需要用多线程来模拟多个用户的并发访问。这里我们先简单的把线程数设为10,循环次数为2.
HTTP Request(HTTP 请求):
在Thread Group下添加HTTP Request,这个就不多谈了,就是模拟出一个完整的请求来发送给server处理。有一点需要注意的是,这里的"Server Name or IP"字段的值只能填写“192.168.1.1”或“xxx.com”这样的,不可以在前面添加“http://”否则Jmeter会无法识别。
HTTP Header Manager(HTTP 信息头管理器):
这个是对HTTP Request请求头的管理,你既可以把它添加到某个HTTP Request节点下,也可以把它作为HTTP Request的兄弟节点。如果HTTP Header Manager是作为HTTP Request的兄弟节点时,它会应用到同级的所有Http Request上。
到这里,可以模拟出一个完整的请求出来,但并不能看到这个请求的执行情况,还需要额外添加监听器。
Listener:
既可以在Thread Group下添加监听器,也可以在Http Request下添加监听器。这两者的区别在于是监听线程组的所有内容还是某个具体Http Request的所有内容。另外,Jmeter提供了很多种监听器,这里推荐添加view Results Tree(查看结果树)和Aggregate Report(聚合报告),这两种。其他的监听器可以根据需要情况添加。其中,view Results Tree可以帮助你查看request与response的具体内容,Aggregate Report可以查看测试的统计信息,如平均响应时间,error百分比等等。
到这里,你应该可以完成一个简单的API的测试了。
接下来我们来看一些复杂一点的功能
有时候我们需要模拟一个正常用户的行为。在使用APP期间,用户可能会这里点点,那里看看,记录或者更改一些内容,做一些查询等等。我们可以使用下面这个控件来记录用户行为中具体涉及到了哪些API。
HTTP(S) Test Script Recorder(HTTP代理服务器):
不同于fiddler,这里除去一些基本的配置(如端口),你还需要额外注意两个地方。
1.必须与Recording Controller(录制控制器)配合使用,否则会报错。
2.在你需要进行测试的移动端添加Jmeter的证书。证书在bin文件下,名为ApacheJMeterTemporaryRootCA.crt。证书会在一段时间后过期,如果过期重新添加证书即可。
上述步骤完成之后,你会在Recording Controller下找到一大堆Request的记录。这些记录中不仅包含你要测试的API,也包含了图片的获取,第三方服务等访问,推送的广告内容(如有)等等。你可以只留下你希望测试的部分。
如果你仔细观察这些请求会发现,用户最初的操作会有一个步骤来获取token,后续的请求都会携带上这个token。换句话说,上面截图里的API,除第一条外都在各自的Request Header里面有类似于这样:authorization: Bearer xxxxx.xxx.xxx 的一组值。token过期之前没有问题,你可以正常的进行测试,如果token过期了,你的Jmeter测试脚本就不能用了(除去login行为获取token的api外)。
前面HTTP Header Manager(HTTP 信息头管理器)的内容里我们提到过,如果HTTP Header Manager是作为HTTP Request的兄弟节点时,它会应用到同级的所有Http Request上。那么如果我们可以把login获取到的token放入这个Header里面就可以解决上面的问题了。
Regular Expression Extractor(正则表达式提取器):
利用这个控件,你可以获取response中符合你给定的正则表达式的值,并把它作为一个全新的变量记录下来。
简单介绍一下用到的字段的含义,更详细的内容可以自行搜索一下。
Name of created variable: 取出的变量的新名称.
Regular Expression: 提取内容的正则表达式,注意前面的"accessToken"指的是你要从哪里取值来判断是否符合正则表达式。
Template($i$ where i is capturing group number, starts at 1):这个是指你要取符合正则的一组值里面的第几个,我们直接取第一个就好。
Match No.(0 for Random):0 代表随机取值,1 代表全部取值。这个填1就好。
取到了我们需要的token,并把它赋值给scriptToken,接下来只要在Header Manager中添加上它就可以了。
![HttpHeaderUseRegularValue](uploads/5f8606c7ee82621a9acb17797f4eacd3/HttpHeaderUseRegularValue.PNG)
Jmeter中使用变量的统一格式就是这个 ${变量名}。
另外,还有一个比较常用的控件
CSV Data Set Config(CSV 数据文件设置):
具体字段就不介绍了,相信大家的英文水平。额外提一点,配置文件中是可以填写多组配置的,默认按行来分隔。你的测试脚本中用到了线程去重复访问,就会取多少行配置,方便进行不同的测试用例的测试。如果配置文件读到了末尾,你可以配置来决定是测试结束或是从头再读取配置文件。