为什么做接口测试
- 可以更早的介入测试和发现问题
- 接口的功能相对单一,更容易进行测试覆盖和自动化持续集成
- 接口相对界面更底层一些,测试覆盖更容易
- 接口测试可以将复杂的系统关联简化,做好每个接口的测试就能保证系统质量
接口
什么是接口?
接口就是有特定输入和特定输出的一套逻辑处理单元,不用知道自身的内部实现逻辑,也可以叫做接口的黑盒处理逻辑。
接口的类型
由于服务对象不同,接口又可以分为两种
内部接口
系统内部调用的接口,如登陆注册,订单审核,项目授权等。
外部接口
外部系统调用的接口,如跳转支付的接口,完成支付回调接口,物流信息的查询接口等等。
接口分类
- webService接口:走的是soap协议通过http传输,请求报文和返回报文是xml格式,可以通过工具soapUI、jmeter进行测试
- http接口:http协议,通过路径来区分调用的方法,请求报文是key-value形式,一般返回的是JSON,有get、post等方法,可以使用postman、jmeter、loadrunner等
接口测试
什么是接口测试
接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换,传递和控制管理过程,以及系统间的相互逻辑依赖关系等。
接口测试范围
- 业务功能(功能逻辑)
- 参数验证(参数边界,参数组合,业务规则)
- 异常场景(重复提交、并发提交)
4. 幂等级测试(支付、订单、结算) 2. 并发测试 - 事务性测试(转账、移交授权)
- 大数据量测试(数据量较大情况,进行增删改查)
- 环境异常测试
- 性能测试(响应时间、吞吐量、并发数、资源要求)
- 安全测试(权限验证、SQL注入)
JMeter
JMeter介绍
Apache JMeter是100%纯 JAVA 桌面应用程序,被设计为用于测试 CS 结构的软件。同时也可以用来测试静态和动态资源的性能,例如:静态文件,Java Servlets,CGI Scripts,Java Object,数据库和 FTP 服务器等等。JMeter可用于模拟大量负载来测试一台服器,网络或者对象的健壮性或者分析不同负载下的整体性能。
同时,JMeter可以帮助你对你的应用程序进行回归测试。通过你创建的测试脚本和assertions 来验证你的程序返回了所期待的值。为了更高的适应性,JMeter允许你使用常规表达式来创建这些 assertions。
JMeter安装目录
文件夹 | 作用 |
---|
backups | JVM 文件备份目录,备份 jmeter 测试脚本时,备份文件的存储位置。 | bin | 可行性文件,如包含启动、配置等相关命令 自己写的脚本默认另存为该目录下 | docs | JMeter官方接口文档 | extras | 辅助库,提供对Ant的支持文件,可用于持续集成 | lib | 存放各种 Jmeter 核心库的源码 jar 包 存放自己二次开发的 jar包 | lib\ext | 官方提供的第三方插件 | license | 包含 non-ASF 软件的许可证 | printable_docs | 离线的帮助文档,可以查看函数等内容 | LICENSE | JMeter 许可说明 | NOTICE | JMeter 简单信息说明 | README.md | JMeter 官方基本介绍 |
bin目录
文件 | 作用 |
---|
jmeter.properties | JMeter 核心配置文件,各种配置基本在这完成 | log4j.conf | JMeter 日志配置管理 | jmeter.log | JMeter 运行日志记录,什么输出信息、警告、报错都在这里进行了记录 | jmeter.bat | windows 下 jmeter 的启动文件,带cmd窗口 | jmeterw.cmd | windows 下 jmeter 的启动文件,不带cmd窗口 | shutdown.cmd | windows 下 jmeter 的关闭文件 | stoptest.cmd | windows 下 jmeter 停止测试的文件 | jmeter-server.bat | windows 下 jmeter 服务器模式的启动文件 | jmeter-server | mac 或者 Liunx 分布式压测使用的启动文件 |
jmeter.properties常用的配置
**官方文档:**https://jmeter.apache.org/usermanual/properties_reference.html
1.默认语言设置
- language=en:默认英文
- language=zh_CN:默认中文
2.配置默认编码格式
- sampleresult.default.encoding=ISO-8859-1:默认ISO-8859-1
- sampleresult.default.encoding=UTF-8:可以改成常用的UTF-8
**注意:**这个只有在 jmeter.properties 文件中声明才会生效
3.捕捉cookie
CookieManager.save.cookies=false:默认
CookieManager.save.cookies=true:将cookie存储为变量
COOKIE_<实际的Cookie名称>成为JMeter工程里可以使用的JMeter变量
JMeter十大组件
测试计划(Test plan)
测试计划描述了 JMeter 在运行时将执行的一系列步骤。一个完整的测试计划将由一个或多个线程组、逻辑控制器、样本生成控制器、侦听器、计时器、断言和配置元素组成。
测试计划是测试的起点及测试容器。
线程组(Thread Group)
线程组是测试计划的起点。控制器和采样器都必须在一个线程组下,其他元素可以放在测试计划下,这时候它们将应用于所有线程组。
取样器(Samplers)
取样器是JMeter 向服务器发送请求并等待响应。它们按照它们在树中出现的顺序进行处理.
取样器能处理的请求:
- FTP请求
- HTTP 请求(也可用于 SOAP 或 REST Web 服务)
- JDBC 请求
- Java 对象请求
- JMS 请求
- JUnit 测试请求
- LDAP 请求
- 邮件请求
- 操作系统进程请求
- TCP请求
逻辑控制器(Logic Controllers)
逻辑控制器可以自定义 JMeter 用来决定何时发送请求的逻辑。逻辑控制器可以更改来自其子元素的请求的顺序。
前置处理器(Pre-Processor Elements)
前置在发出采样器请求之前执行一些操作。如果预处理器附加到采样器元素,那么它将在采样器元素运行之前执行。预处理器最常用于在示例请求运行之前修改它的设置,或更新未从响应文本中提取的变量。
例如:设置一些参数、修改取样器的设置、脚本预处理
后置处理器(Post-Processor Elements)
后置处理器在发出采样器请求后执行某些操作。如后置处理器将在该采样器元素运行后立即执行。后处理器最常用于处理响应数据,通常用于从中提取值。
断言(Assertions)
断言用于断言服务器的响应内容,接口测试中通常用于检验接口的响应内容是否符合预期
定时器(Timers)
- 定时器是在每个sampler(采样器)之前执行的,而不是之后(无论定时器位置在sampler之前还是下面);
- 当执行一个sampler之前时,所有当前作用域内的定时器都会被执行;
- 如果希望定时器仅应用于其中一个sampler,则把定时器作为子节点加入;
- 如果希望在sampler执行完之后再等待,则可以使用Test Action;
配置元件(Configuration Elements)
配置元件和取样器关系密切,可以添加或者修改请求。
例如:对请求数据的设置,变量、请求头、默认变量。比较常用的用户自定义变量
监听器(Listeners)
监听器主要用于在JMeter运行时,收集有关的测试信息。
执行顺序
- 配置元素
- 预处理器
- 计时器
- 取样器
- 后处理器(除非 SampleResult 为null)
- 断言(除非 SampleResult 为null)
- 侦听器
HTTP Request
HTTP Request介绍
用于发送HTTP、HTTPS请求
HTTP Request界面
HTTP Request相关字段介绍
字段名 | 作用 |
---|
名称 | 请求名称 | 注释 | 请求注释 | 协议 | http或https,大小写不敏感 | 服务器名称或IP | **默认:**http服务器 host 或者 ip,不包括协议 比如:www.baidu.com、192.168.196.128 | 端口号 | 目标服务器的端口号,**默认:**80 | 方法 | 发送 http 请求的方法 | 路径 | 目标请求的 URL 路径不包括 协议、host、ip、端口 | 内容编码 | 请求的编码方式,**默认:**iso8859 | 自动重定向 | 发出的请求的响应码是3**,会自动跳转到新目标页面 只记录最终页面的返回结果 | 跟随重定向 | 和自动重定向唯一不同的是:会记录重定向过程中的的所有请求的响应结果 | 使用 KeepAlive | JMeter 和目标服务器之间使用 Keep-Alive 方式进行 HTTP 通信 真正做性能测试强烈建议不勾选 | 对POST使用multipart/form-data | post 请求需要上传文件时勾选 | 与浏览器兼容的头 | 当勾选 multipart/form-data 时,勾选此项 http请求头中的 Content-Type 和Content-Transfer-Encoding 被忽略 而只发送 Content-Disposition 部分 |
Parameters 讲解
字段 | 描述 |
---|
Name | 参数名 | Value | 参数值 | URL Encode | 是否要 URL 编码?**重点:**如果参数值包含了中文、特殊字符,需要勾选 | Content-Type | 参数值的资源类型**默认:**text/plain | Include Equals | 当你的参数值为空的时候,可以选择不包含=,默认勾选 如果参数值不为空,则不可以取消勾选 |
什么是 URL 编码
- URL 编码解码**,又叫百分号编码**,是统一资源定位(URL)的编码方式
- URL 地址(常说网址)规定了数字,字母可以直接使用,另外一批作为特殊用户字符也可以直接用( / , : @ 等),剩下的其它所有字符必须通过 %xx 编码处理
- 编码方法很简单,在该字符ascii码的的16进制字符前面加**%**,如空格字符,ascii码是32,对应16进制是20,那么 urlencode 编码结果是 %20
Body Data 讲解
一般就是JSON格式传参,请求头content-type:application/json 的时候使用Body Data传参
Files Upload 讲解
字段 | 描述 |
---|
File Path | 文件的本地路径 | Parameter Name | 参数名 | MIME Type | 资源媒体类型 |
请求参数列表
文件参数
注意:
HTTP请求头中不要添加 content-type : multipart/form-data
HTTP 请求默认值
HTTP请求默认值界面
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wTT8U06Z-1632918169245)(接口测试之Jmeter.image/image-20210819111154418.png)]
HTTP默认请求值优先级
- 线程组下HTTP请求默认值,作用域为该线程组下所有的HTTP 请求,包括其子级所有的
- HTTP请求下的HTTP请求默认值,作用域仅为该HTTP请求
- 线程组下的HTTP请求默认值,优先级小于HTTP请求下的HTTP请求默认值
- HTTP请求默认值优先级小于HTTP请求
总结:
HTTP 请求所需的各种字段值(host、端口、编码、请求数据等等),取值的顺序(优先级)是:
- HTTP 请求本身的值
- HTTP 请求下的 HTTP 请求默认值的值
- 线程组下的 HTTP 请求默认值的值
有多个 HTTP 请求默认值时,除了参数列表或请求体数据是会拼接之外,其他字段值的取值顺序就是按照上述的顺序来走的
HTTP请求头管理器
- HTTP请求头管理器放到线程组下,那么线程组下所有 HTTP 请求都会共享这些 HTTP 信息头
- HTTP请求头管理器放到 HTTP 请求下,那么只有该请求拥有这些 HTTP 信息头
- HTTP请求头管理器和 HTTP 请求默认值一样,也有优先级的,而且优先级也一样
- 如果有多个信息头管理器,名称重名的话,会按优先级高的先取
用户自定义变量
- 线程组下的用户自定义变量优先级高测试计划里的用户自定义变量
- HTTP 请求下的用户自定义变量优先级高于线程组下的用户自定义变量
- 如果有重名变量,去优先级高的用户自定义变量
- 用户自定义变量在测试计划运行后,是全局生效的且只生成一次,它不是动态生成的;即使变量的值是随机数(Random),不同用户数循环多次,拿到的用户自定义变量值都是一样的
- 如果想要每次用户自定义变量的值是动态生成的,可以使用前置处理器-用户参数
用户参数
- 每次迭代更新一次:如果有多个用户/使用变量时勾选,如果不勾选,所有线程用的是同一个值,需要不同的线程用不同的值,需要勾选此选项
- 线程组下的用户参数 优先级高于 测试计划里的用户参数
- HTTP 请求下的用户参数 优先级高于 线程组下的用户参数
- 如果有重名变量,去优先级高的用户参数
- 若用户参数和用户自定义变量重名,则优先取用户参数的值;因为配置元件执行完再到前置处理器,所以前置处理器的值会覆盖配置元件的值
- 10个请求的响应内容都是不同;因为每次发送一次 HTTP 请求,都会调用一次用户参数,所以它的值是动态生成的
- 如果想要全局生效的且只生成一次的用户自定义变量,可使用配置元件-用户自定义变量
JSON提取器
字段含义
字段 | 解释 |
---|
Apply to | Main sample and sub-samples: 匹配范围为当前父取样器,及子取样器 |
Main sample only:仅当前父取样器(默认用这个就行) Sub samples only: 仅子取样器 JMeter Variable:变量值进行匹配 | | Names of created variables | 接收提取值的变量名 多个变量用 ; 分隔 必传 | | JSON Path expression | json path 表达式,用来提取某个值 多个表达式用 ; 分隔 必传 | | Match No.(0 for Random) | 取第几个值,多个值用 ; 分隔 0:随机,默认 -1:所有 1:第一个值 非必传 | | Compute concatenation var(suffix_ALL) | 如果匹配到多个值,则将它们都连接起来,不同值之间用 , 分隔 变量会自动命名为 _ALL | | Default Values | 缺省值,匹配不到值的时候取该值,可写error 多个值用 ; 分隔 非必传 |
JSON字符串提取
{
"ret": 200,
"msg": "V2.5.1 YesApi App.User.GetList",
"data": {
"total": 3,
"err_msg": "",
"err_code": 0,
"users": [
{
"role": "user",
"status_desc": "正常",
"reg_time": "2020-06-22 15:19:51",
"role_desc": "普通会员",
"ext_info": {
"yesapi_nickname": "",
"yesapi_points": 0
},
"uuid": "6D5EDCB459F0917A98106E07D5438C58",
"username": "fangjieyaossb",
"status": 0
},
{
"role": "user",
"status_desc": "正常",
"reg_time": "2020-06-22 14:27:17",
"role_desc": "普通会员",
"ext_info": {
"yesapi_nickname": "",
"yesapi_points": 0
},
"uuid": "0164DC0680F84DCE40D3DD4A36640ECA",
"username": "fangjieyaossa",
"status": 0
},
{
"role": "admin",
"status_desc": "正常",
"reg_time": "2020-03-23 22:48:32",
"role_desc": "管理员",
"ext_info": {
"yesapi_nickname": "",
"yesapi_points": 0
},
"uuid": "079BF6BB82AFCFC7084F96AECAF0519F",
"username": "fangjieyaoss",
"status": 0
}
]
}
}
提取单个值
Jsonpath | 结果 |
---|
$.data.total | 3 | $…total | 3 | $…users[0].role | user | $…uuid | 079BF6BB82AFCFC7084F96AECAF0519F | $.data.users[0].ext_info.yesapi_points | 0 |
重点
- 如果匹配到多个值(像 $…uuid ),也只能提取到一个值
- 如果想提取匹配到的所有 uuid,可以设置为 -1,结果如下图
还会告诉你匹配了多少个值 ${uuid_matchNr} ,记住,调用变量时,不再是 ${uuid} 而是 ${uuid_1} 、 ${uuid_2}
利用切片提取单个值
Jsonpath | 结果 |
---|
$…users[2] | 第三个 users | $…users[-2] | 倒数第二个users | $…users[0,1] | 前面两个users | $…users[:2] | 第一、二个users | $…users[1:2] | 第二个users | $…users[-2:] | 倒数两个users | $…users[1:] | 第二个开始的所有users |
提取多个值
- 四种写法
- **重点:**提取多个值,提取器的 Match No. 必须填 -1
$.data.users[*].role
提取所有 role 字段值
$…users…role_desc
提取所有 role_desc 字段值
$…reg_time
提取所有 reg_time 字段值
$…[*].username
提取所有 username 字段值
正则提取器
字段 | 含义 |
---|
Apply to | Main sample and sub-samples: 匹配范围为当前父取样器,及子取样器 |
Main sample only:仅当前父取样器(默认用这个就行) Sub samples only: 仅子取样器 JMeter Variable:变量值进行匹配 | | Field to check | 可提取的字段 | | Names of created variables | 接收提取值的变量名 必传 | | Regular Expression | 正则表达式 | | Template | 从找到的匹配项中创建字符串的模板 模板
1
1
1、
2
2
2…表示把解析到的第几个值赋给变量,从 1 开始匹配
0
0
0 表示整个表达式匹配的内容 若只有一个结果,只能是
1
1
1 | | Match No.(0 for Random) | 取第几个值 0:随机,默认 -1:所有 1:第一个值非必传 | | Default Value | 缺省值,匹配不到值的时候取该值 非必传 | | Use empty default value | 勾选后,提取不到值时,则返回空字符串 |
Field to check
属性 | 含义 |
---|
Body | 响应体,不包括响应头 | Body (unescaped) | 响应体,替换了所有HTML转义符 | Body as a Document | 从不同类型的文件中提取文本 | Request Headers | 请求头 | Response Headers | 响应头 | URL | URL | Response Code | 响应码 | Response Message | 响应信息 |
Template
-
如果一条正则表达式有多个提取结果,则提取结果是数组形式 -
模板
1
1
1、
2
2
2…表示把解析到的第几个值赋给变量,从 1 开始匹配 -
0
0
0 表示整个表达式匹配的内容(后续具体看栗子)
Regular Expression
提取单个值
提取多个值
如果一条正则表达式有多个提取结果,则提取结果是数组形式,我们可以采取和Foreach结合方式。
|