接口自动化—requests模块
目录
1.介绍
1.1概念
接口自动化是通过对接口进行测试和模拟,以确保软件系统内部的各个组件能够正确地相互通信和交换数据。接口自动化测试可以显著提高测试效率和准确性。因为接口测试专注于测试系统内部的逻辑和数据传输,而不是像 UI 测试那样关注用户的操作和交互。同时,由于接口测试直接针对系统内部的结构和功能,可以更容易地发现和定位问题,减少测试成本和时间。
1.2 接口自动化流程
1.2.1分析接口信息
- 分析请求:明确接口的 URL、请求方法(如 GET、POST、PUT、DELETE 等)、请求头、请求参数和请求体等信息。
- 分析响应:确定接口返回的数据格式、状态码以及可能的错误信息。
1.2.2挑选自动化接口
-
根据项目的时间、人员安排和接口的复杂度,挑选适合自动化测试的接口。
-
优先选择核心业务接口、频繁使用的接口以及容易出错的接口进行自动化测试。
-
挑选依据:
- 功能复杂度:优先选择功能复杂、逻辑分支多的接口。例如,涉及多种支付方式、多种订单状态转换的订单管理接口,手动测试难以全面覆盖所有场景,自动化测试可更高效地完成测试。
- 高风险功能:选择对业务影响大、风险高的接口,确保其稳定性和可靠性。例如,涉及资金操作的支付接口,一旦出现问题可能导致严重经济损失,需进行充分的自动化测试。
- 重复性高:对于需要频繁执行的测试任务(如回归测试中的接口测试),自动化测试可避免重复手动测试的繁琐和低效,提高测试效率。
-
示例(在线教育平台接口):
| 接口名称 | 功能描述 | 功能复杂度 | 高风险功能 | 重复性高 |
|---|---|---|---|---|
| 登录接口 | 用户登录系统 | 中 | 是 | 是 |
| 新增课程接口 | 添加新的课程 | 高 | 是 | 是 |
| 查询课程接口 | 根据条件查询课程 | 高 | 是 | 是 |
| 修改课程接口 | 修改课程信息 | 高 | 是 | 是 |
| 删除课程接口 | 删除课程 | 中 | 是 | 是 |
| 用户注册接口 | 用户注册 | 中 | 是 | 是 |
| 用户信息查询接口 | 查询用户信息 | 中 | 是 | 是 |
| 用户信息修改接口 | 修改用户信息 | 中 | 是 | 是 |
| 课程购买接口 | 用户购买课程 | 高 | 是 | 是 |
| 验证码接口 | 获取登录验证码 | 中 | 中 | 中 |
| 合同上传接口 | 上传合同 | 中 | 中 | 中 |
| 添加合同接口 | 添加新的合同 | 中 | 中 | 中 |
| 合同列表接口 | 查询合同列表 | 中 | 中 | 中 |
| 课程评价接口 | 用户对课程进行评价 | 中 | 中 | 中 |
| 课程评论接口 | 用户对课程发表评论 | 中 | 中 | 中 |
| 课程收藏接口 | 用户收藏课程 | 中 | 中 | 中 |
- 各维度详细说明:
- 功能复杂度:
- 新增课程接口:涉及多个参数(课程名称、课程描述、课程价格等),需要与其他模块(如课程分类模块)交互。
- 查询课程接口:支持多种查询条件(课程名称、课程类型、课程状态等),逻辑复杂。
- 课程购买接口:涉及支付流程、订单生成等复杂逻辑。
- 高风险功能:
- 登录接口:用户登录是系统的核心功能,任何问题都会影响用户体验。
- 新增课程接口:课程信息的正确性直接影响平台的运营。
- 用户注册接口:用户注册是系统的基础功能,任何问题都会影响用户获取服务。
- 重复性高:
- 登录接口:用户每次使用系统都需要登录。
- 查询课程接口:用户频繁查询课程信息。
- 用户信息查询接口:用户经常查看自己的信息。
- 功能复杂度:
1.2.3设计自动化测试用例
如果在功能测试阶段已经设计了测试用例,可以直接拿来使用。
根据接口需求和功能,设计正向测试用例(正常场景)和反向测试用例(异常场景),包括边界值测试、参数组合测试等。
1.2.4搭建自动化测试环境
选择合适的编程语言(如 Python、Java 等)和开发环境(如 PyCharm、IntelliJ IDEA 等)来实现自动化测试。
以 Python 为例,安装必要的依赖库,如 requests 用于发送 HTTP 请求,pytest 用于测试框架。
1.2.5设计自动化执行框架
设计一个框架来执行测试用例,包括报告生成、参数化处理和用例执行逻辑。
1.2.6编写代码
根据设计好的测试用例和框架,编写自动化测试脚本。
1.2.7执行用例
使用测试框架(如 unittest、pytest)来执行编写的测试用例。
2.第一个接口自动化
2.1requests模块的安装
requests模块
pip install requests==2.31.0

2.2requests模块介绍
requests 库是一个非常流行的 HTTP 客户端库,用于发送 HTTP 请求。
requests.get 方法用于发送一个 HTTP GET 请求到指定的 URL。
requests.get 方法返回一个 Response 对象,这个对象包含了服务器返回的所有信息。
2.3Response 对象的属性与方法介绍
| 属性 / 方法 | 描述 |
|---|---|
| r.status_code | 响应状态码(如 200 表示成功,404 表示资源不存在等) |
| r.content | 字节方式的响应体,会自动解码 gzip 和 deflate 压缩格式 |
| r.headers | 以字典对象存储服务器响应头,若访问的键不存在则返回 None |
| r.json() | Requests 内置的 JSON 解析方法,将响应体解析为 JSON 格式数据 |
| r.url | 获取实际请求的 URL(可能与初始请求 URL 不同,如存在重定向时) |
| r.encoding | 响应内容的编码格式,根据响应头部的字符编码信息自动确定 |
| r.cookies | 获取服务器设置的 cookies 信息 |
| r.raw | 返回原始响应体,不进行任何解码或处理(需配合stream=True使用) |
| r.text | 字符串方式的响应体,会自动根据r.recoding指定的编码进行解码 |
| r.raise_for_status() | 对失败请求(状态码非 200)抛出HTTPError异常,用于主动捕获请求错误 |
2.4代码实现
示例:对百度接口进行请求
import requests
r=requests.get("https://www.baidu.com")
r.encoding = 'utf-8'
print(r.status_code)
print(r.text)

注意:html不能打印JSON格式,JSON格式也不能打印text格式。

2.5常见的请求方法
#发起get请求
def get(url, params=None, **kwargs)
#发起post请求
def post(url, data=None, json=None, **kwargs)
#⽀持不同请求⽅式,method:指定请求⽅法,
#⽀持``get``, ``OPTIONS``, ``HEAD``, ``post``, ``PUT``, ``PATCH``, or ``DELETE``
def request(method, url, **kwargs)
示例;
import requests
get_r = requests.get("https://www.baidu.com")
post_r = requests.post("https://www.baidu.com")
req_r1 = requests.request(method="get", url="https://www.baidu.com")
req_r2 = requests.request(method="post", url="https://www.baidu.com")
print("get:", get_r.status_code)
print("post:", post_r.status_code)
print("method_get:", req_r1.status_code)
print("method_post:", req_r2.status_code)

2.6添加请求信息
get ()、post () 底层均调用 request () 方法,因此三者在发送请求时的参数传递方式基本一致,可传递的主要参数如下:


| 参数名 | 描述 |
|---|---|
| url | 请求的接口 |
| headers | 一个字典,包含要发送的 HTTP 头 |
| cookies | 一个字典、列表或者 RequestsCookieJar 对象,包含要发送的 cookies |
| files | 一个字典,包含要上传的文件 |
| data | 一个字典、列表或者字节串,包含要发送的请求体数据 |
| json | 一个字典,将被转换为 JSON 格式并发送 |
| params | 一个字典、列表或者字节串,将作为查询字符串附加到 URL 上 |
| auth | 一个元组,包含用户名和密码,用于 HTTP 认证 |
| timeout | 一个浮点数或元组,指定请求的超时时间 |
| proxies | 一个字典,包含代理服务器的信息 |
| verify | 一个布尔值或字符串,指定是否验证 SSL 证书 |
params:用于在 URL 中传递查询参数(Query Parameters),通常用于 GET 请求,但也可用于其他类型的请求。
json:用于在请求体(Body)中传递 JSON 格式的数据,通常用于 POST 或 PUT 请求。
data:用于在请求体(Body)中传递表单数据,通常用于 POST 或 PUT 请求。
博客列表详情页 GET请求
#博客列表详情页 GET请求
#http://8.137.19.140:9090/blog/getBlogDetail?blogId=138509 url拼接
url="http://8.137.19.140:9090/blog/getBlogDetail"
param={
"blogId":138770
}
#定义请求头
token_header={
"user_token_header":"eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwidXNlck5hbWUiOiJ6aGFuZ3NhbiIsImV4cCI6MTc1NDQ1ODUzM30.rj1vToBkjWbrcyWVNPj5ES4iSfvGfW5vA7CWtjVpels"
}
r=requests.request(method="GET",url=url,params=param,headers=token_header)
print(r.json())

博客登录页 POST请求
# 博客登录页 POST请求
url="http://8.137.19.140:9090/user/login"
data = {
"username":"zhangsan",
"password":"123456"
}
r=requests.request(method="POST",url=url,data=data)
print(r.json())

若参数上传格式选择为 json 格式, Content-Type 会自动被设置为 application/json

3.总结

更多推荐



所有评论(0)