接口测试工具-Jmeter使用笔记(一:运行一个HTTP请求)
博主自从毕业从事软件测试行业距今一年半时间,大多数时间都在跟各种API打交道,使用过的接口测试工具也有许多,本文记录下各工具的使用心得,以及重点介绍我在工作中是如何使用Jmeter做测试的,都是在windows操作系统下进行。
最开始使用postman,该工具的优点是可以保存测试过程中使用的请求数据,可以把被测系统中所有的接口请求都保存在该工具中,对于排查定位问题,该工具还是很好用的,缺点就是效率太低,碰到一个业务流程涉及执行多个接口时,手动填参数实在慢。
一、安装Jmeter
1.JAVA环境
JDK下载地址http://java.sun.com/javase/downloads/index.jsp
二、jmeter 目录介绍
1.bin目录:可执行的目录
jmeter.bat:windows的启动文件
jmeter.log:日志文件
jmeter.sh:linux的启动文件
jmeter.properties:系统配置文件
jmeter-server.bat :windows分布式测试要用到的服务器配置
jmeter-serve:linux分布式要用到的服务器配置
2.docs目录:接口文档目录
3.extras目录:扩展插件目录
4.lib目录:所用到的插件目录,里面都是jar包,会自动在JMETER_HOME/lib和ext目录下寻找需要的类
5.liceses:jmeter证书目录
6.ptinrable_docs 用户使用手册
配置系统变量:
(1)JAVA_HOME,变量值为:你在本地安装JDK的目录。
C:\Program Files\Java\jdk1.6.0_10;
(2)CLASSPATH,变量值为:
C:\Program Files\Java\jdk1.6.0_10\lib\dt.JAR; C:\Program Files\Java\jdk1.6.0_10\lib\TOOLS.JAR; C:\Program Files\Java\jdk1.6.0_10\BIN;
(3)修改PATH变量
添加C:\Program Files\Java\jdk1.6.0_10\bin;
检测JDK安装是否成功:运行-->CMD-->输入"java",如果能看到帮助信息说明JDK安装成功。
2.JMETER环境
下载地址:http://jmeter.apache.org/download_jmeter.cgi
解压apache-jmeter-2.11.zip到本地(任何目录均可),比如我把它下载到:“E:\Jmeter\apache-jmeter-2.3.4”。
配置系统变量:
(1)JMETER_HOME,变量值为:
E:\Jmeter\apache-jmeter-2.3.4
(2)修改CLASSPATH变量
添加%JMETER_HOME%\lib\ext\ApacheJMeter_core.jar;% JMETER_HOME%\lib\jorphan.jar;%JMETER_HOME%\lib\logkit-1.2.jar;
JMeter插件安装
1. 插件下载地址: http://jmeter-plugins.org/downloads/all/
2. 插件下载后解压:找到JMeterPlugins-Extras.jar,把JMeterPlugins-Extras.jar放到apache-jmeter-2.12\lib\ext目录。
运行方式:点击Jmeter目录下bin文件夹里的jmeter.bat就可以打开Jmeter。
二、运行一个HTTP请求
1.添加一个线程组
线程属性{Ramp-Up Period(in seconds)}:意味着这个线程内的所有线程(对我来说是http请求)在多久时间内执行完毕,值为0,意味着并发执行线程组下的所有请求。
2.添加一个HTTP请求
“线程组”右键->添加->Sampler->HTTP请求
3.添加“察看结果树”
“线程组”右键->添加->监听器->查看结果树
4.运行
接口测试工具-Jmeter使用笔记(二:GET/POST请求参数填写)
举例来说
我的被测系统API的http请求涉及到GET/POST/PUT/DELETE四种。请求传参可分为两种:
GET请求
1 | http://请求路径/Ecs-duHc0U4E #该请求参数“Ecs-duHc0U4”以斜杠形式传入 |
POST请求
1 | http://请求路径?subnetCode=Subnet-tQSPwlp1&imageCode=image-djcgebxfd #该请求参数subnetCode和imageCode以问号形式传入 |
区别是:
第一种解析的时候会把后面的字符当做路径或是地址;
第二种解析的时候会把后面的地址当做匹配关键字,“?”起连接作用,表示要带参数,“&”作为不同参数的间隔符。
Jmeter中的请求方式
1、GET请求
在察看结果树中看到完整的请求路径是:http://10.10.28.131:8080/middleware/v2/ecs/Ecs-do93KwLL
2、POST请求
在察看结果树中看到完整的请求路径是:http://10.10.28.131:8080/middleware/v2/ecs/power/stop?ecsCode=Ecs-AwDrEYdx
接口测试工具-Jmeter使用笔记(三:管理请求服务器信息和Headers参数)
如果使用Jmeter同时执行多个http请求任务,就需要创建多个HTTP取样器,每一个取样器都来手动填写服务器信息和端口号,会非常消耗时间。
解决方法:Jmeter之HTTP请求默认值
1、添加方式
“线程”右键->添加->配置元件->选中HTTP请求默认值
2、配置好服务器IP和端口以后,新建一个HTTP取样器,不填写服务器信息。
3、运行,检查结果。
可以看出该配置元件是作用于整个线程内的,对该线程内的所有HTTP请求都生效。
参数列表:
Attribute | Description | Required |
Name | 组件名 | No |
Server | 域名或IP | No |
Port | 端口 | No |
Connect Timeout | 连接超时时间(单位毫秒) | No |
Response Timeout | 响应超时时间(单位毫秒) | No |
Implementation | 实现方式,默认值为Jmeter属性:jemter.httpsampler | No |
Protocol | 协议,HTTP or HTTPS | No |
Method | 请求方法:HTTP GET or HTTP POST | No |
Path | 请求资源路径 | No |
Send Parameters With the Request | 参数列表 | No |
Server (proxy) | 代理服务器的域名或IP | No |
Port | 代理服务器的端口 | No, unless proxy hostname is specified |
Username | 代理服务器的用户名 | No |
Password | 代理服务器的密码 | No |
Retrieve All Embedded Resources from HTML Files | 告诉Jmeter解析HTML文件并发送所有资源请求(包括图片,java小程序,JS,CSS等) | No |
Use concurrent pool | 用一个连接池来获取嵌入的资源 | No |
Size | 用于获取嵌入式资源的并发连接池大小 | No |
Embedded URLs must match: | URL匹配,过滤 | No |
我的被测系统中Headers需要填写参数,该参数作为用户唯一标识符,请求传入了它服务器才会对请求作出响应。
Jmeter之HTTP信息头管理器
1、添加方式
“线程”右键->添加->配置元件->选中HTTP信息头管理器
2、运行一个请求,查看请求数据
可以看出请求中的headers已经传入我所填写的参数accessKey,并且该配置元件同样作用于该线程内所有请求。
接口测试工具-Jmeter使用笔记(四:响应断言)
Jmeter中断言的类型有许多,我不在这里一一列举,只说下我用到的---响应断言。
作用:一个HTTP请求发出去,怎么判断执行的任务是否成功呢?通过检查服务器响应数据,是否返回预期想要的数据,如果是,判断任务成功,反之任务失败。
1、添加方式
选中一个取样器,右键->添加->断言->选中“响应断言”
(1)Apply to
关于应用范围,我们大多数勾选“main sample only” 就足够了,因为我们一个请求,实质上只有一个请求。但是当我们发一个请求时,可以触发多个服务器请求,就有main sample 和 sub-sample之分了。
(2)要测试的响应字段
勾选“响应文本”,会在响应数据中进行校验。
(3)匹配规则
勾选“包括”,意味着只要相应数据中包含要校验的字段,任务就算成功。
(4)要测试的模式
即需要校验的数据值。
2、查看运行结果
(1)失败的任务
判断为任务失败,查看结果树任务结果颜色标红。
(2)成功的任务
判断为任务成功,查看结果树任务结果颜色标绿。
(正则表达式提取器是Jmeter关联中的一种)使用场景:
有两个HTTP请求,请求A的返回数据中有一个字段“ABCD”,该字段要作为请求B的入参。
1、添加方式
请求A上右键-->后置处理器->正则表达式提取器
2、提取A请求中的taskCode对应的值
为了获取到上图中圈起来的这个值,要配置正则表达式提取器:
说明:
(1)引用名称:下一个请求要引用的参数名称,如填写Atask,则可用${Atask}引用它。
(2)正则表达式:
():括起来的部分就是要提取的。
.:匹配任何字符串。
+:一次或多次。
?:不要太贪婪,在找到第一个匹配项后停止。
(3)模板:用$$引用起来,如果在正则表达式中有多个正则表达式,则可以是$2$$3$等等,表示解析到的第几个值给title。如:$1$表示解析到的第1个值
(4)匹配数字:0代表随机取值,1代表全部取值,通常情况下填0
(5)缺省值:如果参数没有取得到值,那默认给一个值让它取,我填的Error。
3、获取到的值传入B请求
看一下请求B是否如预期的一样传入Atask这个值
引用成功~~
记录一个好用的测试正则表达式的工具:
工具名称:RegexTester
使用方法:
接口测试工具-Jmeter使用笔记(六:从文本读取参数)
使用场景:测试一个接口并发处理数据的能力,并且每次请求传入的参数都要不同。
列举一个实例,步骤中会侧重读取参数操作的说明,其他有疑问的步骤请查阅博主之前Jmeter相关的文章。
1、创建HTTP请求默认值---为了指定请求的服务器信息
2、创建HTTP信息头管理器---为了在Headers中传值
3、创建HTTP采样器---我们的请求任务
填好Http请求方式和请求路径,请求参数用变量方式引用进来,变量来源于CSV Data Set Config配置:
(1)添加CSV Data Set Config
(2)配置CSV Data Set Config
· Filename:需要传入的参数所位于的文件名称,一定要填写完整路径,博主填写的绝对路径。
· File encoding:参数文件的编码格式。可以不填。
· Variable Names:对应参数文件中每列的变量名,也是你要引用到请求中的参数变量名。例如博主填写的值为ecsCode,在http请求中引用该参数时${ecsCode}
· Delimiter:文件中的分隔符,一般用英文的逗号分隔开即可。
· Allow quoted data?:是否允许引用数据。博主没有用到,默认设置为 false。
· Recycle on EOF?:是否循环读取参数文件内容。设置为 true时,意味着已经读取完参数文件内的测试用例数据时,线程循环次数仍然没有结束,那就循环读取参数文件数据;设置为false时,若已至文件末尾,则不再继续读取测试数据。
· Sotp thread on EOF?:当读取到参数文件末尾时,是否停止读取线程。默认为 false。当 Recycle on EOF? 设置为true时,此项不起任何作用。当且仅当 Recycle on EOF? 为false时,此项配置才生效。
· Sharing mode:共享模式,即参数文件变量作用域,博主没用到就不关注他。
(3)在文本中填写参数
· 该文件所在的路径即为CSV Data Set Config配置元件中的Filename值;
· 博主只传入一个参数,所以只有一列,如果有两个参数,会有两列数据,并用英文逗号隔开;引用参数时,CSV Data Set Config配置元件中Variable Names填写两个变量,也用英文逗号隔开即可
· 有10行数据,意味着10条测试用例,我会设置线程循环10次。这也是为什么我会在CSV Data Set Config配置元件中Recycle on EOF填写False
循环次数设置为10,意味着该条请求只执行10次。
Ramp-Up Period设置为0,意味着10条请求同时发出。如果设置为5,意味着5秒内发起10条请求,平均1秒发出2条。
(4)在请求中引用参数
4、增加一个响应断言,意味着返回数据包含“执行成功”字样,任务成功
5、添加监听器-察看结果树
测试得知,按照预期取到了值~
接口测试工具-Jmeter使用笔记(七:用户定义的变量)
使用场景:一组API根据业务流程制作成测试脚本,想要移植到其他测试环境时,由于数据库发生了变更,有些初始化数据也相应发生了变化,例如环境地址、请求路径等等。博主甚至把服务器地址和接口的部分共同请求路径都做成了自定义变量。
1、添加方式
线程组 右键->添加->配置元件->用户定义的变量
2、作用范围
当前的线程组内所有取样器(即博主的HTTP请求)都可以引用变量
3、变量引用方式
需要说明的是,服务器IP地址和端口号以及接口共同的请求路径部分,作为变量引用时,需要在路径填充表格的最前面添加两个斜杠“//”,不加的话会引用失败。