【问题标题】:Run Pytest Classes in Custom Order按自定义顺序运行 Pytest 类
【发布时间】:2022-01-17 08:08:15
【问题描述】:

我正在 pycharm 中使用 pytest 编写测试。测试分为不同的类别。
我想指定某些必须在其他类之前运行的类
我看过关于stackoverflow的各种问题(例如specifying pytest tests to run from a filehow to run a method before all other tests)。
这些问题以及其他各种问题想要选择特定的函数按顺序运行。据我了解,这可以使用fixturespytest ordering 来完成。
我不在乎每个类中的哪些函数首先运行。我只关心 classes 按照我指定的顺序运行。这可能吗?

【问题讨论】:

    标签: python function class pycharm pytest


    【解决方案1】:

    方法

    您可以使用pytest_collection_modifyitems hook 修改已收集测试的顺序 (items)。这样做的另一个好处是不必安装任何第三方库。

    使用一些自定义逻辑,这允许按类排序。

    完整示例

    假设我们有三个测试类:

    1. TestExtract
    2. TestTransform
    3. TestLoad

    还要说,默认情况下,测试的执行顺序是按字母顺序排列的,即:

    TestExtract -> TestLoad -> TestTransform

    由于测试类的相互依赖性,这对我们不起作用。

    我们可以将pytest_collection_modifyitems 添加到conftest.py 如下以强制执行我们想要的执行顺序:

    # conftest.py
    def pytest_collection_modifyitems(items):
        """Modifies test items in place to ensure test classes run in a given order."""
        CLASS_ORDER = ["TestExtract", "TestTransform", "TestLoad"]
        class_mapping = {item: item.cls.__name__ for item in items}
    
        sorted_items = items.copy()
        # Iteratively move tests of each class to the end of the test queue
        for class_ in CLASS_ORDER:
            sorted_items = [it for it in sorted_items if class_mapping[it] != class_] + [
                it for it in sorted_items if class_mapping[it] == class_
            ]
        items[:] = sorted_items
    

    关于实现细节的一些cmets:

    • 测试类可以存在于不同的模块中
    • CLASS_ORDER 不必详尽无遗。您可以只对要强制执行命令的类重新排序(但请注意:如果重新排序,任何未重新排序的类将在任何重新排序的类之前执行)
    • 类内的测试顺序保持不变
    • 假设测试类具有唯一的名称
    • items 必须原地修改,因此最终的 items[:] 赋值

    【讨论】:

    • 这看起来正是我所需要的!而且,您甚至回答了我会提出的后续问题,说 CLASS_ORDER 不必详尽无遗。感谢您提供有用的答案!
    • 我对这个解决方案有疑问。每当我尝试运行一些测试,并且不包括我正在排序的每个类时,我都会收到一条错误消息。除了从列表中隐藏我不使用的类之外​​,知道如何解决这个问题吗?
    • 答案已编辑以将排序算法更改为不应该出现该问题的算法(加上更具可读性)
    • 感谢您的更新。效果很好!据我了解,您的新算法采用类名,如果它在列表中,否则什么都没有。这是正确的吗?
    • 按照CLASS_ORDER中定义的顺序逐个类,所有属于一个测试类的测试都被移动到测试队列的末尾(即“执行最后一个”)。因此,CLASS_ORDER 中的顺序被强制执行。
    猜你喜欢
    • 2018-05-08
    • 2014-10-28
    • 2018-03-27
    • 2017-09-08
    • 2013-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多