亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

pytest解讀fixtures中yield與addfinalizer區(qū)別

 更新時(shí)間:2022年06月06日 08:53:10   作者:把蘋(píng)果咬哭的測(cè)試筆記  
這篇文章主要為大家介紹了pytest官方解讀fixtures中yield與addfinalizer區(qū)別,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

前言

上一章中,文末留下了一個(gè)坑待填補(bǔ),疑問(wèn)是這樣的:

目前從官方文檔中看到的是

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. 

一旦添加了終結(jié)器,pytest便會(huì)執(zhí)行。

但是,當(dāng)我嘗試在setup代碼中進(jìn)行拋錯(cuò),終結(jié)器的代碼卻并沒(méi)有執(zhí)行。嘗試搜索外網(wǎng)暫時(shí)也沒(méi)得到有效的幫助,只能在GitHub上向pytest提了issue了,這里算是埋下一個(gè)坑,待后續(xù)解決。

一、問(wèn)題回顧

其實(shí)說(shuō)到底還是我理解的不對(duì),可能當(dāng)時(shí)自己處在疑問(wèn)中難免就會(huì)陷入進(jìn)死循環(huán),后來(lái)在github上經(jīng)過(guò)別人提點(diǎn)方才醒悟。先來(lái)看下當(dāng)時(shí)我嘗試演示出上述結(jié)果的代碼,也就是:setup代碼中進(jìn)行拋錯(cuò),終結(jié)器的代碼卻并沒(méi)有執(zhí)行。

代碼分為2部分,一個(gè)是fixture函數(shù)代碼,另一個(gè)則是測(cè)試用例。代碼是不能直接copy出來(lái)運(yùn)行的,是我在項(xiàng)目的用例中進(jìn)行改造的,在這里僅僅幫助說(shuō)明意思。

# 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

最開(kāi)始我想做的是,在fixture函數(shù)中,讓代碼db = DB()拋出一個(gè)mysql連接超時(shí)的錯(cuò)誤,然后就能在控制臺(tái)中看到"running finalizer code..."的輸出。

但是我執(zhí)行后,并沒(méi)有看到預(yù)期的輸出,說(shuō)明setup代碼拋錯(cuò)后,addfinalizer代碼并沒(méi)有執(zhí)行。

最后經(jīng)過(guò)github上朋友指點(diǎn)后,發(fā)現(xiàn)還是我自己理解錯(cuò)了。

二、問(wèn)題解決

還是來(lái)看下官方的原文:

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. 

這句話意思其實(shí)是說(shuō),當(dāng)finalizer 一旦添加成功后,pytest就會(huì)去執(zhí)行它。就算是fixture函數(shù)在添加了finalizer之后拋出了異常。

按照這樣理解的話,那我在fixture函數(shù)中的代碼就有問(wèn)題了。因?yàn)閐b = DB()代碼在request.addfinalizer(demo_finalizer)之前就拋錯(cuò)了,那么實(shí)際上并沒(méi)有執(zhí)行到添加終結(jié)器的這行代碼,所以終結(jié)器都還沒(méi)添加成功,又怎么會(huì)去執(zhí)行呢?

終于我明白過(guò)來(lái)了,于是調(diào)整了代碼順序,把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

如此來(lái)看,我們會(huì)先看到"running setup code..."的輸出,然后看到mysql拋錯(cuò),最后仍然可以看到"running setup code..."的輸出。

運(yùn)行代碼驗(yàn)證一下:

這下就對(duì)了。

以上就是pytest解讀fixtures中yield與addfinalizer區(qū)別的詳細(xì)內(nèi)容,更多關(guān)于yield與addfinalizer區(qū)別的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python help()函數(shù)用法詳解

    Python help()函數(shù)用法詳解

    這篇文章主要介紹了Python help()函數(shù)的作用,并舉例說(shuō)明它的詳細(xì)用法,需要的朋友可以參考下
    2014-03-03
  • django ObjectDoesNotExist 和 DoesNotExist的用法

    django ObjectDoesNotExist 和 DoesNotExist的用法

    這篇文章主要介紹了django ObjectDoesNotExist 和 DoesNotExist的用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-07-07
  • Python中創(chuàng)建對(duì)象列表的實(shí)現(xiàn)示例

    Python中創(chuàng)建對(duì)象列表的實(shí)現(xiàn)示例

    本文主要介紹了Python中創(chuàng)建對(duì)象列表的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • pytorch-gpu安裝的經(jīng)驗(yàn)與教訓(xùn)

    pytorch-gpu安裝的經(jīng)驗(yàn)與教訓(xùn)

    本文主要介紹了pytorch-gpu安裝的經(jīng)驗(yàn)與教訓(xùn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2023-01-01
  • Python中的eval()函數(shù)使用詳解

    Python中的eval()函數(shù)使用詳解

    這篇文章主要介紹了Python中的eval()函數(shù)使用詳解,eval()函數(shù)是用來(lái)執(zhí)行一個(gè)字符串表達(dá)式,并返回表達(dá)式的值,可以把字符串轉(zhuǎn)化為list,dict ,tuple,需要的朋友可以參考下
    2023-12-12
  • pycharm利用pyspark遠(yuǎn)程連接spark集群的實(shí)現(xiàn)

    pycharm利用pyspark遠(yuǎn)程連接spark集群的實(shí)現(xiàn)

    由于工作需要,利用spark完成機(jī)器學(xué)習(xí)。因此需要對(duì)spark集群進(jìn)行操作。所以利用pycharm和pyspark遠(yuǎn)程連接spark集群。感興趣的可以了解一下
    2021-05-05
  • python使用epoll實(shí)現(xiàn)服務(wù)端的方法

    python使用epoll實(shí)現(xiàn)服務(wù)端的方法

    今天小編就為大家分享一篇python使用epoll實(shí)現(xiàn)服務(wù)端的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-10-10
  • Python random庫(kù)使用方法及異常處理方案

    Python random庫(kù)使用方法及異常處理方案

    這篇文章主要介紹了python random庫(kù)使用方法及異常處理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • python muggle_ocr庫(kù)用法及實(shí)例代碼

    python muggle_ocr庫(kù)用法及實(shí)例代碼

    在本篇文章里小編給大家整理的是一篇關(guān)于python muggle_ocr庫(kù)用法及實(shí)例代碼內(nèi)容,有需要的朋友們可以跟著學(xué)習(xí)參考下。
    2021-07-07
  • python連接oracle數(shù)據(jù)庫(kù)操作實(shí)例及遇到的異常

    python連接oracle數(shù)據(jù)庫(kù)操作實(shí)例及遇到的異常

    這篇文章主要給大家介紹了關(guān)于python連接oracle數(shù)據(jù)庫(kù)操作實(shí)例及遇到的一些異常,Oracle是著名且廣泛使用的數(shù)據(jù)庫(kù)之一,而python的數(shù)據(jù)處理功能可以很好地利用這種連接性,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-12-12

最新評(píng)論