接口测试——精通JMeter测试工具
文章目录
前言
Apache JMeter 是 Apache 组织基于 Java 开发的压力测试工具,用于对软件做压力测试。
JMeter 最初被设计用于 Web 应用测试,但后来扩展到了其他测试领域,可用于测试静态和动态资源,如静态文件、Java 小服务程序、CGI 脚本、Java 对象、数据库和 FTP 服务器等等。JMeter 可对服务器、网络或对象模拟巨大的负载,在不同压力类别下测试它们的强度和分析整体性能。另外,JMeter 能够对应用程序做功能/回归测试,通过创建带有断言的脚本来验证程序是否返回了期望结果。为了最大限度的灵活性,JMeter 允许使用正则表达式创建断言。
一、JMeter工具介绍
Apache JMeter 是 Apache 组织基于 Java 开发的压力测试工具,用于对软件做压力测试。
JMeter 最初被设计用于 Web 应用测试,但后来扩展到了其他测试领域,可用于测试静态和动态资源,如静态文件、Java 小服务程序、CGI 脚本、Java 对象、数据库和 FTP 服务器等等。JMeter 可对服务器、网络或对象模拟巨大的负载,在不同压力类别下测试它们的强度和分析整体性能。另外,JMeter 能够对应用程序做功能/回归测试,通过创建带有断言的脚本来验证程序是否返回了期望结果。为了最大限度的灵活性,JMeter 允许使用正则表达式创建断言。
二、JMeter工具下载及安装
安装java环境,因为JMeter工具是基于java开发的(安装JDK)
JMeter工具下载与安装
三、JMeter的目录介绍
backups目录
:备份脚本(没有写脚本没有此目录)bin目录
:模板,主要jar包,启动文件,jmeter.properties全局配置文件。jmeter-server.bat分布式压测extras目录
:存放和集成第三方的一些文件lib目录
:存放jar包
四、JMeter常用组件以及作用域
1.常用的组件以及执行顺序
- (1)测试计划:JMeter启动,其它组件的容器
- (2)线程组(测试片段):代表一定虚拟用户数,测试片段代表模块
- (3)配置元件:配置信息
- (4)前置处理器:请求之前的操作
- (5)逻辑控制器:控制请求
- (6)定时器:控制延迟请求
- (7)取样器:发送请求
- (8)后置处理器:请求之后的操作
- (9)断言:判断结果是否正常
- (10)监听器:收集和查看结果
2.常用的组件(元件)的作用域
- 组件可以作用于父组件
- 组件可以作用于同级组件
- 组件可以作用于同级组件的子组件
五、使用JMeter执行接口测试
1.测试计划
-
线程组之间在执行是没有顺序。如果希望线程按顺序执行,则需要勾上【独立运行每个线程组】
-
勾上【独立运行每个线程组】以后,线程组按顺序执行
2.线程组
-
线程组:
-
setUp 线程组中的请求会在所有请求之前执行,tearDown 线程组中的请求会在所有请求之后执行
3.测试片段
-
测试片段:可以理解为是特殊的线程组,和线程组同级别。用于多个测试之间协同做接口测试。主要是和模块控制器以及Include控制结合使用
-
使用情况:
- 接口数量不多,一个人就可以完成 —— 可以使用 线程组
- 接口数量巨大,需要多个测试协同测试 —— 可以使用 测试片段 + 线程组
-
特点:
-
1.默认是禁用状态
-
2.单个测试片段无法执行,需要结合模块控制器(自己调试)以及Include控制器(leader-领导)执行
-
单个测试调试
-
多个测试调试:多个测试片段需要配合多个模块控制器使用
-
-
-
组员如何保存测试片段:选中要保存的测试片段→鼠标右击→选中部分保存为
-
模拟Leader调试组员的测试片段
创建一个 “线程组” → 线程组中创建一个 “Include控制器” → 浏览文件 "选择组员的保存的测试片段→创建 “查看结果树” → 运行查看结果
4.HTTP请求默认值
- HTTP请求默认值:设置一次,其他接口可以进行调用
http协议端口:80
https协议端口:443
5.HTTP Cookie管理器
-
HTTP Cookie管理器:自动的处理有cookie关联的接口
六、JMeter关联接口测试
什么是关联接口:一个接口的返回值会作为另外一个接口的入参
1.正则表达式提取器
-
正则表达式提取器:左边界和右边界不能缺失,如果有特殊字符必须用 “\” 转义符
-
关联接口如何进行接口测试:把接口返回值当做一个变量
-
返回值如何进行设置到对应变量:
- 正则表达式提取器:对文本进行提取
- 匹配字符串中特定字符的字符串
- 正则表达式包含字符 + 限定符
- 正则表达式写法:左边界 + (. + ?) + 右边界
- 如何调用变量:${变量名}
- 万能正则表达式:
.*?
- 正则表达式提取器:对文本进行提取
-
基本用法:
- 自定义名称
- 正则表达式
- 使用第一个正则表达式取匹配值
- 匹配数字:0代表随机,1代表取第一个值,-1代表取所有的值
- 默认值:没有匹配到使用默认值
-
多个值的用法:
2.边界值提取器
-
基本用法
3.JSON提取器
- 了解JSON语法:
-
(1)
$
根节点 -
(2)
.键名
或["键名"]
去子节点
-
(3)如果是数组(llist),则通过下标取值
-
(4)相对路径用法:
$..键名
这里的name一般需要唯一 -
(5)列表切片:
$.tags[0:2]
($.tags[开始下标:结束下标]
取值包括开始下标的值,不包括结束下标的值)
-
总结:看到字典则用
.
看到列表则用[0]
下标,下标从0开始。
-
JSON提取器基本用法
4.Xpath提取器
- web自动化里面的定位,一般用于返回html网页时
七、JMeter不同参数的接口测试
-
参数:表单键值对,表格。
-
消息体数据:JSON数据,以
{}
和[]
组成的数据
-
文件上传:文件
八、JMeter动态参数接口测试
-
工具 → 函数助手对话框
1.随机数字函数
- 函数:Random
8.2.随机字符串函数
- 函数:RandomString
3.随机时间戳函数
- 函数:time
4.其他函数
-
函数:BeanShell(将小写字母变成大写)
-
函数:javaScript(将小写字母变成大写)
-
先使用随机字符串函数生成一个3位随机小写字母 → 然后使用BeanShell函数或者javaScript函数将小写字母变成大写
#随机字符串函数生成3位随机小写字母 ${__RandomString(3,abcdefghijklmnopqrstuvwxyz,)} #BeanShell函数将小写变成大写 ${__BeanShell("${__RandomString(3,abcdefghijklmnopqrstuvwxyz,)}".toUpperCase(),)} #javaScript函数将小写变成大写 ${__javaScript("${__RandomString(3,abcdefghijklmnopqrstuvwxyz,)}".toUpperCase(),)}
九、JMeter调试文件上传接口
- 文件的类型
十、JMeter接口测试常规断言和数据库断言
1.常规断言
1.1.响应断言
1.2.JSON断言
1.3.BeanShell断言(一般用在数据库断言中)
-
主要通过Failure标识是否失败和FailureMessage标识失败信息。
Failure=true 失败,Failure=false 成功
//注释:断言返回的状态码为200 if("200".equals(""+ResponseCode)){ Failure = false; FailureMessage = "断言状态码为200成功!"; }else{ Failure = false; FailureMessage = "断言状态码不为200失败,返回的状态码为:"+ResponseCode; } //注释:断言返回的结果中包含有某一个字符串 //获取返回的结果 var result = prev.getResponseDataAsString(); if(result.contains("星标组")){ Failure = false; FailureMessage = "断言返回结果包含[星标组]成功!"; }else{ Failure = false; FailureMessage = "断言返回结果不包含[星标组]失败,返回的信息为:"+result; }
2.数据库断言
-
数据库断言使用
1.
在测试计划中引入数据库驱动jar包或将数据库驱动jar包拷贝到JMeter安装目录中的
lib目录中
2.新建:JDBC Connection Configuration
3.新建:JDBC Request
4.使用BeanShell断言实现数据库断言
//获取数据库查询的数据 //name = 星标组 String name = vars.getObject("result").get(4).get("name"); //打印查看信息 log.info(name); var result = prev.getResponseDataAsString(); if(result.contains(name)){ Failure = false; FailureMessage = "断言返回结果包含" + name + "成功!"; }else{ Failure = false; FailureMessage = "断言返回结果不包含" + name + "失败,返回的信息为:"+result; }
十一、JMeter参数化(用于实现正例和反例)
- 参数化:用不同的测试数据对同一个接口进行循环测试(用于实现正例和反例)
1.CSV参数化(CSV 数据文件设置)
-
CSV参数化(CSV 数据文件设置)使用
1.准备一个csv数据文件,按照测试接口需求填写准备对应的数据
2.新建一个 “CSV 数据文件设置” → 填写对应的信息
3.调用 “CSV 数据文件设置” 里面的变量
4.创建一个 “响应断言”(断言响应返回的数据是否跟CSV数据文件里面设置的断言结果相同) → 调用CSV数据文件里设置的断言结果变量
5.创建一个 “循环控制器” → 将测试的接口放到循环控制器中
6.查看执行结果
注意:如果有接口关联,后面的接口需要用到前面接口的数据,那么就要把与预期结果相同的数据放到CSV数据文件的最后,避免后面关联的接口获取不到前面的数据
十二、JMeter跨线程组实现接口关联
对第2个接口做基准(压力)测试,但是第二个接口又依赖于第一个接口,那么把他们放到同一个线程组测试则相当于是对两个接口进行测试,而不是单独对第2个接口进行测试,造成测试不准确
-
跨线程组实现接口关联
1.线程组1中的接口使用了JSON提取器提取了接口返回数据中某个键的值
2.线程组1中的接口新建一个 “BeanShell 后置处理程序”3.使用 “函数助手对话框” 中的 "setProperty"函数 (如图所示进行操作) → 复制生成的函数字符串 → 在 “函数助手对话框” 中使用setProperty函数生成的函数字符串
4.使用 “函数助手对话框” 中的 "property"函数 (如图所示进行操作) → 复制生成的函数字符串
5.调用"property"函数生成的函数字符串
6.勾选 “独立运行每个线程组” (
因为线程组之间在执行是没有顺序,不勾选可能会导致线程2比线程1先执行,就会导致结果错误
)7.查看测试结果
注意:在测试计划中需要勾选上【独立运行每个线程组】
十三、JMeter跨线程组实现Cookie关联
-
同一个线程:可以增加
HTTP Cookie管理器
就可以自动化管理 -
如果是跨线程:
-
1.(可以按照上面的跨线程组实现接口关联方式先操作,操作完成后执行下面步骤)
-
2.修改JMeter安装目录下的
bin
目录中的 “jmeter.properties” 配置文件(修改如图所示——配置完成后关掉命令提示符及JMeter工具,然后重启JMeter)CookieManager.save.cookies=True
-
3.查看如下图所示两个地方的Cookie值,如果两组数据一致表示Cookie值百分百正确,如果两组数据不一致,取数据多的那一组
-
4.从调试取样器中取得Cookie的值并在 “BeanShell 后置处理程序” 中设置为全局变量
注意:变量名不能随便取,必须和响应头里面的变量名一致
-
5.将 “BeanShell 后置处理程序处理器” 中设置的全局变量添加到 “HTTP Cookie管理器” 中
-
6.将关联的接口实现Cookie关联
-
十四、JMeter工具其他常用组件
-
调试取样器
-
固定定时器
-
用户定义的变量
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!