Python 自動化測試必會技能板塊—unittest框架

說到 Python 的單元測試框架,想必接觸過 Python 的朋友腦袋里第一個想到的就是 unittest。

的確,作為 Python 的標準庫,它很優秀,并被廣泛應用于各個項目。但其實在 Python 眾多項目中,主流的單元測試框架遠不止這一個。

一、介紹

unittest 單元測試框架最早受到 JUnit 的啟發,和其他語言的主流單元測試框架有著相似的風格。它支持測試自動化,多個測試用例共享前置(setUp)和清理(tearDown)代碼,聚合多個測試用例到測試集中,并將測試和報告框架獨立。

二、用例編寫

下面這段簡單的示例來自于官方文檔,用來測試三種字符串方法:upper、isupper、split:

上述示例中,通過繼承 unittest.TestCase 來創建一個測試用例。在這個類中,定義以 test 開頭的方法,測試框架將把它作為獨立的測試去執行。

每個用例都采用 unittest 內置的斷言方法來判斷被測對象的行為是否符合預期,比如:

  • 在 test_upper 測試中,使用 assertEqual 檢查是否是預期值

  • 在 test_isupper 測試中,使用 assertTrue 或 assertFalse 驗證是否符合條件

  • 在 test_split 測試中,使用 assertRaises 驗證是否拋出一個特定異常

可能有人會好奇,為什么不使用內置斷言語句 assert,而要額外提供這么多斷言方法并使用呢?原因是通過使用 unittest 提供的斷言方法,測試框架在運行結束后,能夠聚合所有的測試結果并產生信息豐富的測試報告。而直接使用 assert 雖然也可以達到驗證被測對象是否符合預期的目的,但在用例出錯時,報錯信息不夠豐富。

三、用例發現和執行

unittest 支持用例自動(遞歸)發現:

默認發現當前目錄下所有符合 test*.py 測試用例

使用 python -m unittest 或 python -m unittest discover

通過 -s 參數指定要自動發現的目錄, -p 參數指定用例文件的名稱模式

    python -m unittest discover -s project_directory -p "test_*.py"

通過位置參數指定自動發現的目錄和用例文件的名稱模式

    python -m unittest discover project_directory "test_*.py"

unittest 支持執行指定用例:

指定測試模塊

    python -m unittest test_module1 test_module2

指定測試類

    python -m unittest test_module.TestClass

指定測試方法

    python -m unittest test_module.TestClass.test_method

指定測試文件路徑(僅 Python 3)

    python -m unittest tests/test_something.py

四、測試夾具(Fixtures)

測試夾具也就是測試前置(setUp)和清理(tearDown)方法。測試前置方法 setUp() 用來做一些準備工作,比如建立數據庫連接。它會在用例執行前被測試框架自動調用。

測試清理方法 tearDown() 用來做一些清理工作,比如斷開數據庫連接。它會在用例執行完成(包括失敗的情況)后被測試框架自動調用。測試前置和清理方法可以有不同的執行級別。

4.1 生效級別:測試方法

如果我們希望每個測試方法之前前后分別執行測試前置和清理方法,那么需要在測試類中定義好 setUp() 和 tearDown():

4.2 生效級別:測試類

如果我們希望單個測試類中只執行一次前置方法,再執行該測試類中的所有測試,最后執行一次清理方法,那么需要在測試類中定義好 setUpClass() 和 tearDownClass():

4.3 生效級別:測試模塊

如果我們希望單個測試模塊中只執行一次前置方法,再執行該模塊中所有測試類的所有測試,最后執行一次清理方法,那么需要在測試模塊中定義好 setUpModule() 和 tearDownModule():

五、跳過測試和預計失敗

unittest 支持直接跳過或按條件跳過測試,也支持預計測試失敗:

通過 skip 裝飾器或 SkipTest 直接跳過測試

通過 skipIf 或 skipUnless 按條件跳過或不跳過測試

通過 expectedFailure 預計測試失敗

六、子測試

有時候,你可能想編寫這樣的測試:在一個測試方法中傳入不同的參數來測試同一段邏輯,但它將被視作一個測試,但是如果使用了子測試,就能被視作 N(即為參數的個數)個測試。下面是一個示例:

示例中使用了 with self.subTest(i=i) 的方式定義子測試,這種情況下,即使單個子測試執行失敗,也不會影響后續子測試的執行。這樣,我們就能看到輸出中有三個子測試不通過:

七、測試結果輸出

基于簡單示例小節中提到的例子,來說明下 unittest 在運行完測試后的結果輸出。

默認情況下的輸出非常簡單,展示運行了多少個用例,以及所花費的時間:

通過指定 -v 參數,可以得到詳細輸出,除了默認輸出的內容,還額外顯示了用例名稱:

假定 test_upper 測試失敗,則在詳細輸出模式下,結果如下:

如果我們將 test_upper 測試方法中的 self.assertEqual 改為 assert,則測試結果輸出中將會少了對排查錯誤很有幫助的上下文信息:

如果想要生成 HTML 格式的報告,那么就需要額外借助第三方庫(如 HtmlTestRunner)來操作。

在安裝好第三方庫后,你不能直接使用 python -m unittest 加上類似 --html report.html 的方式來生成 HTML 報告,而是需要自行編寫少量代碼來運行測試用例進而得到 HTML 報告。

詳情請查看 HtmlTestRunner 使用說明。

八、小結

unittest 作為 Python 標準庫提供的單元測試框架,使用簡單、功能強大,日常測試需求均能得到很好的滿足。在不引入第三方庫的情況下,是單元測試的不二之選。

最后感謝每一個認真閱讀我文章的人,禮尚往來總是要有的,雖然不是什么很值錢的東西,如果你用得到的話可以直接拿走:

?

這些資料,對于【軟件測試】的朋友來說應該是最全面最完整的備戰倉庫,這個倉庫也陪伴上萬個測試工程師們走過最艱難的路程,希望也能幫助到你!

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

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

相關文章

西門子PLC1200--與電腦S7通訊

硬件構成 PLC為西門子1211DCDCDC 電腦上位機用PYTHON編寫 二者通訊用網線,通訊協議用S7 PLC上的數據 PLC上的數據是2個uint,在DB1,地址偏移分別是0和2 需要注意的是DB塊要關閉優化的塊訪問,否則是沒有偏移地址的 PLC中的數據內…

elementui中日期/時間的禁用處理,使用傳值的方式

項目中,經常會用到 在一個學年或者一個學期或者某一個時間段需要做的某件事情,則我們需要在創建這個事件的時候,需要設置一定的時間周期,那這個時間周期就需要給一定的限制處理,避免用戶的誤操作,優化用戶體驗 如下:需求為,在選擇學年后,學期的設置需要在學年中,且結束時間大…

Spring Cloud Gateway如何匹配某路徑并進行路由轉發

本案例,將/helloworld-app/**的請求轉發到helloworld微服務的/**路徑(既如lb://helloworld/**) 配置如下(見spring.cloud.gateway.routes配置): spring:application:name: SpringCloudGatewayDemocloud:n…

軟件架構之計算機組成與體系結構

1.1計算機系統組成 計算機系統是一個硬件和軟件的綜合體,可以把它看成按功能劃分的多級層次結構。 1.1.1 計算機硬件的組成 硬件通常是指一切看得見,摸得到的設備實體。原始的馮?諾依曼(VonNeumann)計算機在結構上是以運算器為…

2024年中國十大杰出起名大師排行榜,最厲害的易經姓名學改名字專家

在2024年揭曉的中國十大杰出易學泰斗評選中,一系列對姓名學與國學易經有深入研究的專家榮登榜單。其中,中國十大權威姓名學專家泰斗頂級杰出代表人物的師傅顏廷利大師以其在國際舞臺上的卓越貢獻和深邃學識,被公認為姓名學及易經起名領域的權…

C#程序調用Sql Server存儲過程異常處理:調用存儲過程后不返回、不拋異常的解決方案

目錄 一、代碼解析: 二、解決方案 1、增加日志記錄 2、異步操作 注意事項 3、增加超時機制 4、使用線程池 5、使用信號量或事件 6、監控數據庫連接狀態 在C#程序操作Sql Server數據庫的實際應用中,若異常就會拋出異常,我們還能找到異…

Leetcode 完美數

1.題目要求: 對于一個 正整數,如果它和除了它自身以外的所有 正因子 之和相等,我們稱它為 「完美數」。給定一個 整數 n, 如果是完美數,返回 true;否則返回 false。示例 1:輸入:num 28 輸出&a…

2024年6月份找工作和面試總結

轉眼間6月份已經過完了,2024年已經過了一半,希望大家都找到了合適的工作。 本人前段時間寫了5月份找工作的情況,請查看2024年5月份面試總結-CSDN博客 但是后續寫的總結被和諧了,不知道這篇文章能不能發出來。 1、6月份面試機會依…

網絡爬蟲基礎

網絡爬蟲基礎 網絡爬蟲,也被稱為網絡蜘蛛或爬蟲,是一種用于自動瀏覽互聯網并從網頁中提取信息的軟件程序。它們能夠訪問網站,解析頁面內容,并收集所需數據。Python語言因其簡潔的語法和強大的庫支持,成為實現網絡爬蟲…

verilog讀寫文件注意事項

想要的16進制數是文本格式提供的文件,想將16進制數提取到變量內, 可以使用 f s c a n f ( f d 1 , " 也可以使用 fscanf(fd1,"%h",rd_byte);實現 也可以使用 fscanf(fd1,"也可以使用readmemh(“./FILE/1.txt”,mem);//fe放在mem[0…

運用Redis作為設備注冊中心,解決20w+設備高并發讀寫,高性能讀寫異步把數據同步到mysql持久化。

使用 Redis 作為設備注冊中心,并通過高并發讀寫將數據異步同步到 MySQL 數據庫,可以采用以下策略: 1. **設備注冊與發現**: - 使用 Redis 的字符串或哈希表存儲設備信息,其中鍵可以是設備的唯一標識符。 2. **高并…

基于Android Studio零食工坊

目錄 項目介紹 圖片展示 運行環境 獲取方式 項目介紹 用戶 可以瀏覽商品 , 查詢商品 , 加入購物車 , 結算商品 , 查看瀏覽記錄 , 修改密碼 , 修改個人信息 , 查詢訂單 管理員 能夠實現商品的…

別再寫一堆 if 判斷了?分享 1 段優質 JS 代碼片段!

本內容首發于工粽號:程序員大澈,每日分享一段優質代碼片段,歡迎關注和投稿! 大家好,我是大澈! 本文約 700 字,整篇閱讀約需 1 分鐘。 今天分享一段優質 JS 代碼片段,用條件數組來簡…

huggingface筆記:gpt2

0 使用的tips GPT-2是一個具有絕對位置嵌入的模型,因此通常建議在輸入的右側而不是左側填充GPT-2是通過因果語言建模(CLM)目標進行訓練的,因此在預測序列中的下一個標記方面非常強大 利用這一特性,GPT-2可以生成語法連…

C#面 :ASP.Net Core中有哪些異常處理的方案?

在 ASP.NET Core中,有多種異常處理方案可供選擇。以下是其中幾種常見的異常處理方案: 中間件異常處理: ASP.NET Core提供了一個中間件來處理全局異常。通過在Startup類的Configure方法中添加UseExceptionHandler中間件,可以捕獲…

Autosar MCAL-S32k324 Crypto配置-RandomNumber生成及使用

文章目錄 前言CryptoPrimitivesCryptoPrimitiveAlgorithmFamilyCryptoPrimitiveAlgorithmModeCryptoPrimitiveAlgorithmSecondaryFamilyCryptoPrimitiveServiceCryptoDriverObject代碼使用Random Generate執行流程配置job函數使用示例總結前言 之前介紹過AES-CMAC算法的配置,…

Windows 與 Windows Server 2022環境下如何開啟遠程桌面

文章目錄 前言Windows 環境下如何開啟遠程桌面控制功能Windows Server 環境下如何開啟遠程桌面 前言 我這邊是客戶需要搭建一套備份系統,整體的系統流程是這樣的:客戶的筆記本或者其他PC工具可以自由訪問到我司搭建的服務器平臺并進行文件傳輸&#xff…

【C++】開源:地圖投影和坐標轉換proj庫配置使用

😏★,:.☆( ̄▽ ̄)/$:.★ 😏 這篇文章主要介紹地圖投影和坐標轉換proj庫配置使用。 無專精則不能成,無涉獵則不能通。——梁啟超 歡迎來到我的博客,一起學習,共同進步。 喜歡的朋友可以關注一下&a…

vue中的watch和$watch的用法實際場景和區別

watch(組件選項) watch 是Vue組件的一個選項,它允許你定義一些監聽器,這些監聽器會在組件的響應式數據變化時調用。它主要用于組件內部的數據監聽。 實際場景: 當組件內部的數據變化時,需要執行一些操作&…

5款極其強大的大模型文生圖工具!

文生圖技術是一種基于深度學習的技術,可以根據自然語言描述生成相應的高品質圖像。 下面介紹幾個目前市場上比較優秀的工具或網站,并制作一張男性的白袍巫師圖來比較。 針對大模型和AIGC技術趨勢、AIGC 算法項目落地經驗分享、新手如何入門算法崗、該如…