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 / 密码,一定要用 环境变量 存储!

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

posted @ 2025-03-11 15:35  不带R的墨菲特  阅读(100)  评论(0)    收藏  举报