接口自动化测试以及requests

发布于:2025-08-01 ⋅ 阅读:(20) ⋅ 点赞:(0)

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 类,以三位数字表示,第一位代表类别:

 
  1. 1xx(信息性状态码) - 请求已接收,继续处理

    • 100 Continue:服务器已接收请求头,客户端可继续发送请求体
    • 101 Switching Protocols:服务器同意切换协议(如 HTTP 切换到 WebSocket)
  2. 2xx(成功状态码) - 请求已成功处理

    • 200 OK:请求成功(最常见)
    • 201 Created:资源创建成功(如 POST 创建用户)
    • 204 No Content:请求成功但无返回内容(如 DELETE 删除资源)
    • 206 Partial Content:部分请求成功(用于断点续传)
  3. 3xx(重定向状态码) - 需要进一步操作完成请求

    • 301 Moved Permanently:资源永久迁移到新地址
    • 302 Found:资源临时迁移(临时重定向)
    • 304 Not Modified:资源未修改,可使用缓存(用于 GET 请求)
    • 307 Temporary Redirect:临时重定向,保持原请求方法
  4. 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:请求频率超限
  5. 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("请求超时")


网站公告

今日签到

点亮在社区的每一天
去签到