pytest的request参数管理
在 pytest 测试用例 (testcase) 中,接口请求参数可以通过 参数化、配置文件、fixtures 或 环境变量 进行管理,保证测试的灵活性和可维护性。以下是几种常见的方法:
✅ 方法 1:使用 pytest.mark.parametrize 参数化
如果你的测试用例需要多个请求参数,可以使用 pytest.mark.parametrize 进行参数化管理。
示例
import pytest
import requests
API_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 json
API_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 requests
API_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 / 密码,一定要用 环境变量 存储!
你可以根据自己的需求选择最合适的方法 😊 🚀


浙公网安备 33010602011771号