fixture完成/执行teardown代码
当fixture超出范围scope时,pytest支持执行fixture特定的完成代码。通过使用yield语句而不是return,yield语句之后的所有代码用作teardown代码:

当测试用例完成执行时,无论测试的异常状态如何,都将执行yield后面的print语句。
执行如下:

我们看到print("end conftest.py mod_fix!")在测试用例执行完后完成。这里使用的scope是function,所以是每个测试用例都执行。无论什么情况下,测试模块本身不需要修改或知道有关fixture设置的详细信息。
注意:还可以将with语句结合yield中。

smtp_connection连接将在测试执行完成后关闭,因为当with结束时,smtp_connection示例自动关闭。
无论fixture设置代码是否引发异常,使用contextlib.ExitStack上下文管理器都将始终被调用。以便正确关闭由fixture创建的所有资源,即使其中一个资源创建/获取失败也是如此:

上述示例中,如果“C28”异常失败,“C1”“C3”仍将正确关闭。
注意:如果在设置setup代码期间(yield关键字之前)发生异常,则不会调用teardown代码(yield关键词之后)。
执行teardown代码的另一种选择是利用上下文对象的addfinalizer方法来注册完成函数。
下面是smtp_connection fixture更改为使用addfinalizer来清理:

下面是equipments fixture更改为使用addfinalizer来清理:

在测试结束后,调用yield和addfinalizer代码的工作方式类似。当然如果在注册完成函数之前发生异常,则不会执行完成函数。