【接口自动化测试】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 执行用例

使用测试框架(如 unittestpytest)来执行编写的测试用例。

2.8 生成测试报告

测试完成后,生成测试报告。可以使用工具如 HtmlTestRunnerAllure 来生成易于阅读的报告。

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 框架来组织、执行和管理测试用例。