我有以下 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装置仅执行一次。但是,如果我指定不同的交付日期作为参数,它会按预期执行两次。为什么会发生这种情况?即使两次调用中使用相同的参数,如何让我的装置执行两次?
所以我找到了一个适合我的案例的解决方案。更改我的 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"
)