在之前介绍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的更多相关文章

  1. 【pytest官方文档】解读fixtures - 7. Teardown处理,yield和addfinalizer

    当我们运行测试函数时,我们希望确保测试函数在运行结束后,可以自己清理掉对环境的影响. 这样的话,它们就不会干扰任何其他的测试函数,更不会日积月累的留下越来越多的测试数据. 用过unittest的朋友相 ...

  2. pytest 5. fixture之yield实现teardown

    前言: 1.前面讲的是在用例前加前置条件,相当于setup,既然有setup那就有teardown,fixture里面的teardown用yield来唤醒teardown的执行 看以下的代码: #!/ ...

  3. 【pytest官方文档】解读fixtures - 8. yield和addfinalizer的区别(填坑)

    在上一章中,文末留下了一个坑待填补,疑问是这样的: 目前从官方文档中看到的是 We have to be careful though, because pytest will run that fi ...

  4. 初学python里的yield send next

    今天看书的时候突然看到这个想起来一直没有怎么使用过send和next试了一下 发现了一个诡异的问题 import math def get_primes(start): while 1 : if is ...

  5. pytest框架 里 fixture 参数化的方法

  6. pytest文档6-fixture之yield实现teardown

    前言 上一篇讲到fixture通过scope参数控制setup级别,既然有setup作为用例之前前的操作,用例执行完之后那肯定也有teardown操作. 这里用到fixture的teardown操作并 ...

  7. pytest自动化4:fixture之yield实现teardown

    出处:https://www.cnblogs.com/yoyoketang/p/9401554.html 前言: 上一篇介绍了fixture通过scope参数控制setup级别,我们一起来温故下fix ...

  8. pytest四:fixture_yield 实现 teardown

    既然有 setup 那就有 teardown,fixture 里面的 teardown 用 yield 来唤醒 teardown的执行 在所有用例执行完后执行:yield import pytest ...

  9. pytest_06_fixture之yield实现teardown

    上一篇讲到fixture通过scope参数控制setup级别,既然有setup作为用例之前前的操作,用例执行完之后那肯定也有teardown操作. 这里用到fixture的teardown操作并不是独 ...

随机推荐

  1. 41-native关键字的理解

    使用 native 关键字说明这个方法是原生函数,也就是这个方法是用 C/C++等非Java 语言实现的,并且被编译成了 DLL,由 java 去调用. (1)为什么要用 native 方法 java ...

  2. JConsole、VisualVM 依赖的 JMX 技术到底是什么

    我是风筝,公众号「古时的风筝」,一个兼具深度与广度的程序员鼓励师,一个本打算写诗却写起了代码的田园码农! 文章会收录在 JavaNewBee 中,更有 Java 后端知识图谱,从小白到大牛要走的路都在 ...

  3. ORACLE常用语句:

    ORACLE常用语句: 1.首先,创建(新)用户: create user username identified by password; username:新用户名的用户名 password: 新 ...

  4. webMvcConfigurer的详情

                  摘要 Spring的WebMvcConfigurer接口提供了很多方法让我们来定制SpringMVC的配置.而且Spring还提供了WebMvcConfigurerAdap ...

  5. JS 鼠标、键盘事件对象

    鼠标事件对象     mouseEvent鼠标事件对象     e.clientX 在可视区的x和y的坐标     e.pageX 在页面文档的X和Y的坐标 <script> docume ...

  6. ECS7天实践进阶训练营Day1:使用阿里云ECS,快速搭建、管理VuePress静态网站

    一.概述 VuePress是2018年由尤雨溪发布的一个全新的基于Vue的静态网站生成器,它是一个非常轻量级的静态网站生成器.VuePress主要用于生成技术文档,其类似于Gitbook,我们可以用于 ...

  7. Visual Studio安装

    2017 安装的时候,一直显示,安装成功但是有告警. 解决方法: 将visual studio 2017 installer进行卸载,然后安装hw的ios 不能确保下次也可以成功

  8. 开发读取.properties 配置文件工具类PropertiesUtil

    import java.io.IOException; import java.io.InputStream; import java.util.Properties; import org.juni ...

  9. java方法中参数传递与随机点名器、库存管理案例

    一 参数传递 1.定义: 参数传递,可以理解当我们要调用一个方法时,我们会把指定的数值,传递给方法中的参数, 这样方法中的参数就拥有了这个指定的值,可以使用该值,在方法中运算了.这种传递方式,我 们称 ...

  10. 5招详解linux之openEuler /centos7防火墙基本使用指南

    防火墙是一种防火墙管理解决方案,可用于许多 Linux 发行版,它充当 Linux 内核提供的 iptables 数据包筛选系统的前端.在本指南中,将介绍如何为服务器设置防火墙,并向你展示使用管理工具 ...