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

然后在命令行使用下面的命令来安装 requests 包:
shell
# 查看已经安全
示例:对百度接口发起请求
python
import requests
r = requests.get("https://www.baidu.com")
print(r)
返回值:
json
<Response [200]>
如下所示:

4. requests模块
4.1 安装
命令行通过 pip 工具进行安装,命令:
bash
# 建议安装统一版本
pip install requests==2.31.0
安装成功示例:

检查当前项目下包是否更新:

4.2 介绍
requests 库是一个非常流行的 HTTP 客户端库,用于发送 HTTP 请求。requests.get 方法用于发送一个HTTP 的 GET 请求到指定的 URL。requests.get 方法返回一个 Response 对象,这个对象包含了服务器返回的所有信息。
如下所示:

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响应)抛出异常 |
4.3 常见请求方法
代码如下所示:
python
# 发起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)
使用示例:
python
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)
运行结果如下:

4.4 添加请求信息
get()、post() 底层都是调用 request() 方法,因此这三个方法在发送请求时,传参无太大区别,可传递的参数如下:
| 参数名 | 描述 |
|---|---|
url |
请求的接口 |
headers |
一个字典,包含要发送的HTTP头 |
cookies |
一个字典、列表或者 RequestsCookieJar 对象,包含要发送的cookies |
files |
一个字典,包含要上传的文件 |
data |
一个字典、列表或者字节串,包含要发送的请求体数据 |
json |
一个字典,将被转换为JSON格式并发送 |
params |
一个字典、列表或者字节串,将作为查询字符串附加到URL上 |
auth |
一个元组,包含用户名和密码,用于HTTP认证 |
timeout |
一个浮点数或元组,指定请求的超时时间 |
proxies |
一个字典,包含代理服务器的信息 |
verify |
一个布尔值或字符串,指定是否验证SSL证书 |
4.4.1 示例一:博客详情接口
首先需要拿到 User_token_header(用户登录凭证)

代码如下所示:
python
'''
请求博客详情页接口
必须要先登录 --> 然后在请求头添加用户登录凭证(User_token_header)
带有参数
'''
url = "http://121.196.200.210:8080/blog/getBlogMessage"
# 定义查询参数
params = {
"blogId": 2
}
# 定义请求头信息
header = {
"usertokenheader":"eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwidXNlck5hbWUiOiJ6aGFuZ3NhbiIsImV4cCI6MTc3ODc1MTE5M30.atkDG3UYE7IPxjQd7HwQNrVsy5Y89uhVLMWBIBnPaAg"
}
# 使用GET方式请求
r = requests.request(url=url, params=params, headers=header, method='GET')
print(r.json())
结果如下所示:

4.4.2 示例二:博客登录接口
代码如下所示:
python
'''
博客系统登录接口
POST 表单格式
'''
url = "http://121.196.200.210:8080/user/login"
data = {
"userName": "zhangsan",
"password": "123456"
}
r = requests.request(method="POST",url=url, data=data)
print(r.json())
运行结果如下所示:

4.4.3 示例三:添加 cookie 信息
以博客园接口为例:userinfo
未登录状态下接口返回值:

登录状态下接口返回值:

代码如下所示:
python
'''
博客园用户详情页
添加用户登录凭证--cookie(.Cnblogs.AspNetCore.Cookies)
'''
url = "https://account.cnblogs.com/user/userinfo"
cookie = {
".Cnblogs.AspNetCore.Cookies":"CfDJ8OBZrxGJLy5MvghieKIKXCxbUmIkNTWX8sFnVgjSYCK2xJeRRRkWqJpqml3XWNmu3h_h2ZF3JQfhpPEwc8yqABU5rTqRfr-02D0yGdZBQaGyWq2-ArdENUlfGM81xX6aGUq3rcpt84qAyN0ybJF9ZR5VSiedSoHJJV8VXFvsUSJkWiHbdITWfR0ZpmxvcGkEsxMDu0lYKxcn_BdaSC-RgZyOLM9KX28IgLqwHXcw-Js-YjSYZT68CpMs6awhj8wmxzRxztaHetu_zZHq-zevyw_N9037Z6XNfBTox8M_bManwl5oV6dY8G9PrhKbadQIfvvX-AKP8mZLLyCVvUDooEGWLYgCb1wyc9FBWMua0y-96Sf2rv_-RBsJPZFCR0EuHlWoHqvct7fa2Z9JdnAMFzUdjc0Yv3coRcwRg8k2n-72RsgMLCy7BmYe0puqFS8QqGNrpCcUOOkIO85-aNr0fbywN1ErrMdx283X7B8ROPTtJ8vr_AsDFItcPUdLiZFBzVnWibu-UWJ5vGGl-WdnkEch46v1NaqYjDkOBzE-NmM5hB9ZKHeVmMlHNIFNzaQAHA;"
}
r = requests.request(method="GET",url=url,cookies=cookie)
print(r.text)
运行结果如下所示:

参数选择说明问题:上传参数选择 params、json 还是 data?
- params:用于在 URL 中传递查询参数(Query Parameters),通常用于 GET 请求,也可用于其他请求。
- json:用于在请求体(Body)中传递 JSON 格式的数据,通常用于 POST 或 PUT 请求。若选择 json 格式,Content-Type 会自动被设置为 application/json。
- data:用于在请求体(Body)中传递表单数据,通常用于 POST 或 PUT 请求。
requests 库专注于 HTTP 请求的发送,而自动化测试中,需要用 pytest 框架来组织、执行和管理测试用例。