pytest的fixture学习六

fixture完成/执行teardown代码

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

fixture结束代码的示例

当测试用例完成执行时,无论测试的异常状态如何,都将执行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代码的工作方式类似。当然如果在注册完成函数之前发生异常,则不会执行完成函数。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。