1.接口测试
1.1接口概念
接口,打个比方,电脑的usb接口,功能是什么,传输数据的,那么我们程序里面的接口,就是给我们提供功能的方法(说的不严谨,这么理解就行)
1.2接口文档
1. 接口基本信息
- 接口名称:简洁描述接口功能(如 “用户登录接口”“订单创建接口”)
- 接口路径:访问接口的 URL(如
/api/v1/user/login
)- 请求方法:HTTP 方法(GET/POST/PUT/DELETE 等)
- 接口版本:版本号(如 v1/v2),用于迭代管理
- 功能描述:接口的具体用途和业务场景
- 状态:接口是否可用(如 “已上线”“测试中”)
2. 请求参数
- 参数类型:
- 路径参数(如
/user/{id}
中的id
)- 查询参数(如
?page=1&size=10
)- 请求体(Body):JSON/FormData 等格式的参数
- 参数详情:
- 参数名、数据类型(string/int 等)
- 是否必填(必填 / 可选)
- 示例值和说明(如
status
:1 表示启用,0 表示禁用)- 请求头(Header):如认证令牌
Authorization
、数据格式Content-Type
等3. 响应数据
- 响应格式:JSON/XML 等
- 响应状态码:
- HTTP 状态码(200 成功、400 参数错误、500 服务器错误等)
- 业务状态码(如
code: 20001
表示 “用户不存在”)- 响应体结构:
- 字段名、数据类型、说明
- 嵌套结构(如列表、对象)的详细描述
- 成功 / 失败示例:完整的响应数据样例
4. 错误处理
- 常见错误码及含义(如权限不足、参数校验失败)
- 错误响应格式(如
{code: 403, message: "无访问权限"}
)5. 其他补充信息
- 认证方式:如 Token、OAuth2.0 等
- 请求限制:频率限制(如每分钟最多 100 次请求)
- 数据字典:公共参数或枚举值的说明(如性别
gender
:1 男 / 2 女)- 版本变更记录:接口迭代历史(新增字段、废弃参数等)
1.3补充内容(HTTP状态码信息)
HTTP状态码分为 5 类,以三位数字表示,第一位代表类别:
1xx(信息性状态码) - 请求已接收,继续处理
- 100 Continue:服务器已接收请求头,客户端可继续发送请求体
- 101 Switching Protocols:服务器同意切换协议(如 HTTP 切换到 WebSocket)
2xx(成功状态码) - 请求已成功处理
- 200 OK:请求成功(最常见)
- 201 Created:资源创建成功(如 POST 创建用户)
- 204 No Content:请求成功但无返回内容(如 DELETE 删除资源)
- 206 Partial Content:部分请求成功(用于断点续传)
3xx(重定向状态码) - 需要进一步操作完成请求
- 301 Moved Permanently:资源永久迁移到新地址
- 302 Found:资源临时迁移(临时重定向)
- 304 Not Modified:资源未修改,可使用缓存(用于 GET 请求)
- 307 Temporary Redirect:临时重定向,保持原请求方法
4xx(客户端错误状态码) - 请求存在错误
- 400 Bad Request:请求参数错误或格式不正确
- 401 Unauthorized:未认证(如未登录)
- 403 Forbidden:已认证但无权限访问
- 404 Not Found:请求的资源不存在
- 405 Method Not Allowed:请求方法不支持(如用 POST 访问只允许 GET 的接口)
- 408 Request Timeout:请求超时
- 409 Conflict:请求与资源当前状态冲突(如创建已存在的用户)
- 413 Payload Too Large:请求体过大
- 429 Too Many Requests:请求频率超限
5xx(服务器错误状态码) - 服务器处理请求出错
- 500 Internal Server Error:服务器内部错误(最常见)
- 502 Bad Gateway:网关错误(服务器作为网关时收到无效响应)
- 503 Service Unavailable:服务器暂时不可用(如维护中)
- 504 Gateway Timeout:网关超时
2.接口自动化流程
1. 准备阶段
- 需求分析:明确接口功能、参数、响应格式及业务规则,基于接口文档梳理测试点
- 环境搭建:
- 部署测试环境(服务、数据库、中间件等)
- 准备测试工具(如 Postman、JMeter、Python+Requests、Selenium 等)
- 配置依赖(如测试数据、认证令牌、环境变量)
- 测试数据设计:
- 正常场景数据(验证功能正确性)
- 异常场景数据(如参数为空、格式错误、权限不足)
- 边界值数据(如长度限制、数值范围)
2. 脚本 / 用例设计
- 选择实现方式:
- 工具型:Postman 集合(Collections)、JMeter 测试计划
- 代码型:Python(Requests+Pytest)、Java(RestAssured+JUnit)
- 编写测试用例:
- 单接口测试:验证请求参数、响应状态码、响应体字段、数据正确性
- 多接口联动:模拟业务流程(如登录→创建订单→支付)
- 断言设计:校验响应结果(状态码、字段值、数据类型、业务规则)
- 参数化处理:
- 提取动态数据(如登录后的 token、创建资源的 ID)
- 关联接口依赖(前一个接口的输出作为后一个接口的输入)
3. 执行与集成
- 执行测试:
- 本地调试:验证单条 / 批量用例正确性
- 定时执行:设置任务(如每日凌晨全量执行)
- 持续集成(CI):
- 集成到 Jenkins、GitLab CI 等平台
- 代码提交后自动触发接口测试,快速反馈问题
- 并发 / 性能测试:
- 模拟多用户请求(JMeter、Locust)
- 验证接口吞吐量、响应时间、容错能力
4. 结果分析与报告
- 生成报告:
- 工具自带报告(Postman、JMeter)
- 自定义报告(Pytest+Allure 生成可视化报告)
- 结果分析:
- 定位失败用例:区分接口 bug、环境问题、脚本错误
- 统计指标:通过率、执行时长、错误分类
- 缺陷管理:
- 将失败用例关联的问题提交至缺陷系统(如 Jira)
- 跟踪修复进度,回归测试验证
5. 维护与迭代
- 脚本维护:
- 接口变更时更新用例(如参数增减、URL 修改)
- 优化脚本效率(如复用公共方法、减少冗余代码)
- 测试数据更新:
- 清理脏数据(如测试后删除创建的临时资源)
- 补充新场景数据
- 持续优化:
- 增加覆盖率(补充遗漏的业务场景)
- 引入新工具或框架提升效率
3.requests模块
requests
是 Python 中最常用的 HTTP 客户端库,用于简单易用的 API 处理 HTTP 请求
3.1安装
//在终端查看所有安装的包或库
pip list
在终端查看自己有没有这个包
//安装requests包,==前面包名,后面是版本号
pip install requests==2.31.0
没有就使用pip install requests==2.31.0安装一下
3.2发起一个get请求(示例)
发起一个get请求,并打印状态码
import requests
r=requests.get("https://www.baidu.com")
print("状态码:",r.status_code)
3.3Response 对象提供的属性/方法介绍:
发起一个请求,会返回一个Response对象,通过以下方法查看返回的数据
属性/⽅法 | 描述 |
r.status_code | 响应状态码 |
r.content | 字节⽅式的响应体,会⾃动解码gzip和deflate压缩 |
r.headers | 以字典对象存储服务器响应头,若键不存在则返回None |
r.json() | Requests中内置的JSON解析⽅法,将响应体解析为JSON格式 |
r.url | 获取实际请求的URL |
r.encoding | 编码格式,根据响应头部的字符编码确定 |
r.cookies | 获取服务器设置的cookies |
r.raw | 返回原始响应体,不进⾏任何处理 |
r.text | 字符串⽅式的响应体,会⾃动根据响应头部的字符编码进⾏解码 |
r.raise_for_status() | 失败请求(非200响应)抛出异常 |
3.4requests提供的请求方法
1.get请求
import requests
# 带查询参数的GET请求
params = {'page': 1, 'limit': 10}
response = requests.get('https://api.example.com/users', params=params)
print(response.url) # 实际请求地址: https://api.example.com/users?page=1&limit=10
2.post请求
# 发送表单数据
form_data = {'username': 'test', 'password': '123'}
response = requests.post('https://api.example.com/login', data=form_data)
# 发送JSON数据
json_data = {'name': '张三', 'age': 20}
response = requests.post('https://api.example.com/users', json=json_data)
3.put请求
# 更新用户信息(全量更新)
update_data = {'id': 1, 'name': '新名称', 'age': 25} # 需提供完整信息
response = requests.put('https://api.example.com/users/1', json=update_data)
4.patch请求
# 部分更新用户信息(只修改需要变更的字段)
patch_data = {'age': 26} # 仅更新年龄
response = requests.patch('https://api.example.com/users/1', json=patch_data)
5.delete请求
# 删除指定ID的用户
response = requests.delete('https://api.example.com/users/1')
3.5request请求
对于上述的这些请求,都可以使用request请求替代,查看源码可以发现这些请求方法,最终都调用了request方法,调用request时,只需第一个参数指定对应的方法,其他参数传入对应的参数就行
3.6通用参数(** kwargs)
参数名 |
描述 |
url |
请求的接⼝ |
headers |
⼀个字典,包含要发送的HTTP头。 |
cookies |
⼀个字典、列表或者 RequestsCookieJar 对象,包含要发送的cookies。 |
files |
⼀个字典,包含要上传的⽂件。 |
data |
⼀个字典、列表或者字节串,包含要发送的请求体数据。 |
json |
⼀个字典,将被转换为JSON格式并发送。 |
params |
⼀个字典、列表或者字节串,将作为查询字符串附加到URL上。 |
auth |
⼀个元组,包含⽤⼾名和密码,⽤于HTTP认证。 |
timeout |
⼀个浮点数或元组,指定请求的超时时间。 |
proxies |
⼀个字典,包含代理服务器的信息。 |
verify |
⼀个布尔值或字符串,指定是否验证SSL证书。 |
示例代码
headers = {
'Authorization': 'Bearer token123',
'User-Agent': 'Mozilla/5.0'
}
try:
# 带请求头和5秒超时的GET请求
response = requests.get(
'https://api.example.com/data',
headers=headers,
timeout=5
)
except requests.exceptions.Timeout:
print("请求超时")