接口测试
测试接口数据交换是否符合需求,以及对各种异常情况的容错处理,还有权限的控制。
接口测试灵魂拷问
1.什么是接口
硬件接口:usb接口(作用:将外部设备和电脑交换数据)
软件接口:API接口(应用编程接口,简称 接口),比如微信提现的接口、充值接口。
- 内部接口:开发人员自己开发的接口,对自身的系统提供数据交互(模块之间)。
- 外部接口:开发系统调用外部的接口(微信、支付宝)可以让程序和程序之间,能够互相交互。
总结:接口就是软件提供给外部的一种服务,主要用于交互数据。
2.为什么需要接口
接口能够让内部的数据被外部进行修改。
比如银行(银联支付接口):
3.为什么需要测试接口
- 很多项目都是前后端分离。(mock sever)
- 基于安全考虑,前端的JS认证很容易绕过攻击者后端接口、身份证、银行卡、金钱交易(接口鉴权)
- 测试左移,
4.接口的本质
接口的本质是函数、动作。
接口测试的本质就是测试接口(函数)是否能够正常实现数据交互、异常场景、权限控制
接口测试与功能测试的区别
功能测试
当产品确认需求后,前后端开发工程师进行代码的编写,开发完成后会进行代码的联调,联调之后会将开发完成的代码提交给测试。
功能测试则是开发进行联调通过之后才会去开展的,因为它需要有对应的界面。
接口测试
接口测试是在后端代码完成之后,接口测试人员就可以介入到对应的后端代码的一个测试工作。
接口测试流程
- 接口文档解析
- 设计测试用例
- 脚本开法
- 执行脚本
- 缺陷跟踪
- 测试报告
1.拿到接口文档(没有需要抓包),熟悉接口业务,接口请求四要素和响应四要素,接口鉴权方式,错
误码业务等。
2.编写接口测试用例(测试点XMIND)并评审(怎么测)
正例:
正常输入接口的请求四要素,查看并验证接口响应数据的正确性。
接口请求四要素:请求方式,请求路径,请求头,请求数据(给)
接口响应四要素:响应码,响应信息,响应头,响应数据。(返)
反例:
接口鉴权反例:鉴权码为空,错误,过期等
接口参数反例:参数为空,参数类型异常,参数长度异常。
业务场景反例:黑名单,接口调用次数,分页(100条,每页10条)
3.使用Postman执行接口测试
4.通过Postman+Newman+Jenkins实现接口自动化测试持续集成。并且输出报告以及进行邮件,企微,钉钉通知
HTTP协议
1.URL
URL是互联网上标准资源的地址,一般统称为统一资源定位符。
它的组成是由 协议、服务器地址、端口号、资源路径、参数。
- 比如
2.HTTP协议
HTTP:超文本传输协议,基于请求与响应的应用层协议。
作用:规定了客户端与服务器之间信息的传递规范,是二者共同遵守的协议。
组成:
- HTTP请求:定义请求数据格式
- 请求行、请求头、请求体
- HTTP响应:定义响应数据格式
- 状态行、响应头、响应体
HTTP请求-请求行
位置:请求数据第一行
作用:说明请求方法、访问的资源、协议版本
常用请求方法:
- GET:从服务器获取资源
- POST:在服务器新建一个资源
- PUT:在服务器更新资源
- DELETE:从服务器删除资源
HTTP请求-请求头
位置:请求数据第二行到空白行之间
作用:通知服务器客户端请求信息
特点:请求头部由键值对组成,每行一对。
content-type:请求数据类型
- text/html:HTML格式
- image/jpeg:图片格式
- application/json:json数据格式
- application/x-www-form-urlencoded:表单默认的提交数据格式。
- multiparty/form-data:在表单中进行文件上传时使用。
HTTP请求-请求体
位置:空白行之后
作用:传输数据实体
注意事项:请求体常在post、put方法中使用。
请求体常配合的请求头:content-type和content-Length
注意事项
不是所有的请求方法都有请求体,比如get、delete中没有请求体。
HTTP响应-状态行
位置:响应数据第一行
作用:描述服务器处理结果
内容:状态行由协议版本号,状态码、状态消息组成。
状态码:三位数字组成,第一个数字定义响应类别。
- 1XX:知识信息
- 2XX:成功
- 3XX:重定向
- 4XX客户端错误
- 5XX:服务端错误
HTTP响应-响应头
位置:第二行到空白行之间
作用:描述客户端要使用的一些附加信息
特点:响应头由键值对组成,每行一对。
HTTP-响应体
位置:响应数据空白行之后。
作用:服务器返回的数据实体
特点:有图片、json、xml、HTML等多种类型。
案例操作
抓包获取客达天下项目的登录接口,解析请求和响应数据。
要求:
- 区分请求数据行、头、体位置
- 请求url
- 请求方法
- 请求数据类型
- 请求数据
- 区分响应数据行、头、体位置
- 响应状态码
- 响应数据类型
- 响应数据
接口规范
作用:让前端开发与后台接口开发人员更好的配合,提高工作效率。
常见接口规范:
- 传统接口风格
- RESTful接口风格
1.传统接口风格
示例:对用户进行操作相关接口,包括增删改查。
2.RESTful接口风格
- RESTful:一种网络应用程序的设计风格和开发方式,提供了一组设计原则和约束条件。
- 示例
特点:
- 请求API的URL用来定位资源
- 通过标准HTTP方法对资源进行增删改查。
- 利用HTTP状态码返回状态信息。
两种风格的对比
传统风格与restful风格有什么区别?
接口测试流程
- 分析需求,产生需求文档(产品)
- (开发产生接口文档)解析接口文档
- 产生 接口测试用例(送审)
- 执行测试用例
- 工具:postman、jmeter、fiddler
- 代码:python、pytest、requests
- 提交、跟踪缺陷
- 生成测试报告
- (可选)接口自动化持续集成
接口文档
什么是接口文档
- 由开发人员编写,描述接口信息的文档。
- 开发团队按接口文档进行开发工作,并要一直维护遵守。
作用
- 能够让前端开发与后端开发人员更好的配合,提高工作效率。(有一个统一参考的文件)
- 项目迭代或者项目人员更迭时,方便后期人员查看和维护。
- 方便测试人员进行接口测试
展现形式
- word文档形式
- excel表格形式
- pdf文档形式
接口*
- 基本信息:
- 资源路径(协议和域名在“系统信息”中)
- 请求方法
- 接口描述
- 请求参数
- 请求头
- content-type:描述请求体的数据类型
- 请求体
- 实现该接口的使用的 数据及对应类型
- 请求头
- 返回数据
- 状态码:200
- 错误码(自定义状态码)
- 码值
- 描述信息
接口文档解析
- 接口文档解析的本质:从接口文档中,找出http请求所需要的数据信息。
- 主要包含:请求方法、URL、请求头、请求体、响应状态码、描述。
- 以登录接口为例
- 请求方法:POST
- URL:http://ihrm-test.itheima.net/api/sys/login
- 请求头:Content-Type :application/json
- 请求体:{“mobile”:”13800000002”, “password”:”123456”}
- 响应状态码:200
- 错误码:
- 10000:操作成功!
- 20001:用户名或密码错误
- 99999:抱歉,系统繁忙,请稍后重试!
- 错误码:
接口用例设计
为什么写?
- 防止测试点漏测。条理清晰
- 方便分配工作,评估工作量和时间
- 面试时使用!
接口测试的测试点
测试点也被称为测试维度。
功能测试点
- 单接口功能
- 手工测试中的单个业务模块,一般对应一个接口。
- 登录业务—登录接口
- 加入购物车业务—-加入购物车接口
- 订单业务—-订单接口
- 支付业务—-支付接口
- 借助工具、代码。绕开前端界面,组织接口所需要的数据,展开接口测试
- 业务场景功能
- 按照用户实际 使用场景,梳理接口业务场景。
- 组织业务场景时,一般只需要做正向测试即可(与手动一致)
- 一般建议用最少的用例 覆盖最多的业务场景。
- 登录—搜索商品—加购物车—下单—支付—评价
性能测试
- 响应时长
- 吞吐量
- 并发数量
- 服务器资源利用率
安全测试
- 攻击安全—与测试工程师无关
- 业务安全—测试的方向
- 敏感数据是否加密
测试用例设计方法与思路
与手工设计相同之处
- 手工测试对应的功能测试点,与接口测试对应的功能 完全一致。
- 比如:以商城项目登录功能为例
- 1.页面布局是否符合需求
- 2.测试用户名输入框,输入的数据是否正确
- 3.测试密码输入框,输入的数据是否正确
- 测试验证码输入框,输入的数据是否正确
与手工设计的不同之处
- 手工测试,测试写入的到输入框中的数据是否正确,接口测试 测参数 对应的 参数值 是否正确。
- 接口测试,不单单针对 参数值 进行,还可以针对 参数本身 进行测试。
- 正向参数
- 必选参数:所有的必选(必填)都包含。
- 组合参数:所有的必选+任意一个或多个可选参数
- 全部参数:所有的必选+所有的 可选参数
- 反向参数
- 多参:多出一个或多个必选参数(可以任意指定)
- 少参:缺少一个或多个必选参数
- 无参:没有必选参数
- 错误参数:参数名输入错误。
单接口测试用例
手工测试用例文档 8 大要素。
- 编号
- 用例标题
- 模块
- 优先级
- 预置条件
- 测试数据
- 操作步骤
- 预期结果
接口测试用例文档 要素
- 编号
- 用例标题
- 模块
- 优先级
- 预置条件
- 请求方法
- URL
- 请求头
- 请求体(请求数据)
- 预期结果
分析接口文档
以登录接口为例:
- 请求方法:post
- URL: “系统信息” 中的 协议和域名 + /api/sys/login
- 请求头:Content-Type : application/json
- 请求体:{“mobile”:”13800000002″,”password”:”123456″}
- 预期结果: {“success”:true,”code”:10000,”message”:”操作成功!”,”data”:”f5050a1b-7919-444c-9ec4-3c1a7286536d”}
- data:值为登录成功生成的 令牌数据。该数据 会定时变化。
登录模块的接口测试用例测试点
- 数值
- 正向:
- 登录成功
- 反向:
- 用户名为空
- 用户名包含特殊字符、字母
- 用户名超过11位(12位)
- 用户名不足11位(10位)
- 用户名未注册
- 密码为空
- 密码包含特殊字符、字母
- 密码为1位
- 密码为100位
- 密码错误
- 正向:
- 参数(接口测试特有)
- 正向:
- 必选参数:正确用户名 + 正确密码
- 组合参数:忽略
- 全部参数:正确用户名 + 正确密码
- 反向:
- 多参:多 abc:“123”
- 少参(少mobile):没有用户名,正确密码
- 无参:没有任何参数
- 错误参数(手机号参数名错误):abc:1381234567, password:”123456”
- 正向:
用户名相关用例
密码相关用例
参数相关用例
业务场景测试用例
- 用户怎么用,怎么样设计业务
- 用最少的测试用例,尽量覆盖最多的接口
分析测试点
针对 某管理 业务场景
- 登录—添加—查询—修改—再次查询—删除—查询列表
添加-员工
请求方法:post
URL: {协议+域名}/api/sys/user
请求头:
- Content-Type: application/json
- Authorization: Bearer f5050a1b-7919-444c-9ec4-3c1a7286536d (具体数据 来源 登录成功返回的 响应体中的 data的值)
请求体(请求数据):{“username”:”爱因斯坦”,”mobile”:”17289432100″,”timeOfEntry”:”2021-07-12″,”formOfEmployment”:1,”departmentName”:”测试0607″,”departmentId”:”1412421425733664768″,”workNumber”:”234″,”correctionTime”:”2021-07-30T16:00:00.000Z”}
- 预期结果
- 状态码:200
- {“success”:true,”code”:10000,”message”:”操作成功!”, “data”:{“id”:”113749504″}}
查询员工
- 请求方法:GET
- URL: {协议+域名}/api/sys/user/:target
- 请求头:
- Content-Type: application/json
- Authorization: Bearer f5050a1b-7919-444c-9ec4-3c1a7286536d (具体数据 来源 登录成功返回的 响应体中的 data的值)
- 请求体:
- 无
- 返回数据:
- 状态码:200
- {“success”: true,
“code”: 10000,
“message”: “操作成功!”,
“data”: { 所查询的员工的详细信息} }
emp_manager_002 | 查询员工 | 员工管理 | p1 | 登录成功 | GET | {协议+域名}/api/sys/user/:target | Content-Type: application/json, Authorization: Bearer f5050a1b-7919-444c-9ec4-3c1a7286536d | 状态码:200 {“success”: true, “code”: 10000, “message”: “操作成功!”, “data”: { 所查询的员工的详细信息} } |
---|
修改员工
emp_manager_003 | 修改员工 | 员工管理 | p0 | 登录成功 | PUT | {协议+域名}/api/sys/user/:target | Content-Type: application/json, Authorization: Bearer xxx | {“username”:”小猪佩奇”} | 状态码:200 {“success”:true,”code”:10000,”message”:”操作成功!”, “data”:{“id”:”xxx”}} |
---|
返回数据中的id,代表修改的员工id(是一个会变化的数据)
删除员工
emp_manager_004 | 删除员工 | 员工管理 | p0 | 登录成功 | delete | {协议+域名} /api/sys/user/:target | Content-Type: application/json, Authorization: Bearer xxx | 状态码:200 {“success”:true,”code”:10000,”message”:”操作成功!”,”data”:null} |
---|
查询员工列表
postman
简介和安装
- 简介:
- Postman是一款非常流行的接口调试工具,它使用简单,而且功能也很强大。不仅测试人员会使用,开发人员也会经常使用。
- 特征:
- 简单易用的图形用户界面
- 可以保存接口请求的历史记录
- 使用测试集Collections可以更有效的管理组织接口
- 可以在团队之间同步接口数据
集合区:一组请求的集合,可以用文件夹来细分
请求区:请求输入和响应返回
环境:变量公共设置方便拼装请求
发送简单的请求
- 创建请求
- 点击“New”按钮,选择“HTTP Request”创建一个新的请求(如图 1 所示)。
- 在请求编辑区的 URL 输入框中输入要测试的 API 地址,例如:
https://api.example.com/users
。 - 选择请求方法,如 GET、POST、PUT、DELETE 等。这里我们先使用 GET 方法获取用户信息。
- 发送请求并查看响应
- 点击“Send”按钮发送请求(如图 1 所示)。
- 在响应区可以看到 API 返回的状态码(如 200 OK 表示请求成功)、响应头和响应体信息。响应体通常是 JSON 格式的数据,Postman 会自动格式化以便查看(如图 2 所示)。
设置请求头
- 添加请求头
- 在请求编辑区的“Headers”标签下,点击“Key”和“Value”输入框,分别输入请求头的键和值。例如,添加一个“Content-Type”请求头,值为“application/json”(如图 1 所示)。这在发送需要特定请求头的 API 请求时非常重要,比如 POST 请求携带 JSON 数据时。
创建集合:
操作:New>Collections 或者点击红框+
collections>folder>request
collections:用于大类
older:用于细分
request:是基本元素
Add request\folder:集合包含文件夹也能包含请求,文件夹能包含子文件夹也能包含请求
Export:导出,可将集合请求导出给他人使用
Duplicate: 快速复制
Edit: 编辑
Delete: 删除
Rename: 重命名
创建请求
New>Request,命名第一个请求,选存储位置,选第一个集合里面的第一个文件夹,点击 save。
一个request请求就是http协议的接口,熟悉http协议才能更好的使用Postman。
get请求:点击Params,输入参数及value,可输入多个,即时显示在URL链接上,得到
post请求:四种提交数据格式,常见纯文本json就需要点选raw里面的application/json
response返回:可通过Pretty-json、raw纯文本、preview查看多种方法检验结果
postman使用
以案例讲解postman的使用
1.登录接口调试
接口自动关联
什么是接口关联
当在接口测试中出现上一个接口的返回值需要作为下一个接口的参数。
接口关联如何实现
1 获取上一个接口返回值中的指定数据。
- 方式一
- 可以使用json对象取值,保存到全局变量(在所有接口中都可以使用的变量)
// 从响应数据里面获取到json数据保存到jsonData值
var jsonData = pm.response.json();
// 打印jsonData的json数据中的字段到控制台
console.log(jsonData.需要关联的字段);
// 将获取到的字段保存到全局变量
pm.globals.set("需要引用的变量名",jsonData.需要关联的字段值);
- 方式二
- 使用正则提取,保存到全局变量。
//正则
var responseText = pm.response.text(); // 获取响应文本
var match = responseText.match('"access_token":"(.*?)"'); // 使用正则表达式匹配
console.log(match[1]);
//保存到全局变量
pm.globals.set("baili_token",match[1]);
- 使用全局变量,通过{{变量名}}引用。
- {{$}}和{{}}的区别:
- {{$}}为postman内置的参数,{{}}为我们自己设置的参数。
全局变量和环境变量的应用
- 全局变量:能够在postman整个应用中都能够使用的变量。
变量名、类型、初始值、当前值。
- 使用{{变量名}}引用
- 环境变量:在实际工作中,一套脚本,希望可以在开发环境、测试环境、生产环境、都可以测试使用。
- 他和全局变量的区别在于他的作用域比全局变量小,只能在单一的环境使用。全局变量可以在所有的环境使用。
- 多种环境的区别在于ip或者域名不一样。
2 添加课程接口调试
3 上传合同接口调试
4 新增合同接口调试
案例
postman批量执行
功能:
- 手动运行
- 定期运行
- 可以让我们的接口,在固定时间运行。
- 直接在界面完成
- 通过CLI自动运行(主要是Jenkins持续集成接口自动化测试)
安装cli命令行安装方式
- 配置环境变量
- C:\Users\48663\AppData\Local\Microsoft\WindowsApps
- 通过cli命令行
性能:(受限)一个月只能使用25次,最大虚拟用户数100,最大持续时间60分钟
Fixed:固定
Ramp up:逐步加强
Spike:尖刺
Peak:尖峰
Virtual users:虚拟用户数
Test duration:持续时间
重大的坑:批量运行的时候,图片附件是有问题的。
有附件一定要上传 到团队云端。
登录接口测试
postman接口自动化断言
断言的方式
1.状态码断言
// 断言
// 状态码断言
pm.test("断言状态码为200“,function() {
pm.response.to.have.status(200);
});
2.业务断言
// 断言
// 业务断言
pm.test("响应内容断言包括access_token",function() {
pm.expect(pm.response.text()).to.include(axxsee_token");
});
Postman自带断言,自动生产断言脚本
Get an environment variable:获取环境变量
Get a global variable:获取全局变量(常用)
Get a variable:获取变量
Get a collection variable:获取集合变量
Set an environment variable:设置环境变量
Set a global variable:设置全局变量(常用)
Set a collection variable:设置集合变量
Clear an environment variable:清除环境变量
Clear a global variable:清除全局变量
Clear a collection variable:清除集合变量
Send a request:发送一个请求
Status code: Code is 200:断言返回码为200(常用)
- Response body: Contains string:断言返回数据包含字符串(常用)
- Response body: JSON value check:断言JSON的值(常用)
- Response body:ls equal to a string:断言返回数据等于字符串(常用)
Response headers: Content-Type header check:断言响应头包含Content-Type
Response time is less than 200ms:断言响应时间少于200MS(常用)
Status code: Successful POST request:断言Post请求成功,即响应码在201-202之间
Status code: Code name has string:断言状态码的名字包括字符串,如OK
Response body: Convert XML body to aJSON Object:将XML正文转换为JSON对象
Use Tiny Validator for JSON data:对JSON数据使用微型验证器
如何精准的断言带有动态参数的接口
第一步:不能用系统的时间戳{{$timestamp}}
第二步:在请求之前自己创建一个时间戳
var dn = Data.now();
pm.globals.set("times",dn);
第三步:把参数改成自定义的时间戳
{"tag":{"name":"广东{{times}}"}}
第四步:断言绝对不能使用{{times}}取全局变量。要用pm.globals.get(“times”)
//业务断言
pm.test("断言标签名", function () {
pm.expect(pm.response.text()).to.include("广东"+pm.globals.get("times"));
});
全局断言
//状态断言
pm.test("断言状态码为200", function () {
pm.response.to.have.status(200);
});
响应状态码断言
包含指定字符换断言
json断言
postman数据驱动
什么是数据驱动
通过数据驱动用例执行,本质上请求四要素里面的请求参数不同,因为不同的数据传入接口得到不同的结果。
所以我们可以先把这些数据设置好,然后读取这个数据文件执行用例。
实现覆盖正反例。
Postman实现数据驱动方式一:主流
postman实现数据驱动方式二:SCV
第一步:根据接口的参数编写CSV数据文件
第二步:把所有的参数都改成获取全局变量,特别注意,参数名必须和你的CSV里面的名称一致。
第三步:选择CSV文件批量运行
第四步:修改断言和提取代码
postman接口加密
加密接口、自定义加密、签名sign
- 什么是加密接口以及目前有哪些加密方式?
- 单向加密:只加密、不能解密
MD5、SHA、HMacsHA - 双向加密:既可以加密,也可以解密
- 对称:AES、DES、Base64(有相同的密钥或者没有密钥)
- 不对称(公钥和私钥):RSA、postman不支持。(密钥不同)
- 单向加密:只加密、不能解密
单向-MD5加密
单向-SHA加密
双向对称-AES加密
加密
解密
测试只需要加密,不需要解密。
postman加密实战
MD5
在测试之前使用前置js,实现数据加密。
将加密的变量设置为全局变量。
使用的时候,直接访问全局变量即可。
base
旧版Newman+allure+Jenkins自动化持续集成
特点:能够生成美观的Allure报告。
缺点:不利于敏捷开发的快速迭代。
newman是一个命令行的集合运行器,允许在没有Postman CLI的情况下实现自动化持续集成。
命令:newman run
参数:
-e 指定环境变量
-g 指定全局变量
-d 指定数据文件
-n 指定迭代次数
-r html –reporter-html-export 生成HTML报告
-r allure –reporter-allure-export 生成ALLUE报告
第一步
- 安装node.js和Newman
下载:https://node.js.org/
验证:node
- 安装Newman:npm install -g newman
验证:newman -v
第二步
导出测试用例,导出全局变量和数据文件,把环境变量改成集合变量
第三步
运行测试用例,生成HTML报告
newman run “接口测试文件” -g “环境变量文件” -r html –reporter-html-export”报告文件”
第四步
运行测试用例生成Allure报告
这里有两个前提:
- 下载并且安装JDK以及配置环境变量
- 下载并且安装Allure以及配置变量。
- 生成:newman run “接口测试文件” -g “环境变量文件” -r allure –reporter-allure-export”报告文件”
- 查看allure报告:allure serve
Jenkins持续集成
- 安装jdk(版本在11到21)并配置环境
- 安装Jenkins
- 启动Jenkins
- 命令:java -jar jenkins.war
- 启动Jenkins后访问:http://localhost:8080/
- 根据Jenkins提供的目录中找到密码并输入
进入Jenkins后安装推荐配置插件。
配置Jenkins
- 新建ltem项目
选择第一个经典通用作业类型并点击确定
下滑找到Build Steps,并输入需要使用的命令。
配置构建后的操作,选择allure,
- 注意:需要去Jenkins全局工具配置中配置jdk以及allure的环境。
Jenkins可以定义执行
- 在Jenkins上先找到想要配置定时的项目,点击配置,进入到项目配置页面中
配置页面中的构建触发器,先勾选Build periodcally 表示定时构建任务
在构建中输入设定的规则,安静这里输入的是H 5 * * * *意思表示5分钟触发一次。点击保存
先去测试,等了一会在Jenkins上已经成功构建了2次,中间相差的时间就是5分钟。
定时构建语法介绍
表格一共可以书写5个* * * * * * 其中每个*之间需要通过空格或者tab键进行隔离开
- 第一个*表示分钟,取值0~59
- 第二个*表示小时,取值0~23
- 第三个*表示一个月的第几天,取值1~31
- 第四个*表示第几月,取值1~12
- 第五个*表示一周中的第几天,取值0~7,其中0和7代表的都是周几
举例
H/15 * * * * :表示每隔15分钟进行构建一次项目
H H/3 * * * : 表示每隔3小时进行构建一次项目
H 12 * * * :表示每天的12点进行构建一次项目
H H(9-18)/2 * * 1-5 : 表示每个工作日的早上9点到18点每隔2个小时进行构建一次项目
新版Postman+CLI+Jenkins自动化持续集成
优点:
不需要导出,然后非常适合敏捷开发中的快速迭代。
- 将环境变量改为集合变量
- 进行持续集成
- 使用postman批量运行中的CLI
复制CLI脚本到Jenkins进行配置。
可以将Jenkins中的地址和构建后配置的allure删除。