pytest解读fixtures中yield与addfinalizer区别

 更新时间:2022年06月06日 08:53:10   作者:把苹果咬哭的测试笔记  
这篇文章主要为大家介绍了pytest官方解读fixtures中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代码中进行抛错,终结器的代码却并没有执行。尝试搜索外网暂时也没得到有效的帮助,只能在GitHub上向pytest提了issue了,这里算是埋下一个坑,待后续解决。

一、问题回顾

其实说到底还是我理解的不对,可能当时自己处在疑问中难免就会陷入进死循环,后来在github上经过别人提点方才醒悟。先来看下当时我尝试演示出上述结果的代码,也就是:setup代码中进行抛错,终结器的代码却并没有执行。

代码分为2部分,一个是fixture函数代码,另一个则是测试用例。代码是不能直接copy出来运行的,是我在项目的用例中进行改造的,在这里仅仅帮助说明意思。

# content of conftest.py
@pytest.fixture()
def init_data_allot_task(request):
    query_sql = """
    SELECT id FROM `sm_purchase_allot` WHERE `status`!=5
    """
    db = DB()
    data = db.fetch_one(query_sql)
    db.close()
    def demo_finalizer():
        print("running finalizer code...")
    request.addfinalizer(demo_finalizer)
    return data
# content of testcase
...
def test_allot_detail(init_data_allot_task):
    """
    """
    payload = {
          "allotId": init_data_allot_task[0]
        }
    r = requests.post(QA_URL + API_URL, json=payload, headers=HEADER)
    result = r.json()
    assert result["result"] == "ok"
    assert result["errmsg"] == "success"
    assert len(result["row"]["taskListOfPage"]["resultData"]) > 0

最开始我想做的是,在fixture函数中,让代码db = DB()抛出一个mysql连接超时的错误,然后就能在控制台中看到"running finalizer code..."的输出。

但是我执行后,并没有看到预期的输出,说明setup代码抛错后,addfinalizer代码并没有执行。

最后经过github上朋友指点后,发现还是我自己理解错了。

二、问题解决

还是来看下官方的原文:

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. 

这句话意思其实是说,当finalizer 一旦添加成功后,pytest就会去执行它。就算是fixture函数在添加了finalizer之后抛出了异常。

按照这样理解的话,那我在fixture函数中的代码就有问题了。因为db = DB()代码在request.addfinalizer(demo_finalizer)之前就抛错了,那么实际上并没有执行到添加终结器的这行代码,所以终结器都还没添加成功,又怎么会去执行呢?

终于我明白过来了,于是调整了代码顺序,把request.addfinalizer(demo_finalizer)放到前面去,然后再接上fixture的代码:

# content of conftest.py
@pytest.fixture()
def init_data_allot_task(request):
    query_sql = """
    SELECT id FROM `sm_purchase_allot` WHERE `status`!=5 
    """
    def demo_finalizer():
        print("running finalizer code...")
    request.addfinalizer(demo_finalizer)
    print("running setup code...")
    db = DB()
    data = db.fetch_one(query_sql)
    db.close()
    return data

如此来看,我们会先看到"running setup code..."的输出,然后看到mysql抛错,最后仍然可以看到"running setup code..."的输出。

运行代码验证一下:

这下就对了。

以上就是pytest解读fixtures中yield与addfinalizer区别的详细内容,更多关于yield与addfinalizer区别的资料请关注脚本之家其它相关文章!

相关文章

  • Python help()函数用法详解

    Python help()函数用法详解

    这篇文章主要介绍了Python help()函数的作用,并举例说明它的详细用法,需要的朋友可以参考下
    2014-03-03
  • django ObjectDoesNotExist 和 DoesNotExist的用法

    django ObjectDoesNotExist 和 DoesNotExist的用法

    这篇文章主要介绍了django ObjectDoesNotExist 和 DoesNotExist的用法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-07-07
  • Python中创建对象列表的实现示例

    Python中创建对象列表的实现示例

    本文主要介绍了Python中创建对象列表的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • pytorch-gpu安装的经验与教训

    pytorch-gpu安装的经验与教训

    本文主要介绍了pytorch-gpu安装的经验与教训,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2023-01-01
  • Python中的eval()函数使用详解

    Python中的eval()函数使用详解

    这篇文章主要介绍了Python中的eval()函数使用详解,eval()函数是用来执行一个字符串表达式,并返回表达式的值,可以把字符串转化为list,dict ,tuple,需要的朋友可以参考下
    2023-12-12
  • pycharm利用pyspark远程连接spark集群的实现

    pycharm利用pyspark远程连接spark集群的实现

    由于工作需要,利用spark完成机器学习。因此需要对spark集群进行操作。所以利用pycharm和pyspark远程连接spark集群。感兴趣的可以了解一下
    2021-05-05
  • python使用epoll实现服务端的方法

    python使用epoll实现服务端的方法

    今天小编就为大家分享一篇python使用epoll实现服务端的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-10-10
  • Python random库使用方法及异常处理方案

    Python random库使用方法及异常处理方案

    这篇文章主要介绍了python random库使用方法及异常处理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • python muggle_ocr库用法及实例代码

    python muggle_ocr库用法及实例代码

    在本篇文章里小编给大家整理的是一篇关于python muggle_ocr库用法及实例代码内容,有需要的朋友们可以跟着学习参考下。
    2021-07-07
  • python连接oracle数据库操作实例及遇到的异常

    python连接oracle数据库操作实例及遇到的异常

    这篇文章主要给大家介绍了关于python连接oracle数据库操作实例及遇到的一些异常,Oracle是著名且广泛使用的数据库之一,而python的数据处理功能可以很好地利用这种连接性,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-12-12

最新评论