接口自动化测试
概念
接口自动化是通过对接口进行测试和模拟,以确保软件系统内部的各个组件能够正确的互相通信和交换数据。接口自动化测试可以显著提高测试效率和准确性。因为接口测试专注于测试系统内部的逻辑和数据传输,而不是像UI测试那样关注用户的操作和交互。同时,由于接口测试直接针对系统内部的结构和功能,可以更容易的发现和定位问题,减少测试成本和时间
接口自动化流程
需求分析
- 分析请求:明确接口的URL、请求方法(如get、post、PUT、DELETE等)、请求头、请求参数和请求体等信息。
- 分析响应:确定接口返回的数据格式、状态码以及可能的错误信息。
挑选自动化接口
- 根据项目的时间、人员安排和接口的复杂度,挑选适合自动化测试的接口
- 优先选择核心业务接口、频繁使用的接口以及容易出错的接口进行自动化测试
功能复杂度: 优先选择功能复杂、逻辑分支多的接口进行自动化测试。例如,涉及多种支付方式、多种订单状态转换的订单管理接口,手动测试难以全面覆盖所有场景,自动化测试可以更高效的进行测试
高风险功能: 选择对业务影响大、风险高的接口进行自动化测试,确保其稳定性和可靠性
。例如,涉及资金操作的支付接口,一旦出现问题可能导致严重的经济损失,因此需要进行充分的自动化测试
重复性高: 对于需要频繁执行的测试任务,如回归测试中的接口测试,自动化测试可以避免重复手动测试的繁琐和低效,提高测试效率
假设我们正在开发一个在线网课平台,该平台包含以下接口

-
功能复杂度:
新增课程接口: 涉及多个参数(课程名称、课程描述、课程价格等),需要与其他模块(如课程分类模块)交互
查询课程接口: 支持多种查询条件(课程名称、课程类型、课程状态等),逻辑复杂。
课程购买接口: 涉及支付流程、订单生成等复杂逻辑 -
高风险功能:
登录接口: 用户登录是系统的核心功能,任何问题都会影响用户体验
新增课程接口: 课程信息的正确性直接影响平台的运营
用户注册接口: 用户注册是系统的基础功能,任何问题都会影响用户获取服务 -
重复性高的功能:
登录接口: 用户每次使用系统都需要登录
查询课程接口: 用户频繁查询课程信息
用户信息查询接口: 用户注册是系统的基础功能,任何问题都会影响用户获取服务
设计自动化测试用例
- 如果在功能测试阶段已经设计了测试用例,可以直接拿来使用
- 根据接口需求和功能,设计正向测试用例(正常场景)和反向测试用例(异常场景),包括边界值测试、参数组合测试等
搭建自动化测试环境
- 选择合适的编程语言(如Python、Java等)和 开发环境 (如PyCharm、IntelliJ IDEA等)来实现自动化测试
- 以Python为例,安装必要的依赖库,如requests用于发送HTTP请求,pytest用于测试框架
设计自动化执行框架
- 设计一个框架来执行测试用例,包括报告生成、参数化处理和用例执行逻辑
编写代码
- 根据设计好的测试用例和框架,编写自动化测试脚本
执行用例
- 使用测试框架(如unittest、pytest)来执行编写的测试用例
requests 库
requests 库是一个非常流行的 HTTP 客户端库,用于发送 HTTP 请求。requests.get 方法用于发送一个HTTP get 请求到指定的 URL
requests.get 方法返回一个 Response 对象,这个对象包含了服务器返回的所有信息

Response 对象提供的属性/方法介绍:

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 post 的底层调用,其实就是request方法
# 因此也可以使用 request 方法 并且指定 method, 获得相同的结果
get = requests.get("http://www.baidu.com")
post = requests.post("http://www.baidu.com")
req_get = requests.request('get', 'http://www.baidu.com')
req_post = requests.request(method='post', url='http://www.baidu.com')
# python 传递参数时,可以不按顺序
# req_post = requests.reques(url='http://www.baidu.com', method='post')
print("get:",get)
print("post:",post)
print("req_get:",req_get)
print("req_post:",req_post)
添加请求信息
get()、post ()都是调用request()方法,因此这三个方法在发送请求是时,传承无太大区别,可传递的参数展示如下:

问题:上传参数选择params、json还是data?
params 用于在URL中传递查询参数,通常用于GET请求,但也可以用于其他类型的请求
json 用于在请求体(Body)中传递JSON 格式的数据,通常用于POST 或 PUT 请求
data 用于在请求体(Body)中传递表单数据,通常用于POST 或 PUT 请求
💡若参数上传格式为 json 格式,Content-Type 会自动被设置为 application/json
有了 requests 库,可以实现对接口发起 http 请求,然而自动化测试中,我们需要编写大量的测试用例,这些用例的组织、执行和管理也需要使用其他更强大的框架------pytest框架
requests库专注于HTTP请求的发送,而pytest框架则提供了测试的组织、执行和管理功能
自动化框架pytest
pytest官方文档:https://docs.pytest.org/en/stable/getting-started.html
pytest 是一个非常流行且高效的Python 测试框架,它提供了丰富的功能和灵活的用法,使得编写和运行测试用例变得简单而高效
为什么选择pytest:
- 简单易用:pytest 的语法简洁清晰,对于编写测试用例非常友好
- 强大的断言库:pytest 内置了丰富的断言库,可以轻松地进行测试结果的判断
- 支持参数化测试:pytest 支持参数化测试,允许使用不同的参数多次运行同一个测试函数,这大大提高了测试效率
- 丰富的插件生态系统:pytest 有着丰富的插件生态系统,可以通过插件扩展各种功能,比如覆盖率测试、测试报告生成(如 pytest-html 插件可以生成完美的HTML 测试报告)、失败用例重复执行(如 pytest- rerunfailures 插件 等)。此外,pytest 还支持与 selenium、requests、appinum等结合,实现Web自动化、接口自动化、App自动化测试
- 灵活的测试控制:pytest 允许跳过指定用例,或对某些预期失败的case 标记成失败,并支持重复执行失败的case
用例运行规则
💡
- 文件名必须以 test_开头 或者 _test 结尾
- 测试类必须以Test 开头,并且不能有 _ _ init _ _ 方法
- 测试方法必须以 test 开头
当满足以上要求后,可通过命令行参数pytest 直接运行符合条件的用例:
由于 pytest 的测试收集机制,测试类中不可以定义 _ _ init _ _ 方法。pytest 采用自动发现机制来收集测试用例。它会自动实例化测试类并调用其所有以 test 开头的方法 作为测试用例。如果测试类中定义了 _ _ init _ _ 方法,那么当pytest 实例化该类时,_ _ init _ _ 方法会被调用,这可能会掩盖测试类的实际测试逻辑,并引入额外的副作用,影响测试结果的准确性
pytest 命令参数
pytest 提供了丰富的命令行选项来控制测试的执行。以下是一些常用的 pytest 命令行参数及其使用说明。

问题:当我们既要详细输出,又要指定文件时,命令会很长,而且每次运行都需要手动输入命令,如果解决?
将需要的相关配置参数统一放在 pytest 配置文件中。
pytest 配置文件
在当前项目下创建 pytest.ini 文件,该文件为 pytest 的配置文件,以下为常见的配置选项:


找到cases 文件下 以 case_ 开头的文件 ,A_ 类名下的,以 A_开头的测试用例,进行详细输出并打印 print 结果