在 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 / 密码,一定要用 环境变量 存储!
你可以根据自己的需求选择最合适的方法 😊 🚀