求问pytest.fixture 中,这个写法涉及什么知识点

import pytest
import smtplib

@pytest.fixture(scope="module")
def smtp(request):
    server = getattr(request.module, "smtpserver", "smtp.gmail.com")
    smtp = smtplib.SMTP(server)

    def fin():
        print ("finalizing %s (%s)" % (smtp, server))
        smtp.close()
    request.addfinalizer(fin)
    return smtp

这段代码是用来做teardown的,但是不知道为什么能够做teardown呢?
还有代码里面的

return smtp

是什么意思呢,闭包函数的话这里不是应该返回

return fin

吗?
希望老师能给解答一下,谢谢!

测试用例调用这个smtp的fixture,就是获取依赖的资源的,所以返回一个smtp的变量就可以拿到资源了,return fin的话,调用fixture的测试用例就获取不到想要的数据了。request.addfinalizer是注册一个回调函数,所以传入的是fin。虽然用法跟yield类似,但是实现方式是不一样的。

请问老师,

这句话的意思是,stmp这个变量,不仅在fixture里面的fin方法被用到了,用例里面也需要这个资源,所以才被return stmp出去?
这样的话,是不是就比yield方法来实现teardown,就更进了一步,因为return的资源,在fixture内部也可以应用到(本例的话就是这个stmp资源)?

不知道这样理解对不对,请老师再指点一下 :rose:

跟yield是等价的,如果用yield就会写上yield smtp,用当前方法就得用return smtp

好的,明白了,谢谢思寒老师 :rose: