执行pytest灯具的顺序是什么?

时间:2014-09-04 07:53:18

标签: python fixtures pytest

对于我正在测试的应用程序我想创建一个autouse=True灯具,如果他们试图意外发送电子邮件,那么monkeypatches smtplib.SMTP.connect会失败测试。

但是,在我确实希望测试发送电子邮件的情况下,我想使用不同的工具来记录这些电子邮件(最有可能是使用smtpserver中的pytest-localserver工具并对connect进行monkeypatching。 1}}使用该夹具返回的主机/端口的方法)

当然,只有在另一个灯具(加载为funcarg)之前执行autouse灯具时才能工作。是否存在执行灯具的特定顺序和/或是否有保证执行顺序的方法?

5 个答案:

答案 0 :(得分:17)

控制灯具执行顺序的最简单方法是在后期灯具中请求前一个灯具。因此,要确保在b之前运行a

@pytest.fixture(autouse=True, scope="function")
def b():
    pass

@pytest.fixture(scope="function")
def a(b):
    pass

答案 1 :(得分:6)

我只是遇到了两个function - 范围的autouse灯具的问题。我希望夹具b在夹具a之前运行,但每次a先跑。我想也许这是按字母顺序排列的,所以我将a重命名为c,现在b先运行。 Pytest似乎没有记录这一点。这只是一个幸运的猜测。 : - )

对于autouse灯具来说。考虑更广泛的范围(例如modulesession),当pytest遇到需要它的测试时执行fixture。因此,如果有两个测试,并且第一个测试使用名为session的{​​{1}}范围的夹具而不是名为sb的夹具,则sa将首先执行。当下一个测试运行时,它将启动sb,假设它需要sa

答案 2 :(得分:3)

IIRC你可以依靠更高范围的灯具来首先执行。因此,如果您为monkeypatch smtplib.SMTP.connect创建了一个会话范围的autouse fixture,那么您可以创建一个函数范围的fixture,它可以撤消一次测试的monkeypatching,然后再恢复它。我认为最简单的方法是创建自己的smtpserver夹具,它取决于disallow_smtp夹具以及smtpserver中的pytest-localserver夹具,然后处理所有设置和拆解需要使这两者一起工作。

这是pytest-django如何处理它的数据库访问btw,你可以尝试查看那里的代码,但它远非一个简单的例子,并且有很多它自己很奇怪的东西。

答案 3 :(得分:2)

TL; DR

在进行建筑固定装置评估顺序时,一并考虑了3个方面,这些方面本身按优先级排列:

  • 夹具依赖项-夹具的评估范围是从最根本的要求到测试功能所需的一个
  • 夹具范围-夹具的评估范围是从sessionmodulefunction范围。在相同的范围内,autouse灯具要比非自动灯具先评估。
  • 测试函数自变量中的固定位置-按照从最左最右的测试函数自变量中存在的顺序评估固定装置。

通过下面的链接提供带有代码示例的正式说明

https://docs.pytest.org/en/stable/fixture.html#order-higher-scoped-fixtures-are-instantiated-first

答案 4 :(得分:0)

借助以下代码,我们可以轻松设置灯具/功能的执行顺序

例如:-

执行顺序优先

@pytest.mark.order(1)

执行顺序第二

@pytest.mark.order(2)