欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

前言

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

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

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便會執(zhí)行。

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

一、問題回顧

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

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

# 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函數(shù)中,讓代碼db = DB()拋出一個mysql連接超時的錯誤,然后就能在控制臺中看到"running finalizer code..."的輸出。

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

最后經(jīng)過github上朋友指點(diǎn)后,發(fā)現(xià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. 

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

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

終于我明白過來了,于是調(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

如此來看,我們會先看到"running setup code..."的輸出,然后看到mysql拋錯,最后仍然可以看到"running setup code..."的輸出。

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

這下就對了。

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

相關(guān)文章

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

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

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

    django ObjectDoesNotExist 和 DoesNotExist的用法

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

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

    本文主要介紹了Python中創(chuàng)建對象列表的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(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),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2023-01-01
  • Python中的eval()函數(shù)使用詳解

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

    這篇文章主要介紹了Python中的eval()函數(shù)使用詳解,eval()函數(shù)是用來執(zhí)行一個字符串表達(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í)。因此需要對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ù)端的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10
  • Python random庫使用方法及異常處理方案

    Python random庫使用方法及異常處理方案

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

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

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

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

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

最新評論