一、接口测试的简介和分类
1.概念
接口API:Application Program Interface。是软件提供给外部的一种服务,用于做数据传输。
接口测试:对系统或组件之间的接口进行测试,主要校验数据的交换、传递和控制管理过程,以及相互逻辑依赖关系
分类:
外部接口:测试被测系统和外部系统之间的接口(第三方接口如微信支付、支付宝支付,测试正例即可)
内部接口:内部接口只提供给内部系统使用(测试正例即可);内部接口提供给外部系统使用(测试需全面)
为什么做接口测试?
(1)系统前后端分离,开发进度不一致。前端快就做mock,后端快就接口
(2)基于安全考虑,前端验证很容易绕过,直接请求接口,特别:身份证信息、银行卡、金钱交易
(3)测试推崇的是测试左移,测试尽早介入
接口测试本质:测试接口能否正常的交互数据,权限控制以及异常场景
2.接口的类型
概念:Http和Web服务接口是两种不同的接口类型,它们在设计和使用上有一些区别
Web服务接口:
- Web服务接口是一种基于标准化协议和消息格式的软件接口,用于实现不同系统之间的集成和交互
- 使用SOAP或Restful等协议进行通信
- 数据传输通常采用XML作为消息格式,但也可以使用其他数据格式,如JSON
- Web服务接口通常使用WSDL描述接口和操作
- Web服务接口提供了更严格的契约和规范,支持更复杂的功能,如事务管理、安全认证、错误处理等
HTTP接口:
- HTTP接口是基于HTTP协议进行通信的接口,使用HTTP请求方法(如GET、POST、PUT、DELETE)对资源进行操作
- 数据传输通常采用各种数据格式,如JSON、XML、Form表单等
- HTTP接口通常以URL路径来表示资源,可以通过URL参数传递额外的信息
- 对于简单的应用场景,HTTP接口提供了轻量级、直接和灵活的通信方式
二、接口返回数据和JSON详解
1、JSON格式:三组数据
{error_code:0,msg:"提现成功",data:[]}
error_code:错误码,0成功
msg:对错误码的中文说明
data:真正的返回数据
2、HTML格式
<html>
<title></title>
<body>
<error_code>0</error_code>
...
</body>
</html>
3、XML格式
<?xml?version="1.0"encoding="utf-8">
<error_code>0</error_code>
...
</xml>
三、接口测试协议
URL:协议、主机地址、端口号、资源路径、参数
1、webservice协议:接口地址:http://...............?wsdl
soap协议,wsdl
restful规则:
get获取数据,post提交数据,put修改数据,delete删除数据
2、dubbo协议:接口地址以dubbo://....
适用于少量数据的传输。大并发。
3、http协议:接口地址:http://
https:http+ssl安全传输协议,端口443
http: 端口80
什么是http传输协议?
http是超文本传输协议,主要用于浏览器和服务器之间交互数据,交互有两个部分:
请求:get,post,put,delete
响应:1XX信息,2XX成功,3XX重定向(跳转不跳值),4XX客户端错误,5XX服务器错误
https和http的区别
https是以安全为目标的http通道,简单讲是http的安全版。https相当于在http下加入SSL层,https的安全基础是SSL,因此加密的详细内容就需要SSL。
接口请求四要素:请求URL、请求方法、请求参数、响应数据
请求三部分:请求行、请求头、请求体
响应三部分:状态行、响应头、响应正文
请求:
请求行(Request):请求方式,请求地址,协议及版本
请求头(RequestHeaders):
Host 请求的主机地址
Connection 连接方式(keep-alive保持活跃),控制网络连接是否保持打开状态。
Origin 用于指明当前请求来自于哪个站点,仅仅包含站点信息,
不包含任何路径信息
Accept-Encoding 压缩方式
Accept-Language 告知服务器,本地支持的语言
Accept 客户端接收到的数据格式(告知服务器期望返回的数据)
X-Requested-With 异步请求方式,判定request来自Ajax请求还是传统请求,
为 XMLHttpRequest 则为Ajax请求
User-Agent 客户端的用户类型(告知服务器,客户端的配置信息)
Referer 来源,告诉服务器该网页是从哪个页面链接过来的
Cookie Cookie信息(请求的)
Content-Type 请求内容的格式(上传的数据类型)
Content-Length 内容长度
请求方法:
GET 请求指定的页面信息,并返回实体主体
POST 向指定资源提交数据进行处理请求(如提交数据或上传文件)。
数据包含在请求体中(body),post请求可能会导致新的资源
的建立或已有资源的修改
HEAD 类似于get请求,只不过返回的响应中没有具体的内容,用于获取响应头
PUT 从客户端向服务器传送的数据取代指定的文档的内容
DELETE 请求服务器删除指定的页面
CONNECT http/1.1协议中用来给能够将连接改为管道方式的代理服务器
OPTIONS 运行客户端查看服务器的性能
TRACE 回显服务器收到的请求,主要用于测试或诊断
请求体(RequestBody,跟请求头Content-Type一一对应):
GET \ POST 它们的区别是什么?
1.POST请求,参数一般不会放在url当中,而是在请求体当中;GET请求参数一般放在URL当中
2.POST请求数据放在body,所以不会有长度的限制,但是GET是放在URL中会有长度的限制
3.GET请求的安全性比POST低,GET请求的参数直接暴露在URL当中
4.GET从服务器获取数据,POST是从服务器传输数据
响应:
响应行:协议、响应码、响应信息
响应头:set-cookie(响应的),基本不会太多的关注,基本关注对应的Content-Type,请求的Content-Type是告诉服务器我参数的数据类型,响应的Content-Type是告诉客户端我给你的数据是什么格式
响应正文:就是具体的数据,然后通过浏览器去进行渲染显示
状态码:
1**:信息,服务器收到请求,需要请求者继续执行操作
2**:成功,操作被成功接收并处理
3**:重定向,需要进一步的操作以完成请求
4**:客户端错误,请求包含语法错误或无法完成请求
5**:服务器错误,服务器在处理请求的过程中发生了错误
常见状态码:常见状态码 【最全状态码展示】-CSDN博客
四、HTTP之cookie、session、token解析
解决http协议无连接、无状态的情况
cookie:
存储在客户端(本地)中的一串字符,一般不超过4KB。由服务器生成,发给浏览器,把字符保存在本地(cookie存储在本地,安全性较低)
session:
session=secret+cookie
校验:当我们做登录操作的时候,给服务器发送一个请求,服务器就会给你一个session,secret保存在服务器上。下次登录的时候,服务器会进行反向解码,以确定你的数据都是正确的(session存储在服务器上,加重服务器的压力)
token:
数据客户端能进行保存,并且不影响服务器,也可以不让外面的人去进行伪造
访问令牌access_token,用于接口中,用于标识接口调用者的身份、凭证。
1.access_token 不是唯一性,由开发确定(不同的客户端可能拥有不同的 Access Token,用于访问同一个用户资源。同一个客户端可能在不同时间获取多个 Access Token,用于刷新授权或延长有效期。)
2.token一般放在请求头中
3.要获取某个账号的数据,必须带上token
4.token也有时效性
五、接口测试的流程及用例设计
流程:
1.分析测试接口文档
2.编写接口测试用例
3.准备接口测试数据
4.执行接口测试用例--通过工具去执行(填写对应的请求数据,查看对应的响应数据)
5.得到对应的测试结果--测试报告--工具自动生成
1、API文档(抓包工具获取):熟悉接口业务,接口地址,鉴权方式,入参,出参、错误码
2、编写接口用例以及评审
3、使用接口测试工具执行接口测试
4、持续集成Postman+Newman+Jenkins,输出测试报告并发送邮件
设计:
接口测试组成:功能模块、用例ID、接口名称、前置条件、用例标题、操作步骤(URL、请求方式、请求数据)、预期结果、实际响应数据、测试结果、测试人员
接口测试设计方法:同功能测试设计方法基本一致。边界值、等价类、决策表、判定表、因果图、场景法
- 通过性验证
按照接口文档上的参数,正常传入,是否可以返回正确的结果
- 异常情况的验证
不按照接口文档上的要求输入参数,验证接口对异常情况的校验。从必填、参数类型、入参长度等方面来考虑。
- 参数组合
如果接口文档中,说明不同的参数组合有不同的结果显示,则我们在测试接口时,一定要考虑到不同的组合情况。
- 根据业务逻辑来设计用例
场景法
例如:
需求如下:
1.登录失败5次,就需要等待15分钟之后再登录
2.新注册的用户需要过了实习期才能发帖
3.删除帖子扣除积分
设计思路:
新注册的用户,没过实习期能否发帖?删除帖子积分是否相应扣除?没登录的时候能否删帖?
检查点:检查接口的响应数据同接口文档一致,并且一一对应。
正例:输入正常入参,接口能够成功返回数据
反例:
鉴权反例:鉴权码为空,鉴权码错误,鉴权码失效。。。
参数反例:参数为空,参数类型异常,参数长度异常
错误码覆盖:根据业务而定
其他错误场景:接口黑名单,接口调用次数限制,分页场景
六、Postman界面介绍
Home主页
workspace工作空间
- Collections集合,项目集合
- Apis api文档
- Environments 环境变量,全局变量
- Mock Server 虚拟服务器
- Monitors 监听器
- History 历史记录
请求页签
Params:get请求传参
authorization:鉴权
headers:请求头
Body:post请求传参
none 没有参数
form-data 既可以传键值对参数也可以传文件(批量上传时1、需开启设置Settings—General—Read files outside working directory2、将文件传至对应文件目录下)
x-www-form-urlencoded:只能够传键值对参数
raw:json、text、xml、html、javascript
binary:把文件以二进制的方式传参
pre-request:请求之前的脚本
tests:请求之后的断言
cookies:用于管理cookie信息
响应页签
Body:接口返回的数据
Pretty:以json,html,xml...不同的格式查看返回的数据
Raw:以文本的方式查看返回的数据
Preview:以网页的方式查看返回的数据
Cookies:响应的Cookie信息
Headers:响应头
Test Results:断言的结果
全局变量和环境变量
环境变量:参数要一致(测试时选中相应环境)
全局变量:在任何接口都可访问到
获取变量方式:{{变量名}}
-
接口关联
从接口响应中提取变量,以便其他接口使用
1、JSON提取器实现接口关联
--第一个接口
console.log(responseBody)
//使用 JSON提取器提取access_token值
//把返回的字符串格式的数据转换成对象的形式
var result=JSON.pares(respnseBody);
console.log(result.access_token);
//把access_token设置为全局变量
pm.globals.set("access_token",result.access_token);
--第二个接口
{{access_token}}
2、使用正则表达式提取器实现接口关联
--第一个接口
//使用正则表达式提取器实现接口关联,match匹配
var result=responseBody.match(new RegExp('"access_token":"(.+?)"'))
console.log(result[1]);
//设置为全局变量
pm.globals.set("access_token",result[1]);
--第二个接口
{{access_token}}
3、使用Cookie提取器实现接口关联
var csrf_token=postman.getResponseCookie('csrf_token').value;
pm.globals.set("csrf_token",csrf_token);
-
数据驱动
Postman内置动态参数:
{{$timestamp}} 生成当前时间的时间戳
{{$randomInt}} 生成0—100之间的随机数
{{$guid}} 生成随机guid字符串
JSON文件和CSV文件处理:
断言
//1.断言返回的状态码为200,用于状态断言
pm.test("Status code is 200", function () {
pm.response.to.have.status(200);
});
//2.断言返回的结果中包括有一个指定的字符串,用于业务断言
pm.test("Body matches string", function () {
pm.expect(pm.response.text()).to.include("string_you_want_to_search");
});
//3.对返回的结果做JSON字段检查,用于业务断言
pm.test("Your test name", function () {
var jsonData = pm.response.json();
pm.expect(jsonData.value).to.eql(100);
});
//4.断言返回的结果等于一个字符串,用于业务断言
pm.test("Body is correct", function () {
pm.response.to.have.body("response_body_string");
});
//5.断言响应头中包含有指定的响应头
pm.test("Content-Type is present", function () {
pm.response.to.have.header("Content-Type");
});
//6.断言接口请求的时间少于200毫秒,用于性能断言
pm.test("Response time is less than 200ms", function () {
pm.expect(pm.response.responseTime).to.be.below(200);
});
//7.断言一个post请求的返回的状态码是否在指定的范围里面
pm.test("Successful POST request", function () {
pm.expect(pm.response.code).to.be.oneOf([201,202]);
});
//8.断言返回的状态码信息中包含指定的字符串
pm.test("Status code name has string", function () {
pm.response.to.have.status("Created");
});
一个接口里面要有业务断言和状态断言,性能断言根据需求来。其中状态断言放至全局中。
断言取文件中的值,通过data.文件中的属性名
Postman接口Mock Server服务器
mock模拟:后端的接口还没有开发完成,前端的业务需要调用后端的接口
Postman的Cookie鉴权
什么是cookie?cookie是一小段文本,格式key=value。
cookie鉴权的原理:
1、当客户端第一次访问服务器的时候,那么服务器就会生成Cookie信息,并且在响应头的set-cookie里面把生成的cookie信息发送给客户端
2、当客户端第2-N次访问服务器的时候,那么客户端就会在请求头的cookie带上cookie信息,从而实现鉴权
cookie的分类:
1、会话cookie:保存在内存,当浏览器关闭之后就会自动清楚cookie
2、持久cookie:保存在硬盘,浏览器关闭后不会清楚,有时效性,失效就清楚
Postman实现接口的加密和解密
1、目前市面上的加密方式
对称加密:DES、AES、Base64加密算法
非对称加密:双钥(公钥、私钥、公钥加密私钥解密、私钥加密公钥解密)加密、RSA加密算法
不考虑解密:MD5、SHA1、SHA3
2、Postman如何实现加密和解密
MD5最广泛
Newman
postman是专为接口测试而生,Newman是专为postman而生。Newman可以让postman的脚本通过非GUI的方式去运行脚本。
运行命令:newman run
常用参数:
-e 引用环境变量
-g 引用全局变量
-d 引用数据文件
-n 指定测试用例迭代次数
-r cli,html,json,junit --reporter-html-export 指定生成HTML测试报告
Postman+Newman+Jenkins实现持续集成
1、新建一个项目
2、设置自定义工作空间
3、执行Windows的批处理命令
4、执行系统的grovvy脚本(保证样式不丢失)
5、构建后操作,生成报告集成到Jenkins中