当前位置: 首页 > 知识库问答 >
问题:

按自定义顺序运行 pytest 类

田玉韵
2023-03-14

我正在用pycharm中的pytest编写测试。测试分为不同的类别。
我想指定必须在其他类之前运行的某些类。
我已经看到了关于stackoverflow的各种问题(例如指定pytest测试从文件运行以及如何在所有其他测试之前运行方法)。
这些问题和其他各种问题都希望选择特定的功能来按顺序运行。我知道,这可以使用夹具pytest排序来完成。
我不在乎每个类中的哪个函数首先运行。我所关心的只是类按我指定的顺序运行。这可能吗?

共有1个答案

穆远
2023-03-14

可以使用 pytest_collection_modifyitems 挂钩就地修改收集的测试()的顺序。这还有一个额外的好处,即不必安装任何第三方库。

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

假设我们有三个测试类:

  1. 测试提取
  2. 测试转换
  3. 测试加载

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

测试提取 -

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

我们可以按如下方式向 conftest.py 添加pytest_collection_modifyitems,以强制执行我们想要的执行顺序:

# 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

关于实施细节的一些评论:

  • 测试类可以存在于不同的模块中
  • CLASS_ORDER不必详尽无遗。您可以只对那些要强制排序的类进行重新排序(但请注意:如果重新排序,任何未重新排序的类将在任何重新排序的类之前执行)
  • 类中的测试顺序保持不变
  • 假定测试类具有唯一的名称
  • 项目必须就地修改,因此最终项目[:] 分配
 类似资料:
  • 问题内容: 我有这样的自定义订购需求: 我曾经想过用3个不同的选择查询的帮助下结合和。但是,我不能这样做,因为必须 在 和 之前 使用。 如何进行选择(或多个选择)以实现上面的自定义排序? 另一个解决方法可能会有所帮助,就是使此选择查询中返回的 第一条记录 成为最后一条记录,但是如何? 问题答案: 试试这个: 1亿个常量必须大于N。 这是一个简单的演示

  • 问题内容: 我有一个对象数组,这些对象的属性称为“ CODE”。 如何通过自定义顺序对数组进行排序,例如: 尝试各种方法均未成功。请帮忙。 问题答案: 您可以将函数与函数一起使用。

  • 问题内容: 我正在使用ElasticSearch 2.4.2(通过Java的HibernateSearch 5.7.1.Final)。 我对字符串排序有问题。我的应用程序的语言带有变音符号,它们具有特定的字母顺序。例如,直接在after之后,在after之后,等等。因此,您应该对字符串进行如下排序: ElasticSearch首先按典型字母排序,然后将所有奇怪的字母移到最后: 我可以为Elasti

  • 根据字典顺序和自定义顺序对字符串数组进行排序(一种排列形式)。这是代码: 问题是,当我对一些输入运行此命令时,输出是正确的,而对于其他输入,输出是不正确的。我一直在调试它,但没有找到错误。 编辑: 阿德里安娜正在玩英文字母表。当她玩完字母表后,她意识到她把字母的位置弄乱了。现在,给定一组单词,她想知道根据她制作的新字母表排序,这些单词的字典排序是什么。 换句话说,给定英语字母表E和一组单词S的排列

  • 问题内容: 我有一个数组数组: 需要按特定顺序进行: 3452342 5867867 7867867 1231233 我将如何去做?我之前已经对数组进行了排序,并阅读了许多其他文章,但它们始终基于比较(即valueA <valueB)。 感谢帮助。 问题答案: 您可以用来精确指示如何对数组进行排序。在这种情况下,可以在比较函数中使用该数组。 下面的示例使用a 使生活更轻松。 这项工作的关键是使要比

  • 问题内容: 我有一张带有类别的表: 现在,我想将select语句的结果排序为 例如。在MySQL中,您可以这样做: 但是,您将如何在SQLite中做到这一点?我没有“订购依据”字段。 问题答案:

  • 我对React Router中路由的渲染顺序有问题。据我所知,任何子路由都将在其父路由之后进行渲染,因此将在DOM中的父路由之上进行渲染。 <代码> 我有这个路由器设置,但是在我从IndexRoute导航到/browse路由之后,浏览路由呈现在我的导航组件的顶部,我不能单击导航组件上的任何内容。 我的问题是如何强制Nav组件始终最后渲染,或者是否有更好的方法来构建我的应用程序以避免这种情况。 谢谢

  • 如何按特定顺序运行quarkus测试?通常我们有@InSequence注释(来自arquillian IIRC),我们可以实现这一点。 但是我没有找到任何类似的Quarkus在"org.junit.jupiter.api"软件包提供Quarkus-朱尼5。 它将以一个替代的顺序运行,我试图使用org.junit.jupiter.api.顺序与@Testmetodorder(方法命令。nnotati