用更适合yaml的方式对requests响应进行断言

概述

最近一直在捣鼓 gh action 和 k8s,学习了大量的 yaml 使用示例。

不知不觉对 yaml 有了更深的感受,于是尝试做了一个新工具,旨在用更适合 yaml 的方式对 requests 响应进行断言

理想中用于接口测试的 yaml 大概是这样子

test_name: 访问百度首页         # 用例名称steps:                   # 用例步骤   - request:             # 步骤1:发送请求      method: get              url: https://www.baidu.com     - response:           # 步骤2:断言响应      status_code: 200       text: "*baidu*"

其中:

  • namesteps 字段交给 pytest 处理

  • request 字段交给 requests 处理

  • response 字典交给 本工具处 理

简而言之,本工具实现了像 requests 那样,可以通过 yaml 来编写简单、直观的参数,

用户只需传递这些参数即完成对接口的断言,而不是编写大量的 Python 代码对参数进行判断和处理

除了 requests 外,本工具亦支持和 requests 相同接口的其他接口请求库(例如 HTTPX)

安装

本工具名为 responses-validator,暂只支持 python 3.12

安装命令如下

pip install responses-validator

为了演示本文,还需安装依赖(在实际项目,大概你已经安装过了)

pip install requests pytest-yaml-sanmu

基本用法

首先创建两个文件

第一个:配置文件 pyetst.ini

[pytest]
run_yaml_case = 1
log_file = pytest.loglog_file_level = infolog_file_format   = %(levelname)-8s %(asctime)s [%(name)s:%(lineno)s]  : %(message)slog_file_date_format  = %H:%M:%S

第二个:pytest 钩子 conftest.py

图片

conftest 内容(双击可放大)

自此准备工作已经就绪,接下来进行接口请求和断言    

断言成功的例子

创建测试用例 test_basic.yaml, 内容如下

test_name: 访问百度首页         # 用例名称steps:                   # 用例步骤  - request:             # 步骤1:发送请求      method: get      url: https://www.baidu.com  - response:           # 步骤2:断言响应      status_code: 200      text: "*baidu*"

然后执行用例

pytest

执行结果和日志内容如下

图片

pytest 执行结果(双击可放大)

图片

日志文件内容(双击可放大)

这表示接口响应完全预期(状态码:200;响应正文:包含 "baidu"),

断言通过!

断言失败的例子

创建测试用例 test_failed.yaml, 内容如下

test_name: 访问百度首页         # 用例名称steps:                   # 用例步骤  - request:             # 步骤1:发送请求      method: get      url: https://www.baidu.com  - response:           # 步骤2:断言响应      status_code: 404      text: "*sanmu*"

注意这一次,我们修改了 response 字段的内容,

即使用了新的断言条件:

  • 状态码:404

  • 响应正文:包含 sanmu

然后执行用例

pytest

执行结果和日志内容如下

图片

pytest 执行结果(双击可放大)

图片

日志文件内容(双击可放大)

这表示接口响应不符合预期(状态码和 响应正文 均不符合),

断言失败!

将日志等级调整为 DEBUG 后,可以看到详细的信息

图片

响应断言的 DEBUG 日志(双击可放大)

由日志内容可见:

responses-validator 会根据参数,分别对响应的状态码(status_code)、响应头(headers)、响应正文(text)、JSON 内容(json)进行匹配,

如果任一项,状态是失败(False),则判断测试失败

如果全部项,状态是成功( True),则判断为测试通过

除了状态码外,其他的断言方式都是【可选】,

如果参数值中没有对某个内容进行断言,则匹配状态【忽略】,不参与判断

关于断言的高级用法请见后文更新,敬请关注

原创不易,喜欢请星标+点赞+在看,关注公众号《测试开发研习社》,不错过技术干货,谢谢鼓励!

### 使用 YAML 文件进行接口自动化测试中的断言 在接口自动化测试中,可以通过 YAML 文件定义预期的结果,并将其作为断言条件的一部分。以下是具体实现方法: #### 定义 YAML 文件 假设有一个 `assert.yml` 的文件,其中包含了期望的返回值或状态码等内容。例如: ```yaml - name: 登录成功断言 assert: status_code: 200 response_data: code: 0 message: 成功 ``` 该 YAML 文件表示对于某个接口的响应,我们需要验证其 HTTP 状态码是否为 200,以及 JSON 响应体中的字段 `code` 是否为 0 和 `message` 是否为 "成功"[^4]。 #### 编写 Python 测试代码 下面是一个基于 PytestYAML 数据驱动的示例代码,展示如何从 YAML 中读取断言条件并应用到实际测试中: ```python import pytest import requests from TestPatient.YamlUtil import YamlUtil class TestApi: # 加载 YAML 文件中的断言数据 @pytest.mark.parametrize("info", YamlUtil().read_yaml_func('assert.yml')) def test_api_assert(self, info): """ 执行 API 请求并通过 YAML 配置进行断言 :param info: 来自 YAML 文件的断言信息 """ # 获取请求参数和断言条件 request_info = info.get('request', {}) assert_info = info.get('assert', {}) # 发起请求 method = request_info['method'] url = request_info['url'] headers = request_info.get('headers', {}) body = request_info.get('body', None) response = requests.request(method=method, url=url, json=body, headers=headers) # 断言 HTTP 状态码 expected_status_code = assert_info.get('status_code') actual_status_code = response.status_code assert actual_status_code == expected_status_code, f"HTTP Status Code 不匹配,期望 {expected_status_code} 实际 {actual_status_code}"[^3] # 如果有额外的 JSON 字段断言,则逐一校验 if 'response_data' in assert_info: try: resp_json = response.json() for key, value in assert_info['response_data'].items(): assert resp_json[key] == value, f"{key}: 值不匹配,期望 {value}, 实际 {resp_json[key]}" except KeyError as e: raise AssertionError(f"JSON Response 缺少键 {e}") ``` 在这个例子中,我们通过 `YamlUtil.read_yaml_func()` 函数加载了 YAML 文件的内容,并从中提取了请求参数和断言条件。随后发起了一个 HTTP 请求并将响应YAML 文件中指定的断言条件进行了比较[^2]。 #### 关于断言的具体说明 1. **HTTP 状态码**:通常需要确认服务器返回的状态码是否符合预期。 2. **JSON 响应体**:如果接口返回的是 JSON 格式的数据,则可以根据业务需求逐层解析并对比特定字段的值。 3. **其他可能的断言**:还可以扩展多的断言逻辑,比如时间戳范围、数组长度等[^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值