实际上,pytest-order
不允许将两个order
相加.然而,我为你想出了一些解决方案.
您可以使用pytest_generate_tests最小钩子来解析此语法.只需将其添加到您的conftest.py
文件中.
下面的示例将读取所有pytest.mark.order
个标记并对其进行参数化测试(如果提供了一个以上的订单标记).它添加了名为order
的参数,该参数存储在pytest.mark.order
中指定的参数.
conftest.py个
def _get_mark_description(mark):
if mark.kwargs:
return ", ".join([f"{k}={v}" for k, v in mark.kwargs.items()])
elif mark.args:
return f"index={mark.args[0]}"
return mark
def pytest_generate_tests(metafunc):
"""
Handle multiple pytest.mark.order decorators.
Make parametrized tests with corresponding order marks.
"""
if getattr(metafunc, "function", False):
if getattr(metafunc.function, "pytestmark", False):
# Get list of order marks
marks = metafunc.function.pytestmark
order_marks = [
mark for mark in marks if mark.name == "order"
]
if len(order_marks) > 1:
# Remove all order marks
metafunc.function.pytestmark = [
mark for mark in marks if mark.name != "order"
]
# Prepare arguments for parametrization with order marks
args = [
pytest.param(_get_mark_description(mark), marks=[mark])
for mark in order_marks
]
if "order" not in metafunc.fixturenames:
metafunc.fixturenames.append("order")
metafunc.parametrize('order', args)
test_order.py个
import pytest
@pytest.mark.order(6)
@pytest.mark.order(4)
def test_4_and_6():
pass
@pytest.mark.order(5)
@pytest.mark.order(3)
@pytest.mark.order(1)
def test_1_3_and_5():
pass
@pytest.mark.order(2)
def test_2():
pass
100 Output
collecting ... collected 6 items
test_order.py::test_1_3_and_5[index=1]
test_order.py::test_2
test_order.py::test_1_3_and_5[index=3]
test_order.py::test_4_and_6[index=4]
test_order.py::test_1_3_and_5[index=5]
test_order.py::test_4_and_6[index=6]
如您所见,所有测试都以定义的顺序运行.
UPD个
我已经更新了钩子,使其与pytest-order
的其他功能兼容.我也创造了PR in pytest-order GitHub repo个.