pytest的request参数管理

news/2025/3/11 15:39:29/文章来源:https://www.cnblogs.com/SunshineKimi/p/18765177

pytest 测试用例 (testcase) 中,接口请求参数可以通过 参数化配置文件fixtures环境变量 进行管理,保证测试的灵活性和可维护性。以下是几种常见的方法:


✅ 方法 1:使用 pytest.mark.parametrize 参数化

如果你的测试用例需要多个请求参数,可以使用 pytest.mark.parametrize 进行参数化管理。

示例

import pytest
import requestsAPI_URL = "https://api.example.com/login"@pytest.mark.parametrize("username, password, expected_status", [("user1", "pass1", 200),("user2", "wrongpass", 401),("admin", "adminpass", 200)
])
def test_login(username, password, expected_status):response = requests.post(API_URL, json={"username": username, "password": password})assert response.status_code == expected_status

✅ 优势

  • 适合简单的测试数据管理
  • 代码清晰,减少重复代码
  • 支持多组数据测试

✅ 方法 2:从外部 CSV / JSON / YAML 文件读取

如果测试数据较多,推荐从外部文件读取,避免硬编码。

示例

1️⃣ 测试数据 (test_data.json)

[{"username": "user1", "password": "pass1", "expected_status": 200},{"username": "user2", "password": "wrongpass", "expected_status": 401},{"username": "admin", "password": "adminpass", "expected_status": 200}
]

2️⃣ 在 pytest 里读取 JSON 文件

import pytest
import requests
import jsonAPI_URL = "https://api.example.com/login"def load_test_data():with open("test_data.json") as f:return json.load(f)@pytest.mark.parametrize("test_case", load_test_data())
def test_login(test_case):response = requests.post(API_URL, json={"username": test_case["username"], "password": test_case["password"]})assert response.status_code == test_case["expected_status"]

✅ 优势

  • 适合大规模数据管理
  • 测试数据与代码分离,便于维护
  • 可使用 JSON / YAML / CSV 格式存储数据

✅ 方法 3:使用 conftest.py + pytest.fixture 管理请求参数

可以在 conftest.py 里定义 通用的测试数据,然后在测试用例中调用。

示例

1️⃣ conftest.py 配置测试数据

import pytest@pytest.fixture
def login_test_data():return [{"username": "user1", "password": "pass1", "expected_status": 200},{"username": "user2", "password": "wrongpass", "expected_status": 401},{"username": "admin", "password": "adminpass", "expected_status": 200}]

2️⃣ 在 test_login.py 里使用 fixture

import requestsAPI_URL = "https://api.example.com/login"def test_login(login_test_data):for test_case in login_test_data:response = requests.post(API_URL, json={"username": test_case["username"], "password": test_case["password"]})assert response.status_code == test_case["expected_status"]

✅ 优势

  • 避免重复定义测试数据
  • 适用于共享数据
  • fixture 可以灵活扩展

✅ 方法 4:使用 .env 环境变量存储敏感信息

如果请求参数涉及敏感数据(如 API Key),可以存入环境变量或 .env 文件。

示例

1️⃣ 创建 .env 文件

API_URL=https://api.example.com
USERNAME=admin
PASSWORD=adminpass

2️⃣ 使用 python-dotenv 读取环境变量

import os
import requests
from dotenv import load_dotenv# 加载环境变量
load_dotenv()API_URL = os.getenv("API_URL")
USERNAME = os.getenv("USERNAME")
PASSWORD = os.getenv("PASSWORD")def test_login():response = requests.post(API_URL, json={"username": USERNAME, "password": PASSWORD})assert response.status_code == 200

✅ 优势

  • 适用于 API Key / 认证信息
  • 避免敏感数据暴露在代码中
  • .env 文件不应提交到 Git,可添加到 .gitignore

🚀 总结

方法适用场景优势
pytest.mark.parametrize 小规模参数管理 代码简洁,直接在测试用例中定义
读取 JSON / CSV / YAML 需要管理大量测试数据 数据与代码分离,便于维护
pytest.fixture (conftest.py) 共享测试数据 适合多个测试用例共享参数
.env 环境变量 需要存储 API Key / 认证信息 安全,避免敏感数据泄露

如果你的测试参数较少,pytest.mark.parametrize 就够用了。
如果有大量测试数据,推荐使用 JSON / CSV / YAML 文件,或者 pytest.fixture 进行集中管理。
如果涉及 API Key / 密码,一定要用 环境变量 存储!

你可以根据自己的需求选择最合适的方法 😊 🚀

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/897294.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Pwnable_orw

题源题解 保护只开启了栈保护 分析 进入ida分析 main函数如下seccomp (Secure Computing Mode)是一种 Linux 内核安全机制,它可以 限制进程可执行的系统调用(syscall),用于减少攻击面,提高程序安全性。使用seccomp-tools查看允许调用的函数,即orw(open,read,write) sec…

日期类、Date、Calendar、IO 流、File

DAY9.2 Java核心基础 日期类 java对日期使用提供了良好的封装,包括java.util.Date和java.util.Calender Date Date类使用比较简单,直接通过构造函数实例化对象接口,Date对象标识当前的系统时间,默认的格式并不是我们所熟悉的,一般我们需要对他进行格式化处理,将日常的展现…

深入String、StringBuffer、String 实例化有两种方式、String、StringBuffer常用方法

DAY9.1 Java核心基础 String String 开发使用的频率高 String 实例化有两种方式1、直接赋值 String str1 ="Word";2、通过构造函数创建对象 String str2 =new String("Word");字符串对象底层的基本数据类型是char 比如Word,是char[] str ={W,o,r,d}; 两种…

File类、字节字符流、InputStream和FileReader、OutputStream和FileWriter区别

DAY10.1 Java核心基础 File类 使用该类的构造函数可以创建一个对文件对象表示一个物理资源 File类常用方法方法 描述public File(String pathname) 根据路径创建对象public String getName() 获取文件名public String getParent() 获取文件所在的目录public File getParentFile…

FreeBSD 13.5 正式版发布 - 高性能开源 Unix 系统

FreeBSD 13.5 正式版发布 - 高性能开源 Unix 系统FreeBSD 13.5 正式版发布 - 高性能开源 Unix 系统 The Power To Serve 请访问原文链接:https://sysin.org/blog/freebsd-13/ 查看最新版。原创作品,转载请保留出处。 作者主页:sysin.orgFreeBSD 13.5-RELEASE 公告 日期:202…

FreeBSD 13.5 x86_64 OVF (sysin) - VMware 虚拟机模板

FreeBSD 13.5 x86_64 OVF (sysin) - VMware 虚拟机模板FreeBSD 13.5 x86_64 OVF (sysin) - VMware 虚拟机模板 The Power To Serve 请访问原文链接:https://sysin.org/blog/freebsd-13-ovf/ 查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org2025 年 3 月 11 日,F…

2. 创建一个按钮组件

在deepseek中输入:创建一个vue组件 组件实现button的功能 预设4种颜色,分别对应:success: 绿色,危险按钮:红色,警告按钮:橘色,信息按钮:灰色 预设几个带icon的按钮,分别是:搜索,确定,取消,删除,上一页,下一页,分享,编辑 需要让调用该组件是可以自定义一些属性…

MySQL:CentOS 7 Docker 联网安装 MySQL

1. 创建mysql挂载目录 mkdir -p /home/data/mysql/config/ 配置目录挂载 mkdir -p /home/data/mysql/data/ 数据目录挂载 2. 在config目录下创建字符集文件 vim /home/data/mysql/config/my.cnf 填写 [mysqld] user=mysql character-set-server=utf8 [client] default-ch…

项目经理私藏!2025年10款小众但超实用的管理神器

在项目管理的江湖中,15 年的实战经验就像是一本活的百科全书,见证了无数项目的起起落落。想象一下,在一个大型建筑项目中,原本计划有序的施工突然因为材料供应不及时而陷入混乱,工期眼看着就要延误,成本也开始失控。这时候,一位经验丰富的项目经理凭借着他独特的管理工具…

SQLServer 死锁排查

适用于2012及以上版本一、创建扩展事件会话 CREATE EVENT SESSION [Deadlock_Monitor] ON SERVER ADD EVENT sqlserver.xml_deadlock_report ADD TARGET package0.event_file(SET filename=NDeadlock_Monitor.xel) WITH (STARTUP_STATE=ON); GO ALTER EVENT SESSION [Deadloc…

Eureka服务注册发现源码流程简析

一: 服务的注册客户端通过执行InstanceInfoReplicator#run()调用DiscoveryClient#register()发送http请求进行注册 InstanceInfoReplicator 是同于更新同步当前服务到服务端的任务实现 //A task for updating and replicating the local instanceinfo to the remote server.//…

高等数学笔记

唉...本蒟蒻也是要考研了, 目前目标是深圳大学, 想研究的方向偏算法多一点, 深度学习强化学习什么的, 我会尽最大努力了 9 做到一个新的问题,想起与过去某个问题类似。发现在解答中,对此类问题,以及工具和方法的理解是存在缺陷的,或者发现理解不够深刻。于是通过解决新的…