You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Pytest @pytest.mark.parametrize()批量测试DRF POST请求字段

使用Pytest参数化批量测试DRF的addressstate字段

直接上改造后的实现方案,把重复的测试逻辑合并成一个参数化用例:

1. 基础改造代码

假设你的测试类继承自APITestCase,先导入pytest,然后用@pytest.mark.parametrize装饰测试方法:

import pytest
from django.urls import reverse
from rest_framework.test import APITestCase

class TestOrderAddressState(APITestCase):
    def setUp(self):
        # 保留你原来的初始化逻辑:创建测试用户、初始化order基础数据等
        pass

    @pytest.mark.parametrize(
        # 定义参数名:address_state是要测试的字段值,test_desc是测试描述(可选)
        "address_state, test_desc",
        # 每组测试数据:元组第一个是addressstate的值,第二个是测试说明
        [
            ("", "测试空白addressstate字段"),
            ("SRJ", "测试错误格式的addressstate字段"),
        ],
        # 可选:给每个测试用例起短名,运行测试时能直观区分
        ids=["blank_state", "incorrect_state"]
    )
    def test_addressstate_validation(self, address_state, test_desc):
        # 登录测试用户
        self.client.login(
            username=self.order.owner.username, password="normal"
        )
        # 获取接口URL
        url = reverse("order_list")
        # 复制原order数据,避免修改原数据影响其他测试
        test_order_data = self.order.copy()
        test_order_data["addressstate"] = address_state
        # 发送POST请求
        response = self.client.post(url, test_order_data, format="json")
        # 断言错误信息
        self.assertIn(
            "{'addressstate': [ErrorDetail(string='This field is required.'",
            response.data["error"]["description"],
        )

2. 优化点:不同预期错误的适配

如果不同测试场景的预期错误信息不同(比如错误州应该返回"无效州"而非"必填"),可以把预期错误也加入参数化:

@pytest.mark.parametrize(
    "address_state, expected_error",
    [
        ("", "This field is required."),
        ("SRJ", "Invalid state for country IN."),  # 替换成实际的错误提示
    ],
    ids=["blank_state", "incorrect_state"]
)
def test_addressstate_validation(self, address_state, expected_error):
    # 前面的登录、请求逻辑不变
    response = self.client.post(url, test_order_data, format="json")
    # 更精准的断言
    self.assertIn(expected_error, response.data["error"]["description"])

关键说明

  • @pytest.mark.parametrize会自动遍历参数列表,为每组数据生成独立的测试用例。
  • 必须复制self.order而不是直接修改,防止测试用例之间的数据污染。
  • ids参数的作用是给每个测试用例命名,运行测试时能快速定位失败的场景。

内容的提问来源于stack exchange,提问作者I'mSRJ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 14:50:21