pytest解讀fixtures中yield與addfinalizer區(qū)別
前言
在上一章中,文末留下了一個坑待填補(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)文章!
- pytest解讀fixtures之Teardown處理yield和addfinalizer方案
- pytest官方文檔解讀fixtures的調(diào)用方式
- pytest官方文檔解讀fixtures
- pytest官方文檔解讀fixtures的autouse
- pytest解讀一次請求多個fixtures及多次請求
- pytest官方文檔解讀fixtures調(diào)用fixtures及fixture復(fù)用性
- pytest解讀fixture有效性及跨文件共享fixtures
- pytest?fixtures函數(shù)及測試函數(shù)的參數(shù)化解讀
- pytest fixtures裝飾器的使用和如何控制用例的執(zhí)行順序
- Pytest中Fixtures的高級用法
相關(guān)文章
django ObjectDoesNotExist 和 DoesNotExist的用法
這篇文章主要介紹了django ObjectDoesNotExist 和 DoesNotExist的用法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-07-07Python中創(chuàng)建對象列表的實(shí)現(xiàn)示例
本文主要介紹了Python中創(chuàng)建對象列表的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03pytorch-gpu安裝的經(jīng)驗(yàn)與教訓(xùn)
本文主要介紹了pytorch-gpu安裝的經(jīng)驗(yàn)與教訓(xùn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2023-01-01pycharm利用pyspark遠(yuǎn)程連接spark集群的實(shí)現(xiàn)
由于工作需要,利用spark完成機(jī)器學(xué)習(xí)。因此需要對spark集群進(jìn)行操作。所以利用pycharm和pyspark遠(yuǎn)程連接spark集群。感興趣的可以了解一下2021-05-05python使用epoll實(shí)現(xiàn)服務(wù)端的方法
今天小編就為大家分享一篇python使用epoll實(shí)現(xiàn)服務(wù)端的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-10-10python muggle_ocr庫用法及實(shí)例代碼
在本篇文章里小編給大家整理的是一篇關(guān)于python muggle_ocr庫用法及實(shí)例代碼內(nèi)容,有需要的朋友們可以跟著學(xué)習(xí)參考下。2021-07-07python連接oracle數(shù)據(jù)庫操作實(shí)例及遇到的異常
這篇文章主要給大家介紹了關(guān)于python連接oracle數(shù)據(jù)庫操作實(shí)例及遇到的一些異常,Oracle是著名且廣泛使用的數(shù)據(jù)庫之一,而python的數(shù)據(jù)處理功能可以很好地利用這種連接性,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-12-12