一、概念
接口:是指系统或组件之间的交互点,通过这些交互点可以实现数据的交互
接口测试:是对系统或组件之间的接口进行测试,主要是校验数据的交换、传递和控制管理过程,以及相互逻辑依赖关系
接口测试分类:
系统之间的接口:多个内部系统之间的交互,内部系统与外部系统之间的交互
程序内部的接口:方法与方法之间,模块与模块之间的交互
接口类型:
按协议划分: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 =newDate().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中,选中使用数据文件的用例集,导入数据文件
版权归原作者 小松狮 所有, 如有侵权,请联系我们删除。