【pytest】teardown里的yield和addfinalizer
在之前介绍pytest中的fixture用法的文章中https://zhuanlan.zhihu.com/p/87775743,提到了teardown的实现。
最近在翻pytest官方文档的时候,又发现了addfinalizer这个函数,跟yield一样,也可以实现在case结束后运行关键字之后的代码。那今天就来捋一下这2者的用法和区别。

一、yield
再来简单回顾下pytest里的setUp和tearDown的用法,我们可以看到,下方代码里有三个case用例,分别是test_开头。
而在demo_fixture函数里,有一个yield关键字。那么在yield之前的代码,会在case之前执行,yield之后的代码,则会在case运行结束后执行。
#yield_finalizer_demo.py
import pytest
@pytest.fixture()
def demo_fixture():
    print("\n这个fixture在每个case前执行一次")
    yield
    print("\n在每个case完成后执行的teardown")
def test_01(demo_fixture):
    print("\n===执行了case: test_01===")
def test_02(demo_fixture):
    print("\n===执行了case: test_02===")
def test_03(demo_fixture):
    print("\n===执行了case: test_03===")
好了,现在我3个case都传入这个demo_fixture,运行一下,看下效果。这3个红色框中标出的分别就是每一个case执行前后的代码输出,符合我们的预期。

二、addfinalizer
现在,我们再来看addfinalizer,这里我姑且叫它终结器。在用法上,addfinalizer跟yield是不同的,需要你去注册作为终结器使用的函数。
这里还是用上方的代码去修改,去掉yield关键字,增加一个新的函数demo_finalizer,并且注册成终结函数:
import pytest
@pytest.fixture()
def demo_fixture(request):
    print("\n这个fixture在每个case前执行一次")
    def demo_finalizer():
        print("\n在每个case完成后执行的teardown")
    #注册demo_finalizer为终结函数
    request.addfinalizer(demo_finalizer)
def test_01(demo_fixture):
    print("\n===执行了case: test_01===")
def test_02(demo_fixture):
    print("\n===执行了case: test_02===")
def test_03(demo_fixture):
    print("\n===执行了case: test_03===")
接下来,运行一下,可以看到结果与使用yield的时候一致。

三、yield与addfinalizer的区别
那么,除了在使用上的区别之外,yield与addfinalizer还有什么不同呢?
1. addfinalizer可以注册多个终结函数。
import pytest
@pytest.fixture()
def demo_fixture(request):
    print("\n这个fixture在每个case前执行一次")
    def demo_finalizer():
        print("\n在每个case完成后执行的teardown")
    def demo_finalizer2():
        print("\n在每个case完成后执行的teardown2")
    def demo_finalizer3():
        print("\n在每个case完成后执行的teardown3")
    #注册demo_finalizer为终结函数
    request.addfinalizer(demo_finalizer)
    request.addfinalizer(demo_finalizer2)
    request.addfinalizer(demo_finalizer3)
def test_01(demo_fixture):
    print("\n===执行了case: test_01===")
def test_02(demo_fixture):
    print("\n===执行了case: test_02===")
def test_03(demo_fixture):
    print("\n===执行了case: test_03===")
在代码里增加demo_finalizer2,demo_finalizer3,这2个终结函数。运行一下:

可以看到,注册的3个函数都被执行了,但是要注意的是执行顺序,与注册的顺序相反。
2. 当setUp的代码执行错误,addfinalizer依旧会执行
这里接官方文档上的例子说明一下:
@pytest.fixture
def equipments(request):
    r = []
    for port in ('C1', 'C3', 'C28'):
    equip = connect(port)
    request.addfinalizer(equip.disconnect)
    r.append(equip)
    return r
比如,C1,C3,C28这3个端口连接,如果C28这个端口失败了,这时候会抛出一个连接异常,但是在执行teardown关闭连接的时候,C1和C3的依然可以正常关闭。
【pytest】teardown里的yield和addfinalizer的更多相关文章
- 【pytest官方文档】解读fixtures - 7. Teardown处理,yield和addfinalizer
		
当我们运行测试函数时,我们希望确保测试函数在运行结束后,可以自己清理掉对环境的影响. 这样的话,它们就不会干扰任何其他的测试函数,更不会日积月累的留下越来越多的测试数据. 用过unittest的朋友相 ...
 - pytest 5. fixture之yield实现teardown
		
前言: 1.前面讲的是在用例前加前置条件,相当于setup,既然有setup那就有teardown,fixture里面的teardown用yield来唤醒teardown的执行 看以下的代码: #!/ ...
 - 【pytest官方文档】解读fixtures - 8. yield和addfinalizer的区别(填坑)
		
在上一章中,文末留下了一个坑待填补,疑问是这样的: 目前从官方文档中看到的是 We have to be careful though, because pytest will run that fi ...
 - 初学python里的yield send next
		
今天看书的时候突然看到这个想起来一直没有怎么使用过send和next试了一下 发现了一个诡异的问题 import math def get_primes(start): while 1 : if is ...
 - pytest框架 里 fixture 参数化的方法
 - pytest文档6-fixture之yield实现teardown
		
前言 上一篇讲到fixture通过scope参数控制setup级别,既然有setup作为用例之前前的操作,用例执行完之后那肯定也有teardown操作. 这里用到fixture的teardown操作并 ...
 - pytest自动化4:fixture之yield实现teardown
		
出处:https://www.cnblogs.com/yoyoketang/p/9401554.html 前言: 上一篇介绍了fixture通过scope参数控制setup级别,我们一起来温故下fix ...
 - pytest四:fixture_yield 实现 teardown
		
既然有 setup 那就有 teardown,fixture 里面的 teardown 用 yield 来唤醒 teardown的执行 在所有用例执行完后执行:yield import pytest ...
 - pytest_06_fixture之yield实现teardown
		
上一篇讲到fixture通过scope参数控制setup级别,既然有setup作为用例之前前的操作,用例执行完之后那肯定也有teardown操作. 这里用到fixture的teardown操作并不是独 ...
 
随机推荐
- Flutter 容器(8) - SizedOverflowBox | OverflowBox
			
SizedOverflowBox: 子组件在超出SizedOverflowBox指定的宽高时,不会隐藏,依然进行绘制 OverflowBox: 限制子组件的宽高. import 'package:fl ...
 - 编译原理——求解First,Follow,Firstvt和Lastvt集合
			
转载地址 http://dongtq2010.blog.163.com/blog/static/1750224812011520113332714/ 学编译原理的时候,印象最深的莫过于这四个集合了,而 ...
 - nodejs版本DESede/CBC/PKCS5Padding算法封装(3des)
			
最近对接了一个第三方支付项目,用的加密算法是根本没听过的:DESede/CBC/PKCS5Padding 这个算法真的是坑爹了,网上搜索了一堆只有java版本是正常的,nodejs版本的各种问题,我了 ...
 - 复习 Array,重学 JavaScript
			
1 数组与对象 在 JavaScript 中,一个对象的键只能有两种类型:string 和 symbol.下文只考虑键为字符串的情况. 1.1 创建对象 在创建对象时,若对象的键为数字,或者由 字母+ ...
 - eric4 打包文件
			
在.py 工程 所在目录: 按住shift,鼠标右键,在此处打开cmd或shell,然后如下操作 1.打包成文件夹 pyinstaller lrs.py 2.打包成 单文件 pyinstaller - ...
 - 【TTS】文本转语音?如何不调用第三方api来实现,使用pyttsx3
			
@ 目录 前言 安装pyttsx3 实现TTS接口 后言 前言 本次的实现需求有点困难,所以也就记录下来,别到时候都忘了. 首先先不说正题,有兴趣的可以看一看: 1.目标是实现一个可以传一个文本就返回 ...
 - java如何简单的将一个三位正整数分解成三个数
			
public class Leet { public static void main(String[] args) { Scanner scanner = new Scanner(System.in ...
 - J20航模遥控器开源项目系列教程(二)使用说明 | 遥控器制作完成了,怎么用?
			
我们的开源宗旨:自由 协调 开放 合作 共享 拥抱开源,丰富国内开源生态,开展多人运动,欢迎加入我们哈~ 和一群志同道合的人,做自己所热爱的事! 项目开源地址:https://github.com/C ...
 - RabbitMQ set password
			
问题: -- ::09.387 ERROR oslo.messaging._drivers.impl_rabbit [req-51faf017-4f1f-4a24-ab79-624b302b839b ...
 - 国际象棋棋盘输出-PHP代码
			
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...