Pytest 夹具未使用给定参数运行 x 次

问题描述 投票:0回答:1

我有以下 pytest 夹具(也使用其他夹具作为参数),它使用 dynamodb 客户端来放置订单项:

@pytest.fixture(scope="function")
def function_order(request, dynamodb_client, cleanup_orders):
    delivery_date = "01-01-2022"
    if hasattr(request, "param"):
        delivery_date = request.param.get("delivery_date")

    order_id = f"ORDER-{str(uuid.uuid4())}"

    records = [
        {
            "order_id": {"S": order_id},
            "delivery_date": {"S": delivery_date},
        }
    ]

    for record in records:
        dynamodb_client.put_item(
            TableName="orders",
            Item=record,
        )

    cleanup_orders.append(order_id)

    return {"order_id": order_id, "records": records}

我还定义了一个集成测试,定义了要发送到我的装置的参数:function_order。当点击我的订单后端点时,此端点应返回 400。如果尝试在指定的交货日期发布第三个订单,则应返回 400。换句话说,如果我已经发布了两个交货日期为 2024 年 12 月 12 日的订单,则第三次尝试在此日期发布订单应该是一个错误的请求。

@pytest.mark.parametrize(
    "function_order",
    [
        {"delivery_date": "12-12-2024"},
        {"delivery_date": "12-12-2024"},
    ],
    indirect=True,
)
def test_post_v1_orders_exceeds_order_limit_returns_400(
    request_helper, function_order
):
    delivery_date = "12-12-2024"
    response = request_helper.post(
        "/v1/orders",
        body=order.order_record(delivery_date=delivery_date),
    )
    assert response.status_code == 400
    assert (
        response.json().get("error")
        == f"Order limit exceeded for date: {delivery_date}. Max orders: 2"
    )

问题在于,当相同的交货日期被用作参数两次时,function_order装置仅执行一次。但是,如果我指定不同的交付日期作为参数,它会按预期执行两次。为什么会发生这种情况?即使两次调用中使用相同的参数,如何让我的装置执行两次?

python pytest pytest-fixtures
1个回答
0
投票

所以我找到了一个适合我的案例的解决方案。更改我的 order_function 固定装置以返回内部函数,使我可以将参数从测试用例传递到固定装置。

我更新的赛程:

@pytest.fixture(scope="function")
def function_order(request, dynamodb_client, cleanup_orders):
    def _get_order_record(delivery_date="01-01-2022"):
        order_id = f"ORDER-{str(uuid.uuid4())}"

        records = [
            {
                "order_id": {"S": order_id},
                "delivery_date": {"S": delivery_date},
            }
        ]

        for record in records:
            dynamodb_client.put_item(
                TableName="orders",
                Item=record,
            )

        cleanup_orders.append(order_id)

        return {"order_id": order_id, "records": records}

    return _get_order_record

更新的测试用例:


def test_post_v1_orders_exceeds_order_limit_returns_400(request_helper, function_order):
    delivery_date = "12-12-2024"

    function_order(delivery_date)
    function_order(delivery_date)

    response = request_helper.post(
        "/v1/orders",
        body=order.order_record(delivery_date=delivery_date),
    )
    assert response.status_code == 400
    assert (
        response.json().get("error")
        == f"Order limit exceeded for date: {delivery_date}. Max orders: 2"
    )
© www.soinside.com 2019 - 2024. All rights reserved.