一、概念
接口:是指系统或组件之间的交互点,通过这些交互点可以实现数据的交互 接口测试:是对系统或组件之间的接口进行测试,主要是校验数据的交换、传递和控制管理过程,以及相互逻辑依赖关系
接口测试分类: 系统之间的接口:多个内部系统之间的交互,内部系统与外部系统之间的交互 程序内部的接口:方法与方法之间,模块与模块之间的交互 接口类型: 按协议划分:HTTP、TCP、IP 按语言划分:C++、Java、PHP…
接口测试原理:模拟客户端向服务器发送请求,服务器接收请求后进行相应的业务处理,并向客户端返回响应数据,检查响应数据是否符合预期
特点: 1、测试可以提前介入,提早发现bug,符合质量控制前移的理念 2、可以发现一些页面操作发现不了的问题 3、接口测试低成本高效益 4、接口测试是从用户的角度对系统进行全面的检测
二、HTTP协议
HTTP:超文本传输协议,是一个基于请求与响应模式的、应用层的协议,也是互联网上应用最为广泛的一种网络协议
特点: 1、支持客户端/服务器模式 2、简单快速 3、灵活 4、无连接 5、无状态
URL:统一资源定位符,在网络环境中,唯一的定义一个数据资源
2.1 HTTP请求
作用:客户端发送请求给服务器时,使用的协议 规定:发送给服务器的数据传输的语法格式
整体格式: 请求行:http请求第一行,请求方法(空格)URL(空格) 协议版本 请求头:语法格式:k:v,例如: User-Agent:描述请求发送端的浏览器类型 Content-Type:描述请求体的数据类型 空行:代表http请求头结束 请求体:请求发送时携带的数据 post和put有请求体 get和delete没有请求体
- HTTP请求方法:
- GET:查询
- POST:添加(常用在登录)
- PUT:修改
- DELETE:删除
2.2 HTTP响应
作用:服务器端,针对客户端发送的http请求,回发响应数据 规定:回发给客户端的数据组织格式
整体格式: 响应行:协议版本(空格)状态码(空格)状态码描述 响应头:语法格式:k:v,例如: Content-Type:描述响应体的数据类型 Content-Length:响应体大小,可以不写,浏览器自动求取,一旦写,必须准确 空行:代表响应头结束 响应体:绝大多数不为空(请求成功回发数据,请求失败回发错误信息)
- 状态码:
- 1xx:指示信息-表示请求已接收,继续处理
- 2xx:成功-表示请求已被成功接收、理解、接受
- 3xx:重定向-要完成请求必须进行更进一步的操作
- 4xx:客户端错误-请求有语法错误或请求无法实现,404请求不存在,403请求存在但没有权限
- 5xx:服务器端错误-服务器未能实现合法的请求
三、接口规范
3.1 传统接口风格
特点: 请求方法,只使用get和post即可 URL不唯一,同一个操作可以对应不同的URL 状态码的使用较单一,200最常见
3.2 RESTful风格
特点:
四、接口测试流程
1、需求分析:主要依据需求文档 2、接口文档解析:一般由开发人员编写接口文档(API文档) 3、设计测试用例 4、执行测试:使用接口测试工具或编写代码实现 5、接口缺陷管理与跟踪 6、生成测试报告 7、接口自动化持续集成
接口文档:由开发人员编写,描述接口信息的文档。开发团队按接口文档进行开发工作,并要一直遵守和维护
接口文档的解析本质:从接口文档中,找出http请求所需要的数据信息(请求方法、URL、请求头、请求体、响应状态码、描述)
五、接口用例
为什么要写接口用例? 1、防止测试点漏测,条理清晰 2、方便分配工作,评估工作量和时间
单接口功能:手工测试中的单个业务模块,一般对应一个接口 业务场景功能:按照用户实际使用场景,梳理接口业务场景,组织业务场景时,一般只需做正向测试即可,一般建议用最少的用例覆盖最多的业务场景
- 以登录页面为例
- 接口测试用例设计要点:
- 1、测试用户名输入框对应的username的值是否正确
- 2、测试密码输入框对应的password的值是否正确
- 3、测试验证码输入框对应的verify_code的值是否正确
与手工设计不同之处 1、手工测试测写入到输入框中的数据是否正确,接口测试测参数对应的参数值是否正确 2、接口测试不单单针对参数值进行测试,还可以针对参数本身进行测试 正向参数:必选参数、组合参数、全部参数 反向参数:多参、少参、无参、错误参数
5.1 单接口测试用例
手工测试用例文档八大要素: 用例编号、用例名称、模块名称、优先级、预置条件、测试数据、操作步骤、预期结果
接口测试用例文档要素: 用例编号、用例名称、模块名称、优先级、预置条件、请求方法、URL、请求头、请求体、预期结果
登录模块的接口测试用例测试点:
5.2 业务场景测试用例
用户怎么用,怎样设计业务 用最少的测试用例,尽量覆盖最多的接口
针对“员工管理”分析测试点: 登录->添加员工->查询员工->修改员工->再次查询->删除员工->查询员工列表
六、Postman
6.1 常用断言
Postman借助JavaScript-js语言编写代码,自动判断预期结果与实际结果是否一致 断言代码写在Tests标签内
断言响应状态码 pm.test("Status code is 200", function () { pm.response.to.have.status(200); }); pm:代表postman的一个实例 test():是pm实例的一个方法,有两个参数 参数1:在断言结束后,给出的文字提示,可以修改"Status code is 200" 参数2:匿名函数 pm.response.to.have.status(200) 表示postman的响应结果中应该包含状态码200
断言响应体是否包含某个字符串 pm.test("Body matches string", function () { pm.expect(pm.response.text()).to.include("string_you_want_to_search"); }); pm:代表postman的一个实例 test():是pm实例的一个方法,有两个参数 参数1:在断言结束后,给出的文字提示,可以修改 参数2:匿名函数 pm.expect(pm.response.text()).to.include(“xxx”) 表示postman期望响应文本中,包含XXX字符串,预期结果,可以修改
断言响应体是否等于某个字符串(对象) pm.test("Body is correct", function () { pm.response.to.have.body("response_body_string"); }); pm:代表postman的一个实例 test():是pm实例的一个方法,有两个参数 参数1:在断言结束后,给出的文字提示,可以修改 参数2:匿名函数 pm.response.to.have.body(“xxx”) 表示postman响应文本应该有XXX字符串,预期结果,可以修改
断言JSON数据 pm.test("Your test name", function () { var jsonData = pm.response.json(); pm.expect(jsonData.value).to.eql(100); }); pm:代表postman的一个实例 test():是pm实例的一个方法,有两个参数 参数1:在断言结束后,给出的文字提示,可以修改 参数2:匿名函数 var jsonData 用js语法定义一个变量jsonData就是变量名 pm.response.json() 代表响应的json结果 pm.expect(jsonData.value).to.eql(100) 表示postman预期json结果的key对应的值等于xxx
断言响应头 pm.test("Content-Type is present", function () { pm.response.to.have.header("Content-Type"); }); pm:代表postman的一个实例 test():是pm实例的一个方法,有两个参数 参数1:在断言结束后,给出的文字提示,可以修改 参数2:匿名函数 pm.response.to.have.header(“xxx”) 表示postman响应头中包含XXX字符串,预期结果,可以修改
6.2 全局变量和环境变量
全局变量:全局变量是全局唯一的,不可重复定义的变量 环境变量:
- 一个变量只能属于某个环境,在某一个环境中变量不可重复定义
- 在环境与环境之间可以定义重复的变量
- 一个环境可以包含多个环境变量
- 常见环境分类:开发环境、测试环境、生产环境
设置变量 全局变量: pm.globals.set("var_name",value); 环境变量: pm.environment.set("var_name",value);
获取变量值 全局变量: 请求参数中获取:{{vat_name}} 代码中获取: var value = pm.globals.get("var_name"); 环境变量: 请求参数中获取:{{vat_name}} 代码中获取: var value = pm.environment.get("var_name");
6.3 postman请求前置脚本
在send按钮点击后,请求前置脚本代码,第一时间被执行,在postman内部实际http请求之前
var timestamp = new Date().getTime()
pm.globals.set("glb_timestamp",timestamp)
6.4 postman关联
应用于多个http请求之间,有数据关联或依赖关系时
实现步骤: A接口 依赖B接口 的数据 1、向B接口发送http请求,获取数据 2、将数据设置至全局变量(环境变量)中 3、A接口获取全局变量(环境变量)中数据值,进行使用
请求获取天气接口,提取响应结果中的城市,将城市名给百度搜索接口使用
6.5 生成测试报告
使用newman命令,运行导出的测试集脚本,打开cmd输入
newman run 测试脚本文件 -e 环境变量文件 -d 测试数据文件 -r html --reporter-html-export report.html
eg:
run xxx.json:表示要执行的postman脚本,即导出的测试集数据
-e source:用来指定环境变量文件的路径
-d source:用来指定测试数据文件的路径
步骤: 1、批量执行测试用例集 2、导出用例集(Export得到xxx.json文件) 3、在终端中执行命令,生成测试报告
6.6 读取外部数据文件
数据文件: CSV: 优点:数据组织形式简单,适用于大量数据的场合 缺点:不支持bool类型数据;不支持多参、少参、无参、错误参数的接口测试;不支持负责数据类型(如嵌套字典、列表等) JSON: 优点:支持bool类型;支持多参、少参、无参、错误参数;支持复杂数据类型 缺点:对于相同数据量,json数据文件大小远大于CSV文件
CSV文件: 1、创建xxx.csv文件 2、将数据写入到csv文件中(第一行写入的是数据对应的“字段名”,从第二行向后依次是对应的数值,数据间用英文逗号隔分) 3、在postman中,选中使用数据文件的用例集,导入数据文件
JSON文件: 1、创建xxx.json文件 2、在数据文件中,按json语法写入json数据,postman要求,json格式的数据文件,数据内容的最外层,必须是[],内部所有的数据用{}存储 3、在postman中,选中使用数据文件的用例集,导入数据文件
|