定义
系统之间(外部系统与内部系统、内部系统与内部系统)数据交互的通道
作用:校验接口响应数据与预期数据是否一致
目的
- 测试页面测试发现不了的问题
- 能够提早发现 bug,符合质量控制前移的理念
- 低成本高效益,因为接口测试可以自动化并且是持续集成的
实现方式
- 代码
Python + requests +unittest
Java + httpclient
- 工具
postman
jmeter
Http 协议
超文本传输协议,基于请求与响应的应用层协议
特点:
客户端/服务器模式
简单快速
灵活
无连接
无状态
URL格式
协议://IP地址:端口号/资源路径?查询参数
- 协议:http、https
- IP地址:也就是域名
作用:在网络环境中,唯一定位一台主机
- 端口号:可以省略,如果省略,跟随协议(http:-80,https:-443)
作用:在主机上,唯一定义一个应用程序
- 资源路径:可以省略,如果省略,资源路径为“/”
- 查询参数:可以省略,如果省略,没有?分隔符 |
作用:给资源传递参数
可以有多组,每组 k = v 格式,各组之间用“&”隔开
Http请求
- 请求行:请求方法、URL和协议版本
- 请求方法
get:查询——没有请求体
post:添加——用于注册和登录
delete:删除——没有请求体
put:修改
- 请求头(content-Type):指定请求体的数据类型
application/json:请求体的数据类型为 json
application/x-www-form-urlencoded:请求体的数据类型为 表单类型
- 空行:代表请求头结束
- 请求体:发送给服务器请求时,携带的数据
Http响应
- 响应行:协议版本、状态码、状态码描述
- 响应头:K:V格式数据
- 空行:代表响应头结束
- 响应体:服务会发给客户端的数据
所有的 响应协议 都有 响应体
响应体中 包含的数据 是接口测试过程中的 所要使用的 实际结果
Postman
接口测试流程
- 需求分析
- 接口文档解析
- 设计测试用例
- 脚本开发
postman 工具生成脚本
Python 代码编写脚本
Python + request +unittest
- 执行及缺陷跟踪
- 生成测试报告
- 接口自动化持续集成
解析接口文档
- 请求报文关键数据
请求方法
URL
请求数据(请求头和请求体)
- 响应报文关键数据
响应状态码
响应数据(响应体)
Postman 断言
让postman工具代替人工自动判断预期结果和实际结果是否一致
断言响应代码(200)
status code:code is 200
1、pm表示postman的实例
2、test()表示postman实例的测试方法,这个方法有2个参数
参数①:“status code is 200”:这个参数可以任意修改,不影响断言。作用是在断言结束后,显示给用户的,断言结果的提示文字
参数②:是一个 匿名函数 的调用
断言响应体包含指定字符串
response body:contains string
1、pm表示postman实例
2、test()表示postman实例的测试方法,这个方法有2个参数
参数①:“Body matches string”:这个参数可以任意修改,不影响断言。作用是在断言结果后,显示给用户的,断言结果的提示文字
参数②:是一个 匿名函数 的调用
3、pm.expect(pm.response.text()).to.include("string_you_want_to_search");
的意思是:postman期望响应文本中,应该包含“你想搜索的字符串”(即预期结果)
断言JSON数据
response body :JSON value check
1、pm表示postman实例
2、test()表示postman实例的测试方法,这个方法有2个参数
参数①:“Your test name”:这个参数可以任意修改,不影响断言。作用是在断言结果后,显示给用户的,断言结果的提示文字
参数②:是一个 匿名函数 的调用
3、var jsonData = pm.response.json();
#例子 :var abc = 20 。将整个 json 响应体 赋值到 变量中
4、pm.expect(jsonData.value).to.eql(100);
#即postman 期望 json 结果中 指定 key 的值 为 xxx
*** value 能取值:success、code、message ***
Postman关联
接口与接口之间,有依赖关系时,需接住postman关联技术 来实现
实现步骤
假设 接口b 产生的数据被接口a 依赖
①发送 接口b 请求,获取响应数据
②将响应数据放入公共容器(全局变量、环境变量)中
③接口a 从公共容器中提取数据发送请求
核心代码
①获取响应数据,转为 JSON 格式,保存到变量JSONData中
var json = pm.response.json();
②使用全局变量做容器
pm.global.set("全局变量名",全局变量值);
使用环境变量做容器
pm.environment.set("环境变量名",环境变量值);
③从postman界面中(url、请求头headers、请求体body)提取 环境/全局 变量 数据
{{全局变量名}}/{{环境变量名}}
Postman参数化
将 测试数据 组织到 数据文件 中,通过脚本的反复迭代,使用不同的数据,达到测试不同用例的目标
应用场景:一般在测试同一个接口的不同 测试点 时,只有 测试数据 不同,考虑使用参数化
数据文件简介
CSV
优点:数据组织格式简单
缺点:
①不能测试bool(布尔类型),因为postman读取CSV后,将所有非数值类型数据自动添加双引号“”变为字符串
②不能存储复杂数据类型(元组、列表和字典)
③不能实现 参数测试
应用场景:数据量较大,数据组织格式简单的
使用位置:
①请求参数(请求行、请求头、请求体)中,使用数据文件中的数据
CSV文件:
{{字段名}}
;JSON文件:{{键名}}
②代码(Tests)中,使用 数据文件 中的数据,使用postman内置的 关键字 data,索引字段名或键名
CSV文件:
data.字段名
;json文件:data.键名
JSON
优点:
①可以测试 bool 类型
②能使用复杂数据类型
③可以实现参数测试
缺点:相同数据量,json文件远大于CSV文件
应用场景:数据量较小,数据组织复杂的,需要进行参数测试的
Postman生成测试报告
- 导出测试用例集:在测试用例集中选择 “export”
- 导入测试用例集:在 home 中点击 “import” ,在 file 中点击“Upload files”导入
- newman生成测试报告命令
newman run 测试集文件 -e 环境变量文件 -d 测试数据文件.json/csv -r htmlextra --report-htmlextra-export report.html
命令说明:
①run xxx.json:执行测试集文件
②-e source:环境变量文件
③-d source:测试数据文件
④-r htmlextra:生成测试报告类型
⑤–report-htmlextra-export report.html:存储报告的路径
注: -e 和 -d是非必须的
如果没有使用 环境,不需要指定 -e
如果没有使用 数据文件(做参数化),不需要指定 -d
接口测试点
功能测试点
单接口功能
一个单独的业务对应一个独立的接口,如登录业务,对应登录接口
- 正向测试
必填参数组合
必填 + 非必填组合
全部参数组合
- 反向测试
- 功能异常
覆盖反向需求
数据格式正确,不能履行接口功能- 数据异常
空、类型不符合、长度不符合- 参数异常
多参、少参、无参或者错误参数
业务场景功能
多个即可欧被连接调用(模拟用户的实际使用场景)
性能测试
- 响应时长
从发送请求到接收到服务器回发响应包所经历的时间
- 错误率
服务器云顶出错的概率
- 吞吐量
服务器 单位时间内 处理请求的数量
- 服务器资源使用率
CPU、内存、网络、磁盘等 硬件资源的占用率
安全测试
- 敏感数据是否加密
- SQL注入
Request
实现接口测试
http请求语法
resp = requests . 请求方法(url = ‘URL地址’,params = (k:v),headers = (k:v),data = (k:v),json = (k:v),cookies = ‘cookie数据’(如:令牌))
- 请求方法:
get请求——get()
post请求——post()
put请求——put()
delete请求——delete()- url:待请求的url——string类型
- params:查询参数——字典
- headers:请求头——字典
- data:表单格式 的请求体——字典
- json:JSON格式的 请求体——字典
- cookies:cookie数据——string类型
- resp:响应结果
cookie
简介:工程师针对http协议是无连接、无状态特性,设计的一种技术,可以在浏览器端 存储用户的信息
特性:
- 用于存储用户临时的不敏感信息
- 位于浏览器(客户端)端,默认大小4k(可以调整)
- 数据可以随意被访问,没有安全性可言
- 存储的数据类型,受浏览器限制
session
简介:也叫会话,通常出现在网络通信中,从 客户端 借助访问 终端 登录上服务器,直到退出 登录所产生的 通信数据,保存在 会话中
特性:
- 用于存储用户的信息
- 位于服务端,直接使用服务器存储空间
- 数据不可以随意被访问,安全性较高
- 存储的数据类型,受服务器影响,几乎能支持所有的数据类型
cookie中的数据,都是session传递的,因此session可以直接 自动管理cookie
获取响应数据
- 获取
url:resp.url
- 获取响应状态码:
resp.status_code
- 获取cookie:
resp.cookies
- 获取响应头:
resp.headers
- 获取响应体:
文本格式:
resp.text
json格式:resp.json()
PyMySQL
操作数据库
事务
是关系型数据库特有的概念
事务可以看做是一个虚拟的容器,在容器中存放一系列的数据库操作,看做一个整体,内部所有的操作,要么一次性全部成功,如果有一个失败,则全部失败
数据库操作实现
- 导包:
import pymysql
- 创建数据库连接:
conn = pymysql.connect(host = "locathost",user = "root",password = "root",database = "books")
- 创建游标对象:
cursor = conn.cursor()
- 执行操作:查询数据库版本信息:
cursor.execute("select version()")
- 获取查询结果:
result = cursor.fetchone()
print("result = ",result)
- 关闭游标对象:
cursor.close()
- 关闭数据连接:
cursor.close()
游标常用方法
- 游标提取数据时,提取游标所在位置下一行,每提取一行数据,自动向下移动
- 从结果集中,提取一行:
fetchone()
-从结果集中,提取size行:fetchmany(size)
- 提取所有结果集:
fetchall()
- 可以设置游标位置:属性
rownumber
接口对象封装
核心思想
- 分层思想:将普通方法实现的分为 接口对象层 和 测试脚本层
- 接口对象层:对接口进行封装,封装好之后,给测试用例层 调用
- 测试用例层:调用接口对象层 封装的方法,拿到响应即可欧,断言进行 接口测试
- 借助 unittest 框架实现
登录接口对象层
- 将动态变化的数据,设计到方法的参数
- 将固定不变的,直接写成方法实现
- 将响应接口,通过返回至传出