返回顶部
首页 > 资讯 > 精选 >pytest解读fixtures之Teardown怎么处理yield和addfinalizer
  • 173
分享到

pytest解读fixtures之Teardown怎么处理yield和addfinalizer

2023-06-30 18:06:13 173人浏览 薄情痞子
摘要

本文小编为大家详细介绍“pytest解读fixtures之Teardown怎么处理yield和addfinalizer”,内容详细,步骤清晰,细节处理妥当,希望这篇“pytest解读fixtures之Teardown怎么处理yield和ad

本文小编为大家详细介绍“pytest解读fixtures之Teardown怎么处理yield和addfinalizer”,内容详细,步骤清晰,细节处理妥当,希望这篇“pytest解读fixtures之Teardown怎么处理yield和addfinalizer”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

前言

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

用过unittest的朋友相信都知道teardown这个函数,做的是一样的事情,那么下面姑且就把这种“善后”工作的代码叫做teardown代码吧。

而pytest中的fixture,也提供了这样一个非常有用的系统,我们可以在里面定义teardown代码。

这里可以使用2种方式来实现,分别是yieldaddfinalizer

一、yield fixtures(推荐)

1, yield 和 return

在有yield的fixtures函数中,关键字yield 可以代替 return,可以把fixture里的一些对象传递给调用它们的fixture函数或者测试函数。

就像其他普通的fixture函数一样。区别仅仅是:

  • yield替换掉了return

  • teardown代码放置在yield之后

2, yield的执行顺序

pytest在执行fixture函数时,会根据fixture函数之间的线性关系顺序调用的。但是,当测试函数运行结束的时候,pytest又会按照之前的顺序反方向来执行fixture中yield之后的代码。结合示例看下,这里没有引用官方示例了,手写一个直观些的:

import pytest@pytest.fixturedef fixture_one():    print("\n执行fixture_one")    return 1@pytest.fixturedef fixture_two(fixture_one):    print("\n执行fixture_two")    yield 2    print("\n执行fixture_two的teardown代码")@pytest.fixturedef fixture_adding(fixture_one, fixture_two):    print("\n执行fixture_adding")    result = fixture_one + fixture_two    yield result    print("\n执行fixture_adding的teardown代码")def test_demo(fixture_two, fixture_adding):    print("\n执行测试函数test_demo")    assert fixture_adding == 3

代码中,fixture中调用多个fixture,测试函数中调用多个fixture,通过前面几章的接触,相信大家这时候已经可以梳理出前后调用顺序了:

  • test_demo 测试函数,先去调用fixture函数 fixture_two,然后调用 fixture_adding。

  • 在fixture函数 fixture_two中,又会去调用另一个fixture函数 fixture_one。

  • 在fixture函数 fixture_adding中,调用了 fixture_one、fixture_two。

所以,fixture函数的先后顺序是:fixture_onefixture_twofixture_adding。那么,可以得知测试结束后的teardown代码执行顺序:fixture_addingfixture_two

运行一下代码,验证下结果是否符合我们的梳理:

============================= test session starts =============================platfORM win32 -- python 3.6.8, pytest-5.4.3, py-1.9.0, pluggy-0.13.1rootdir: D:\练习\demo_fixtureplugins: allure-pytest-2.8.32, celery-4.3.0, Faker-4.14.2, base-url-1.4.2, html-2.1.1, metadata-1.10.0collected 1 itemtest_module.py 执行fixture_one执行fixture_two执行fixture_adding.执行测试函数test_demo执行fixture_adding的teardown代码执行fixture_two的teardown代码                                                         [100%]============================== 1 passed in 0.09s ==============================

结果与我们刚才梳理的一致。

但是,值得注意的是,就算是teardown的代码是按照正确的顺序执行,也不能保证代码能正常执行的。比如说teardown里的某些代码执行异常了,导致别的清理动作也没法执行。这里就涉及到另一个点了:健壮的fixture结构应该是什么样子。这个官方文档另起进行说明,这里同样。

二、addfinalizer

1.request.addfinalizer把函数变成终结器

在pytest中想要做teardown的处理,除了使用带有yield的fixture函数,还可以直接添加终结器。直接来看示例代码:

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===")

看下运行结果:

============================= test session starts =============================platform win32 -- Python 3.6.8, pytest-5.4.3, py-1.9.0, pluggy-0.13.1rootdir: D:\练习\demo_fixtureplugins: allure-pytest-2.8.32, celery-4.3.0, Faker-4.14.2, base-url-1.4.2, html-2.1.1, metadata-1.10.0collected 2 itemstest_module.py 这个fixture在每个case前执行一次.===执行了case: test_01===在每个case完成后执行的teardown这个fixture在每个case前执行一次.===执行了case: test_02===在每个case完成后执行的teardown                                                        [100%]============================== 2 passed in 0.10s ==============================Process finished with exit code 0

运行结果可以看出,效果与yield是一致的。这算是一个固定写法,关于request文档中也有另外的讲解,届时再分享。

2.request.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")    #注册demo_finalizer为终结函数    request.addfinalizer(demo_finalizer)    request.addfinalizer(demo_finalizer2)def test_01(demo_fixture):    print("\n===执行了case: test_01===")def test_02(demo_fixture):    print("\n===执行了case: test_02===")if __name__ == '__main__':    pytest.main(['-s', 'test_module.py'])

运行结果:

============================= test session starts =============================platform win32 -- Python 3.6.8, pytest-5.4.3, py-1.9.0, pluggy-0.13.1rootdir: D:\练习\demo_fixtureplugins: allure-pytest-2.8.32, celery-4.3.0, Faker-4.14.2, base-url-1.4.2, html-2.1.1, metadata-1.10.0collected 2 itemstest_module.py 这个fixture在每个case前执行一次.===执行了case: test_01===在每个case完成后执行的teardown2在每个case完成后执行的teardown这个fixture在每个case前执行一次.===执行了case: test_02===在每个case完成后执行的teardown2在每个case完成后执行的teardown                                                        [100%]============================== 2 passed in 0.09s ==============================Process finished with exit code 0

这里要注意的是,多个终结器的情况下,执行的顺序是与注册时候相反的。

3.yield和addfinalizer的区别

目前从官方文档中看到的是

We have to be careful though, because pytest will run that finalizer once it’s been added, even if that fixture raises an exception after adding the finalizer. 

一旦添加了终结器,pytest便会执行。

但是,当我尝试在setup代码中进行抛错,终结器的代码却并没有执行。

读到这里,这篇“pytest解读fixtures之Teardown怎么处理yield和addfinalizer”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网精选频道。

--结束END--

本文标题: pytest解读fixtures之Teardown怎么处理yield和addfinalizer

本文链接: https://lsjlt.com/news/330863.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • pytest解读fixtures之Teardown怎么处理yield和addfinalizer
    本文小编为大家详细介绍“pytest解读fixtures之Teardown怎么处理yield和addfinalizer”,内容详细,步骤清晰,细节处理妥当,希望这篇“pytest解读fixtures之Teardown怎么处理yield和ad...
    99+
    2023-06-30
  • pytest解读fixtures之Teardown处理yield和addfinalizer方案
    目录前言一、yield fixtures(推荐)1, yield 和 return2, yield的执行顺序二、addfinalizer1.request.addfinalizer把...
    99+
    2024-04-02
  • pytest解读fixtures中yield与addfinalizer区别
    目录前言一、问题回顾二、问题解决前言 在上一章中,文末留下了一个坑待填补,疑问是这样的: 目前从官方文档中看到的是 We have to be careful though, bec...
    99+
    2024-04-02
  • pytest解读fixtures中yield与addfinalizer区别是什么
    本文小编为大家详细介绍“pytest解读fixtures中yield与addfinalizer区别是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“pytest解读fixtures中yield与addfinalizer区别是什么”文章能...
    99+
    2023-06-30
  • 怎么用pytest解读fixture有效性及跨文件共享fixtures
    这篇文章主要介绍“怎么用pytest解读fixture有效性及跨文件共享fixtures”,在日常操作中,相信很多人在怎么用pytest解读fixture有效性及跨文件共享fixtures问题上存在疑惑,小编查阅了各式资料,整理出简单好用的...
    99+
    2023-06-30
  • Cassandra怎么处理写入和读取操作
    Cassandra是一个分布式数据库系统,它使用了一种称为“分布式写入”和“分布式读取”的机制来处理写入和读取操作。 在Cassan...
    99+
    2024-04-09
    Cassandra
  • MATLAB中怎么读取和处理图像数据
    在MATLAB中,可以使用imread函数来读取图像数据,该函数将图像文件读取为一个矩阵,每个元素代表图像的像素值。例如,可以使用以...
    99+
    2024-04-03
    matlab
  • Redis怎么处理大数据量的写入和读取
    Redis可以处理大数据量的写入和读取,可以通过以下几种方式来优化性能: 使用pipelining:可以将多个命令打包成一个请求...
    99+
    2024-05-07
    Redis
  • 怎么理解java.lang.Runtime.exec的流输入和流读取
    这篇文章主要讲解了“怎么理解java.lang.Runtime.exec的流输入和流读取”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么理解java.lang.Runtime.exec的流...
    99+
    2023-06-25
  • hadoop怎么解决存储和数据处理
    Hadoop是一个分布式存储和数据处理框架,可以通过以下方式来解决存储和数据处理问题: 存储:Hadoop使用Hadoop Di...
    99+
    2024-04-09
    hadoop
  • ASP.NET的HTTP模块和处理程序之HTTP模块怎么用
    这篇文章给大家分享的是有关ASP.NET的HTTP模块和处理程序之HTTP模块怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在配置文件中注册HTTP模块当我们建立了HTTP模块并把它复制到Web应用程序的b...
    99+
    2023-06-17
  • Ruby怎么解析处理YAML和json格式数据
    今天小编给大家分享一下Ruby怎么解析处理YAML和json格式数据的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Ruby处...
    99+
    2023-06-30
  • 详解php strtotime()和date()函数怎么处理时间戳
    在 PHP 中,要将日期时间和时间戳互为转化,可以使用内置的函数 strtotime() 和 date()。时间戳是一个表示时间的数字,它代表了自 1970 年 1 月 1 日 00:00:00 UTC 以来的秒数。下面是如何使用 strt...
    99+
    2023-05-14
    php时间戳 date() strtotime() php
  • Retrofit网络请求框架之注解解析和动态代理方法怎么使用
    本篇内容介绍了“Retrofit网络请求框架之注解解析和动态代理方法怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Retrofit是...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作