2014-09-04 126 views
9

对于我正在测试的应用程序,我想创建一个autouse=True夹具,如果他们尝试发送电子邮件意外,它会对smtplib.SMTP.connect进行失败测试。执行pytest fixtures的顺序是?

然而,在我确实希望测试,以发送电子邮件的情况下,我想用不同的灯具记录这些邮件,而不是(使用smtpserver夹具从pytest-localserver和的Monkeypatching的connect方法使用主机/端口返回最有可能通过该灯具)

当然,只有在其他灯具(装载为funcarg)之前执行自动灯具夹具才能工作。是否有特定的固定装置执行顺序和/或是否有保证执行顺序的方法?

+2

一个非常有效的问题,我已经看到了灯具被滥用了很多时间,最有问题的事情之一是固定运行的是哪一个 – Fruch 2014-12-10 18:41:18

+0

另一种伎俩前有用的是知道夹具可以检查pytest标记的测试功能。这意味着您可以'@标记'需要做特殊事情的测试,然后使用请求对象检查测试函数是否有标记。如果是这样,请在您的灯具中执行不同的操作。 – user2859458 2017-03-24 22:55:05

回答

3

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

这其实很隐约,pytest-django如何处理它的数据库访问顺便说一句,你可以尝试看看那里的代码,但它远非一个简单的例子,它有许多奇怪的东西。

5

我只是有两个function -scoped自动夹具的问题。我想要夹具b在夹具a之前运行,但每次首先运行a。我想也许这是字母顺序,所以我将a更名为c,现在b首先运行。 Pytest似乎没有这种记录。这只是一个幸运的猜测。 :-)

这是汽车灯具。考虑到更广泛的范围(例如module,session),当pytest遇到需要它的测试时执行夹具。因此,如果有两个测试,并且第一个测试使用名为sb的名为session的灯具而不是名为sa的灯具,则将首先执行sb。当下一次测试运行时,它将启动sa,假设它需要sa

+1

可以确认py.test版本2.6.4。 – Nitrodist 2015-04-23 18:13:00

+0

我也在使用2.6.4。 – ebeezer 2015-04-24 19:15:16

9

控制灯具执行顺序的最简单方法是只要求稍后灯具中的上一个灯具。因此,为了a前确保b运行:

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

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

似乎无法在pytest 3.0.2上运行(没有autouse)。试图将Capfd与另一个灯具一起使用,该灯具创建一个将sys.stdout保存到变量的类:避免灯具捕获输出,试图强制capfd首先进行设置。 – 2016-09-17 23:23:16

+0

pytest 3.0.2和“no autouse”是什么意思?此代码适用于pytest 3.0.2和3.0.3(最新版本)。 – Barry 2016-11-07 20:24:05

+0

请upvote如果答案解决了你的问题:) – Chronial 2016-11-11 09:46:28