(5)pytest-yield操作

1. 簡介

  上一篇中,我們剛剛實現了在每個用例之前執行初始化操作,那么用例執行完之后如需要清除數據(或還原)操作,可以使用 yield 來實現。fixture通過scope參數控制setup級別,既然有setup作為用例之前前的操作,用例執行完之后那肯定也有teardown操作。
這里用到fixture的teardown操作并不是獨立的函數,用yield關鍵字呼喚teardown操作。fixture的teardown操作并不是獨立的函數,可以用yield關鍵字呼喚teardown操作。 

  我們之前學習的都是測試用例的前置固件,也就是相當于“setup”。說到這,細心的你可能想到了,那有沒有什么方式可以表示出“teardown”?這就是我們今天學習的yield和addfinalizer。

yield

  yield是一個關鍵字,它不是單獨存在的,要寫在fixtrue標記的固件中。

  我們在聲明的固件myfixture中加入yield關鍵字,在它下面寫測試用例執行后想要運行的代碼;其他有關于固件的使用沒有任何差別。需要說明的一點是我們在pytest主函數中增加了一個參數“–setup-show”,他會顯示出固件的執行情況。

  fixture里面的teardown用yield來喚醒teardown的執行

  如果測試用例中的代碼出現異常或者斷言失敗,并不會影響他的固件中yield后的代碼執行;但是如果固件中的yield之前的代碼也就是相當于setup部分的帶代碼,出現錯誤或斷言失敗,那么yield后的代碼將不會再執行,當然測試用例中的代碼也不會執行。

  我們也可以通過request.addfinalizer()的方式實現“teardown”

  我們在固件中傳入request參數;又在固件中定義了一個內置函數;最后將定義的內置函數添加到request的addfinalizer中

2. scope="function"

當?pytest.fixture(scope="function") 時,pytest的yieId 類似unittest的teartown。每個方法(函數)都會執行一次

1.新建?test_function1.py文件,我們看一下是不是這樣的。

2.1 代碼實現:

2.2 參考代碼:
# coding=utf-8
# 1.導入模塊
import pytest@pytest.fixture(scope="function")
def login():print("登錄成功")yieldprint("用例執行完成,收尾")def test1(login):print('操作1')print("-----------------------------------------------")def test2(login):print('操作2')print("-----------------------------------------------")def test3(login):print('操作3')print("-----------------------------------------------")if __name__ == "__main__":pytest.main(["-s", "test.py"])
2.3 運行結果:

運行代碼后,控制臺打印如下圖的結果

從結果看出,雖然test1,test2,test3三個地方都調用了login函數,并且它會在每一個用例前執行一次

2.如果test1不調用,test2(調用login),test3不調用,運行順序會是怎樣的?

2.4 參考代碼:
# coding=utf-8
# 1.導入模塊
import pytest@pytest.fixture(scope="function")
def login():print("登錄成功")yieldprint("用例執行完成,收尾")def test1():print('操作1')print("-----------------------------------------------")def test2(login):print('操作2')print("-----------------------------------------------")def test3():print('操作3')print("-----------------------------------------------")if __name__ == "__main__":pytest.main(["-s", "test.py"])
2.5 運行結果:

運行代碼后,控制臺打印如下圖的結果

從結果看出,function級別的fixture在當前.py模塊里,只會在用例(test_s2)第一次調用前執行一次

3.scope="module"

1.fixture參數scope=”module”,module作用是整個.py文件都會生效( 整個文件只會執行一次),用例調用時,參數寫上函數名稱就行

3.1 代碼實現:

3.2 參考代碼:
# coding=utf-8
# 1.導入模塊
import pytest@pytest.fixture(scope="module")
def login():print("登錄成功")yieldprint("用例執行完成,收尾")def test1(login):print('操作1')print("-----------------------------------------------")def test2(login):print('操作2')print("-----------------------------------------------")def test3(login):print('操作3')print("-----------------------------------------------")if __name__ == "__main__":pytest.main(["-s", "test_bjhg_function1.py"])
3.3 運行結果:

運行代碼后,控制臺打印如下圖的結果

從結果看出,雖然test1,test2,test3三個地方都調用了login函數,但是它只會在第一個用例前執行一次

2.如果test1不調用,test2(調用login),test3不調用,運行順序會是怎樣的?

3.4 參考代碼:
# coding=utf-8
# 1.導入模塊
import pytest@pytest.fixture(scope="module")
def login():print("登錄成功")yieldprint("用例執行完成,收尾")def test1():print('操作1')print("-----------------------------------------------")def test2(login):print('操作2')print("-----------------------------------------------")def test3():print('操作3')print("-----------------------------------------------")if __name__ == "__main__":pytest.main(["-s", "test.py"])
3.5 運行結果:

運行代碼后,控制臺打印如下圖的結果

從結果看出,module級別的fixture在當前.py模塊里,只會在用例(test_s2)第一次調用前執行一次

4. yield執行teardown

  細心的童鞋或者小伙伴可以看到,我前邊的代碼中有一個yield關鍵字,大家有點好奇是做什么的,這一小節就給你答疑解惑。其實就是用來喚醒teardown。

1.fixture里面的teardown用yield來喚醒teardown的執行

4.1 代碼實現:

4.2 參考代碼:
# coding=utf-8
# 1.導入模塊
import pytest@pytest.fixture(scope="module")
def login():print("登錄成功")yieldprint("執行teardown!")print("用例執行完成,收尾")def test1(login):print('操作1')print("-----------------------------------------------")def test2(login):print('操作2')print("-----------------------------------------------")def test3(login):print('操作3')print("-----------------------------------------------")if __name__ == "__main__":pytest.main(["-s", "test.py"])
4.3 運行結果:

運行代碼后,控制臺打印如下圖的結果

5. yield遇到異常

1.如果其中一個用例出現異常,不影響yield后面的teardown執行,運行結果互不影響,并且在用例全部執行完之后,會呼喚teardown的內容

5.1 代碼實現:

5.2 參考代碼:
# coding=utf-8
# 1.導入模塊
import pytest@pytest.fixture(scope="module")
def login():print("登錄成功")yieldprint("執行teardown!")print("用例執行完成,收尾")def test1(login):print('操作1')print("-----------------------------------------------")# 如果第一個用例異常了,不影響其他的用例執行raise NameError  # 模擬異常def test2(login):print('操作2')print("-----------------------------------------------")def test3(login):print('操作3')print("-----------------------------------------------")if __name__ == "__main__":pytest.main(["-s", "test.py"])
5.3 運行結果:

運行代碼后,控制臺打印如下圖的結果

2.如果在setup就異常了,那么是不會去執行yield后面的teardown內容了

3.yield也可以配合with語句使用,以下是官方文檔給的案例

# 官方文檔案例
# content of test_yield2.pyimport smtplib
import pytest@pytest.fixture(scope="module")
def smtp():with smtplib.SMTP("smtp.gmail.com") as smtp:yield smtp  # provide the fixture value

6.addfinalizer終結函數

1.除了yield可以實現teardown,在request-context對象中注冊addfinalizer方法也可以實現終結函數。

# 官方案例# content of conftest.py
import smtplib
import pytest@pytest.fixture(scope="module")
def smtp_connection(request):smtp_connection = smtplib.SMTP("smtp.gmail.com", 587, timeout=5)def fin():print("teardown smtp_connection")smtp_connection.close()request.addfinalizer(fin)return smtp_connection  # provide the fixture value

2.yield和addfinalizer方法都是在測試完成后呼叫相應的代碼。但是addfinalizer不同的是:

  • 他可以注冊多個終結函數。

  • 這些終結方法總是會被執行,無論在之前的setup code有沒有拋出錯誤。這個方法對于正確關閉所有的fixture創建的資源非常便利,即使其一在創建或獲取時失敗

參考文檔:pytest documentation

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/912683.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/912683.shtml
英文地址,請注明出處:http://en.pswp.cn/news/912683.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++中的cmath庫

在C編程中,數值計算是科學計算、工程應用及算法開發的基礎。cmath庫作為C標準庫的重要組成部分,提供了豐富的數學函數和工具,能夠高效處理各種數值計算任務。本文將全面解析cmath庫的核心功能,并通過實戰案例展示其強大威力。 一…

python包管理工具uv VS pip

在 Python 中,uv 和 pip 都是包管理工具,但它們的定位和特性有所不同。以下是主要區別: 1. pip(傳統工具) 定位:Python 官方的包安裝工具,是 Python 生態中最基礎的包管理器。特點:…

OpenCv基礎(C++)

1.圖像讀取與顯示 #include<opencv2/opencv.hpp> using namespace cv;Mat src imread("C:/Users/16385/Desktop/new/photo/1.jpg");//讀取圖像 Mat src imread("C:/Users/16385/Desktop/new/photo/1.jpg",IMREAD_GRAYSCALE); //將讀取的圖像轉為灰…

MySQL非阻塞創建索引的方法

文章目錄 1. Online DDL (MySQL 5.6)2. pt-online-schema-change 工具3. gh-ost 工具4. 對于MySQL 8.0注意事項 在MySQL中創建大型表索引時&#xff0c;傳統方式會阻塞表的寫操作&#xff0c;影響生產環境使用。以下是幾種非阻塞創建索引的方法&#xff1a; 1. Online DDL (My…

數字雨動畫背景

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>數字雨動畫背景</title><style>* {m…

分布式鎖的概念與應用場景

一、分布式鎖的核心概念 分布式鎖是一種在分布式系統環境下&#xff0c;用于保證多個進程/節點對共享資源實現互斥訪問的機制。其本質是通過某種中間件&#xff08;如Redis、ZooKeeper等&#xff09;實現跨節點的鎖控制&#xff0c;確保在分布式環境中&#xff0c;同一時刻只有…

js代碼09

題目 好的&#xff0c;我們繼續。 在上一個練習中&#xff0c;我們深入探討了 this 的復雜性。你會發現&#xff0c;ES6 引入的 class 語法在很大程度上就是為了簡化 this 的使用&#xff0c;并為 JavaScript 提供一個更清晰、更熟悉的面向對象編程&#xff08;OOP&#xff0…

基于Airtest的App數據爬取實戰:突破傳統爬蟲的邊界

引言:App數據爬取的技術困境 在當今移動優先的時代,App已成為企業核心數據載體,然而??傳統爬蟲技術??在App數據獲取上面臨三大難題: ??協議層屏障??:加密HTTPS、SSL Pinning等技術阻斷中間人攻擊??渲染層障礙??:React Native、Flutter等跨平臺框架使DOM解析…

【LeetCode 熱題 100】560. 和為 K 的子數組——(解法一)前綴和+暴力

Problem: 560. 和為 K 的子數組 題目&#xff1a;給你一個整數數組 nums 和一個整數 k &#xff0c;請你統計并返回 該數組中和為 k 的子數組的個數 。子數組是數組中元素的連續非空序列。 【LeetCode 熱題 100】560. 和為 K 的子數組——&#xff08;解法二&#xff09;前綴和…

android車載開發之HVAC

目前主要在做車載hvac的開發&#xff0c;主要的一些功能主要是hvac&#xff0c;座椅&#xff0c;香氛&#xff0c;設置等的一些模塊&#xff0c;具體模塊下&#xff0c;比如 1.空調 ac&#xff0c;智能模式&#xff08;極速降溫&#xff0c;極速采暖&#xff0c;智能除味&…

深度學習 Diffusers 庫(自留)

&#xff08;本文將圍繞 安裝Diffusers庫及其依賴、理解Diffusers核心概念&#xff1a;Pipeline, Model, Scheduler 、使用預訓練模型進行推理&#xff08;文生圖、圖生圖等&#xff09; 、 自定義模型和調度器 、訓練自己的擴散模型&#xff08;可選&#xff0c;需要大量資源&…

【VPC技術】基礎理論篇

文章目錄 概述相關基礎核心知識軟件定義網絡SDNOverlay 技術 安全組概述 參考博客 &#x1f60a;點此到文末驚喜?? 概述 相關基礎 基本概念 虛擬私有云VPC&#xff1a;是一個隔離的網絡環境&#xff0c;每個VPC擁有專屬的IP地址范圍&#xff08;CIDR&#xff09;、路由表、…

在 RK3588 Ubuntu 上編譯 eglinfo:全流程實戰 + 常見報錯修復

dv1/eglinfo 是一個開源的 EGL 信息檢測工具&#xff0c;廣泛用于 OpenGL ES 圖形棧調試、驅動驗證和嵌入式平臺圖形支持排查。在 Rockchip RK3588 上編譯該工具可以協助我們確認 EGL DRM 是否配置正確&#xff0c;尤其在無窗口系統&#xff08;如 eglfs、framebuffer&#xf…

開源推薦:基于前后端分離架構的WMS倉儲管理系統

開源推薦&#xff1a;基于前后端分離架構的WMS倉儲管理系統 &#x1f525; 在線演示地址&#xff1a;https://tob.toolxq.com/wms/wms.html 點擊上方鏈接可直接體驗系統功能和界面&#xff0c;無需安裝部署 前言 在企業數字化轉型的浪潮中&#xff0c;倉儲管理系統&#xff08…

Redis中List類型常見的操作命令有哪些?

Redis中List類型是一個字符串列表&#xff0c;這里是一些常見的命令&#xff1a; 1&#xff09;lpush:將一個或多個值插入到列表頭部。列表不存在&#xff0c;一個新的列表會被創建。 2&#xff09;rpush:將一個或多個值插入到列表尾部。 3&#xff09;lpop:移除并返回列表頭…

mac重復文件清理,攝影師同款清理方案

攝影師小林盯著屏幕上的警告&#xff1a;“存儲空間不足”&#xff0c;離截稿只剩3小時。她的MacBook如同塞滿回憶的閣樓&#xff0c;128GB的“其他”空間神秘消失。翻看照片庫時&#xff0c;她驚訝地發現——同一組西藏雪山照片竟有十幾個副本&#xff01;這是mac重復文件問題…

lua腳本為什么能保證原子性

Redis 處理客戶端請求是基于單線程模型的&#xff08; Redis 6.0 開始引入了多線程處理網絡 IO&#xff0c;但命令執行仍然是單線程的&#xff09;。這意味著&#xff0c;在任意時刻 Redis 只會執行一個命令或腳本。這種單線程特性確保了當 Redis 在執行一個 Lua 腳本時&#x…

爬蟲詳解:Aipy打造自動抓取代理工具

一、爬蟲的本質與核心功能 爬蟲是一種通過編寫程序自動抓取互聯網公開數據的技術工具&#xff0c;其核心流程包括&#xff1a; 模擬瀏覽器行為&#xff1a;發送 HTTP 請求訪問目標網頁解析頁面結構&#xff1a;提取 HTML/XML 中的關鍵信息&#xff08;如文本、鏈接、圖片&…

Leetcode百題斬-棧

終于來到了棧專題&#xff0c;想想之前來阿里的時候就是面試了一道棧最終通過了終面&#xff0c;也是十分懷念了。 739. Daily Temperatures[Medium] 思路&#xff1a;這就是最典型的單調棧問題了。從后向前維護下一個更大值或者下一個更大值的位置。 可以看一下當年面阿里時…

PIXHAWK(ardupilot4.52)NMEA的解析bug

最近在測試過程中發現在橢球高為負的地方&#xff0c;地面站讀取GPS_RAW_INT (24)消息中的alt高度竟然是正值。而消息中定義的alt并不是一個unsigned數據&#xff0c;理論上是帶有正負符號的。 查看gga的原始信息&#xff1a; $GPGGA,063718.40,3714.8533856,N,11845.9411766,…