对于我正在测试的应用程序我想创建一个autouse=True
灯具,如果他们试图意外发送电子邮件,那么monkeypatches smtplib.SMTP.connect
会失败测试。
但是,在我确实希望测试发送电子邮件的情况下,我想使用不同的工具来记录这些电子邮件(最有可能是使用smtpserver
中的pytest-localserver
工具并对connect
进行monkeypatching。 1}}使用该夹具返回的主机/端口的方法)
当然,只有在另一个灯具(加载为funcarg)之前执行autouse灯具时才能工作。是否存在执行灯具的特定顺序和/或是否有保证执行顺序的方法?
答案 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灯具来说。考虑更广泛的范围(例如module
,session
),当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)
在进行建筑固定装置评估顺序时,一并考虑了3个方面,这些方面本身按优先级排列:
session
到module
到function
范围。在相同的范围内,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)