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)
我只是遇到了两个问题的functionautouse灯具问题.我希望夹具b在夹具之前运行a,但每次都a先跑.我想也许它是按字母顺序排列的,所以我改名a为c,现在b先运行.Pytest似乎没有记录这一点.这只是一个幸运的猜测.:-)
这适用于autouse灯具.考虑更广泛的范围(例如module,session),当pytest遇到需要它的测试时执行夹具.因此,如果有两个测试,并且第一个测试使用session命名的-scoped fixture sb而不是命名的sa,那么sb将首先执行.当下一个测试运行时,它将启动sa,假设它需要sa.
在构建夹具评估顺序时,会同时考虑 3 个方面,方面本身按优先级排列:
session贯穿module到function范围进行评估。在autouse非自动使用的固定装置之前,在同一范围内对固定装置进行评估。官方解释与代码示例通过下面的链接
https://docs.pytest.org/en/stable/fixture.html#fixture-instantiation-order
IIRC 您可以首先执行更高范围的装置。因此,如果您为 Monkeypatch 创建了一个会话范围的自动使用固定装置smtplib.SMTP.connect,那么您可以创建一个函数范围的固定装置,该固定装置会在一个测试中撤消此 Monkeypatching,然后恢复它。我认为最简单的方法是创建您自己的smtpserver夹具,该夹具取决于disallow_smtp夹具以及smtpserver来自的夹具pytest-localserver,然后处理使这两者协同工作所需的所有设置和拆卸。
顺便说一句,这大概是pytest-django处理数据库访问的方式,您可以尝试查看那里的代码,但它远不是一个简单的示例,并且有许多自己奇怪的事情。