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

Thi*_*ter 17 python fixtures pytest

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

但是,如果我确实希望测试发送电子邮件,我想使用不同的夹具来记录这些电子邮件(最有可能的方法是使用smtpserver夹具pytest-localserver和monkeypatching connect方法来使用该夹具返回的主机/端口)

当然,只有在另一个灯具(加载为funcarg)之前执行autouse灯具时才能工作.是否有任何具体的订单执行和/或有没有办法保证执行顺序?

Chr*_*ial 21

控制灯具执行顺序的最简单方法是在后一个灯具中请求前一个灯具.所以要确保b之前运行a:

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

@pytest.fixture(scope="function")
def a(b):
    pass
Run Code Online (Sandbox Code Playgroud)


ebe*_*zer 8

我只是遇到了两个问题的functionautouse灯具问题.我希望夹具b在夹具之前运行a,但每次都a先跑.我想也许它是按字母顺序排列的,所以我改名ac,现在b先运行.Pytest似乎没有记录这一点.这只是一个幸运的猜测.:-)

这适用于autouse灯具.考虑更广泛的范围(例如module,session),当pytest遇到需要它的测试时执行夹具.因此,如果有两个测试,并且第一个测试使用session命名的-scoped fixture sb而不是命名的sa,那么sb将首先执行.当下一个测试运行时,它将启动sa,假设它需要sa.

  • 这个答案帮助我理解我无法正确执行某些特定的固定装置顺序。而且我不想使用字母顺序,所以我只是尝试以不依赖于顺序的方式重写我的装置。TL;DR 仍然觉得这很有帮助:) (3认同)

Max*_*yuk 7

TL; 博士

在构建夹具评估顺序时,会同时考虑 3 个方面,方面本身按优先级排列:

  • 夹具依赖关系-夹具从最需要的返回到测试函数中所需的一个进行评估。
  • 夹具范围- 夹具从session贯穿modulefunction范围进行评估。在autouse非自动使用的固定装置之前,在同一范围内对固定装置进行评估。
  • 在测试函数参数夹具位置-固定装置在测试函数参数存在的顺序求值,从最左端右端

官方解释与代码示例通过下面的链接

https://docs.pytest.org/en/stable/fixture.html#fixture-instantiation-order

  • 第三点“存在顺序......从最左到最右”没有得到 pytest 文档的证实。来自 https://docs.pytest.org/en/stable/fixture.html#fixture-order:“...请求的顺序固定装置对执行顺序没有影响,除了巧合之外” (4认同)
  • [该链接只提到了3种情况](https://docs.pytest.org/en/stable/reference/fixtures.html#fixture-instantiation-order):1-范围2-依赖项3-自动注意:“固定位置在测试函数参数中”不存在于列表中。不要依赖它。 (3认同)

flu*_*lub 2

IIRC 您可以首先执行更高范围的装置。因此,如果您为 Monkeypatch 创建了一个会话范围的自动使用固定装置smtplib.SMTP.connect,那么您可以创建一个函数范围的固定装置,该固定装置会在一个测试中撤消此 Monkeypatching,然后恢复它。我认为最简单的方法是创建您自己的smtpserver夹具,该夹具取决于disallow_smtp夹具以及smtpserver来自的夹具pytest-localserver,然后处理使这两者协同工作所需的所有设置和拆卸。

顺便说一句,这大概是pytest-django处理数据库访问的方式,您可以尝试查看那里的代码,但它远不是一个简单的示例,并且有许多自己奇怪的事情。