📜  如何在 pytest 中对多个测试进行分组 - Python (1)

📅  最后修改于: 2023-12-03 14:52:29.730000             🧑  作者: Mango

如何在 pytest 中对多个测试进行分组 - Python

在 pytest 中,您可以使用自定义的装饰器将测试用例分组。您可以将多个测试用例分组为一个逻辑单元,并在需要运行特定逻辑单元的测试时只运行该逻辑单元。让我们看一下如何做到这一点。

使用 pytest.mark 来分组

要使用 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 中进行测试分组的详细指南。您现在可以将测试用例分组为逻辑单元,并在运行特定逻辑单元的测试时只运行它们。这有助于管理测试用例,并减少测试运行时间。