【接口自动化测试】requests 模块

文章目录

  • [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())

运行结果如下所示:

以博客园接口为例: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 框架来组织、执行和管理测试用例。