📅  最后修改于: 2023-12-03 14:52:29.730000             🧑  作者: Mango
在 pytest 中,您可以使用自定义的装饰器将测试用例分组。您可以将多个测试用例分组为一个逻辑单元,并在需要运行特定逻辑单元的测试时只运行该逻辑单元。让我们看一下如何做到这一点。
要使用 pytest 进行测试分组,需要使用 pytest.mark 来创建自定义标记。如下所示:
import pytest
@pytest.mark.feature1
def test_feature1_1():
assert True
@pytest.mark.feature1
def test_feature1_2():
assert True
@pytest.mark.feature2
def test_feature2_1():
assert True
@pytest.mark.feature2
def test_feature2_2():
assert True
在这个例子中,我们创建了两个分组:feature1 和 feature2。我们将 test_feature1_1 和 test_feature1_2 标记为 feature1 组,并将 test_feature2_1 和 test_feature2_2 标记为 feature2 组。现在我们可以使用 pytest 的 -m 参数来运行特定的测试组:
pytest -m feature1
这将只运行属于 feature1 组的测试用例。同样,您可以使用 -m feature2 来运行属于 feature2 组的测试用例,并且可以使用多个标记来过滤测试用例。
如果您需要更多控制,您可以使用自定义分组的装饰器。为此,您可以使用 pytest 的 add_custom_scheduler 函数来创建自定义调度程序。以下是示例代码:
import pytest
def pytest_addoption(parser):
parser.addoption(
"--run-group",
action="store",
help="specify the group to run"
)
def pytest_collection_modifyitems(config, items):
groups = config.getoption("--run-group")
selected_groups = set(groups.split(","))
deselected_groups = set()
deselected_items = []
for item in items:
groups = set(item.keywords.keys())
if not selected_groups.isdisjoint(groups):
deselected_items.append(item)
else:
deselected_groups.update(groups)
if deselected_items:
items[:] = deselected_items
else:
deselected_groups = sorted(deselected_groups)
deselected_groups = [f"not {group}" for group in deselected_groups]
marker = pytest.mark.skip(reason=f"not any of {', '.join(deselected_groups)}")
for item in items:
item.add_marker(marker)
这里我们定义了一个自定义选项 --run-group,该选项允许您指定要运行的分组。我们使用 pytest_collection_modifyitems 函数修改测试项,以便使用自定义选项过滤它们。我们首先获取所有已选中的组,并按需选择或取消测试项。
然后,我们更新项来反映它们是否被选中。如果一个测试项是选定组的一部分,我们就保留它。否则,我们将测试项的标记设置为 skip,因为该项属于未选定组。
这就是如何在 pytest 中进行测试分组的详细指南。您现在可以将测试用例分组为逻辑单元,并在运行特定逻辑单元的测试时只运行它们。这有助于管理测试用例,并减少测试运行时间。