【Python自動化測試】:Unittest單元測試與HTMLTestRunner自動生成測試用例的好幫手

讀者大大們好呀!!!??????


博客頭像
🔥 歡迎來到我的博客
👀期待大大的關注哦??????
🚀歡迎收看我的主頁文章??尋至善的主頁

文章目錄

  • 🔥前言
  • 🚀unittest編寫測試用例
  • 🚀unittest測試用例執行
  • 🚀unittest常見的斷言方法
  • 🚀unittest測試結果分析
  • 🚀unittest測試用例的執行順序
  • 🚀跨文件組織測試用例
  • 🚀HTMLTestRunner生成測試報告
  • ??????總結

🔥前言

哲學三問:什么是Unittest?Unittest可以做什么?為什么用Unitest?

1??Python自帶的單元測試框架,此外基于Python還有其他的單元測試框架:pytest,doctest,nose等
2??編寫規范的測試用例,組織測試用例,生成測試結果
3??自動化編寫腳本(自動化測試用例)通常使用單元測試框架來編寫,組織和生成測試結果
下面就是實操環節了,盡情期待吧!

🚀unittest編寫測試用例

第一步:打開你已經裝好的神器:pyCharm,沒錯就是這個東西:
在這里插入圖片描述
第二步:新建一個工程---->unitTest1
在這里插入圖片描述
第三步:建立一個簡單的被測試文件(包含了加減乘除的函數類)---->count.py

class Count:def __init__(self, a, b):self.a = aself.b = bdef add(self):c = self.a + self.breturn cdef sub(self):d = self.a - self.breturn ddef div(self):e = self.a * self.breturn edef mul(self):e = self.a / self.breturn e

在這里插入圖片描述
第四步:根據被測函數使用unittest編寫測試代碼創建測試文件----Testcount.py
1??這里記得選Python unit Test創建Python測試文件:
在這里插入圖片描述
2??隨后會自動生成這些代碼:

import unittestclass MyTestCase(unittest.TestCase):def test_something(self):self.assertEqual(True, False)  # add assertion hereif __name__ == '__main__':unittest.main()

在這里插入圖片描述
第五步:開始編寫構造測試用例函數了:

import unittest
from count import Countclass TestCaseCount(unittest.TestCase):def setUp(self) -> None: # 每個測試用例開始前執行print("這是執行的測試準備階段!我要開始測試了!")  # add assertion heredef test_add1(self):  # 定義測試步驟與斷言print("我執行的是加法函數測試!")   # 添加該print語句幫助我們了解test_add1何時被執行c1 = Count(1, 2)  # 根據Count類生成對象c1,會自動調用Count類里的init方法r1 = c1.add()  # r1保存的是實際被測代碼的運行結果self.assertEqual(r1, 3)  # 將實際結果跟預期結果做等值比較,相等測試通過,不等測試失敗def test_sub2(self):  # 定義測試步驟與斷言print("我執行的是減法函數測試!")   # 添加該print語句幫助我們了解test_sub2何時被執行d1 = Count(2, 1)  # 根據Count類生成對象d1,會自動調用Count類里的init方法r2 = d1.sub()  # r2保存的是實際被測代碼的運行結果self.assertEqual(r2, 1)  # 將實際結果跟預期結果做等值比較,相等測試通過,不等測試失敗def test_div3(self):  # 定義測試步驟與斷言print("我執行的是乘法函數測試!")   # 添加該print語句幫助我們了解test_div3何時被執行e1 = Count(2, 2)  # 根據Count類生成對象e1,會自動調用Count類里的init方法r3 = e1.div()  # r3保存的是實際被測代碼的運行結果self.assertEqual(r3, 4)  # 將實際結果跟預期結果做等值比較,相等測試通過,不等測試失敗def test_mul4(self):  # 定義測試步驟與斷言print("我執行的是除法函數測試!")   # 添加該print語句幫助我們了解test_mul4何時被執行f1 = Count(4, 2)  # 根據Count類生成對象c1,會自動調用Count類里的init方法r4 = f1.mul()  # r1保存的是實際被測代碼的運行結果self.assertEqual(r4, 2)  # 將實際結果跟預期結果做等值比較,相等測試通過,不等測試失敗def tearDown(self) -> None:  # 每個測試用例結束后執行print("這是執行測試的結束,收拾殘局階段!!")if __name__ == '__main__':unittest.main()

PS:執行Python文件的內部調用與外部調用
在這里插入圖片描述

🚀unittest測試用例執行

上面的測試用例函數結構是:
方法名必須是以“test_”打頭,然后再是定義測試步驟與斷言,斷言會在下面講到。現在是運行截圖:
在這里插入圖片描述

🚀unittest常見的斷言方法

1??assertEqual(a,b):判斷a,b是否相等,如果相等,測試通過,如果不相等,測試失敗
2??assertNotEqual(a,b):判斷a,b是否不相等,如果相等,測試失敗

3??assertTrue(x):用于判斷bool(x)是否是True,如果不是True,測試失敗 與1??等效
4??assertFalse(x):用于判斷bool(x)是否是False,如果不是False,測試失敗 與2??等效
比如一個函數判斷一個數是否是素數便可用3、4的斷言方法

5??assertIn(a,b):用于判斷a是否在b中,如果a不在b中,則測試失敗
6??assertNotIn(a,b)和上個結果相反

🚀unittest測試結果分析

測試結果有三種:
1??測試通過–》 . 一個點表示一個用例通過,上面的圖片已經指出,下面著重介紹另外兩種
2??測試失敗–》
測試的函數方法與預期結果不符合便是測試失敗;比如我把加法的方法改一下:

    def add(self):c = self.areturn c

然后再進行測試:
在這里插入圖片描述
顯示三個用例成功,一個用例失敗。
3??測試錯誤–》
被測試代碼或語法原因產生的錯誤:
現在我把被測試函數的默認屬性方法改錯:

# def __init__(self, a, b):def __int__(self, a, b):self.a = aself.b = b

執行后直接報錯:
在這里插入圖片描述

🚀unittest測試用例的執行順序

測試方法的執行跟編寫的順序無關,而是根據test_后面接的ASCII碼的順序來執行(0-9,A-Z, _, a-z編碼越小執行的優先級越高)

當然我們也可以按照自定義的順序來執行:
不使用unittest的main方法默認順序執行,而是通過改為使用unittest提供的TestSuit(測試套件)+TestRunner(測試運行器)的方式可以實現自定義順序執行測試方法
我把下面main方法改一下:

if __name__ == '__main__':# unittest.main()   # 調用main()使用的是默認執行順序# 使用test suite+test runner來自定義執行順序# 一、按自定義順序加載測試方法到測試套件里ts = unittest.TestSuite()  # 調用unittest提供的TestSuite類生成對象tsts.addTest(TestCaseCount("test_mul4"))# 調用TestSuite里的addTest方法來加載TestCaseCount類里的test_mul4測試方法ts.addTest(TestCaseCount("test_div3"))# 調用TestSuite里的addTest方法來加載TestCaseCount類里的test_div3測試方法ts.addTest(TestCaseCount("test_sub2"))# 調用TestSuite里的addTest方法來加載TestCaseCount類里的test_sub2測試方法ts.addTest(TestCaseCount("test_add1"))# 調用TestSuite里的addTest方法來加載TestCaseCount類里的test_add1測試方法# 二、使用測試運行器執行測試套件里的用例,生成測試結果tr = unittest.TextTestRunner()  # 調用unittest提供的TextTestRunner類生成對象trtr.run(ts)  # 調用TextTestRunner里的run方法來執行測試套件ts里的用例執行并生成結果

執行結果如下:
在這里插入圖片描述

🚀跨文件組織測試用例

被測功能點肯定不止一個,而是多個,當被測功能點不斷擴展,相應的測試代碼也會不斷的增多,這些測試代碼不可能全部寫在一個文件里。此時,通常的處理辦法:根據所測功能點的不同,將相應的測試代碼分散在不同的文件里,然后組織這些分散在不同文件里的代碼一起執行。

組織分散在不同文件里的測試代碼一起執行的常見辦法:
🅰?Test Suite+Test Runner
🅱?discover
下面我將創建一個測試文件testcount2,里面的測試用例為其他測試數,兩個runtest測試文件來區分上面🅰?,🅱?兩種不同的執行方法
testcount2的文件代碼為:

import unittest
from count import Countclass TestCaseCount(unittest.TestCase):def setUp(self) -> None: # 每個測試用例開始前執行print("這是第二次執行的測試準備階段!我要開始測試了!")  # add assertion heredef test_add1(self):  # 定義測試步驟與斷言print("我執行的是第二次加法函數測試!")   # 添加該print語句幫助我們了解test_add1何時被執行c1 = Count(2, 2)  # 根據Count類生成對象c1,會自動調用Count類里的init方法r1 = c1.add()  # r1保存的是實際被測代碼的運行結果self.assertEqual(r1, 4)  # 將實際結果跟預期結果做等值比較,相等測試通過,不等測試失敗def test_sub2(self):  # 定義測試步驟與斷言print("我執行的是第二次減法函數測試!")   # 添加該print語句幫助我們了解test_sub2何時被執行d1 = Count(4, 1)  # 根據Count類生成對象d1,會自動調用Count類里的init方法r2 = d1.sub()  # r2保存的是實際被測代碼的運行結果self.assertEqual(r2, 3)  # 將實際結果跟預期結果做等值比較,相等測試通過,不等測試失敗def test_div3(self):  # 定義測試步驟與斷言print("我執行的是第二次乘法函數測試!")   # 添加該print語句幫助我們了解test_div3何時被執行e1 = Count(1, 2)  # 根據Count類生成對象e1,會自動調用Count類里的init方法r3 = e1.div()  # r3保存的是實際被測代碼的運行結果self.assertEqual(r3, 2)  # 將實際結果跟預期結果做等值比較,相等測試通過,不等測試失敗def test_mul4(self):  # 定義測試步驟與斷言print("我執行的是第二次除法函數測試!")   # 添加該print語句幫助我們了解test_mul4何時被執行f1 = Count(1, 1)  # 根據Count類生成對象c1,會自動調用Count類里的init方法r4 = f1.mul()  # r1保存的是實際被測代碼的運行結果self.assertEqual(r4, 1)  # 將實際結果跟預期結果做等值比較,相等測試通過,不等測試失敗def tearDown(self) -> None:  # 每個測試用例結束后執行print("這是第二次執行測試的結束,收拾殘局階段!!")if __name__ == '__main__':unittest.main()

runtest1的代碼為:所使用的是Test Suite+Test Runner方法

import unittest
import testcount
import testcount2if __name__ == '__main__':# unittest.main()   # 調用main()使用的是默認執行順序# 使用test suite+test runner來自定義執行順序# 一、按自定義順序加載測試方法到測試套件里ts = unittest.TestSuite()  # 調用unittest提供的TestSuite類生成對象tsts.addTest(testcount.TestCaseCount("test_mul4"))  # 調用TestSuite里的addTest方法來加載TestCaseCount類里的test_mul4測試方法ts.addTest(testcount2.TestCaseCount2("test_mul4"))ts.addTest(testcount.TestCaseCount("test_div3")) # 調用TestSuite里的addTest方法來加載TestCaseCount類里的test_div3測試方法ts.addTest(testcount2.TestCaseCount2("test_div3"))ts.addTest(testcount.TestCaseCount("test_sub2"))  # 調用TestSuite里的addTest方法來加載TestCaseCount類里的test_sub2測試方法ts.addTest(testcount2.TestCaseCount2("test_sub2"))ts.addTest(testcount.TestCaseCount("test_add1"))  # 調用TestSuite里的addTest方法來加載TestCaseCount類里的test_add1測試方法ts.addTest(testcount2.TestCaseCount2("test_add1"))# 二、使用測試運行器執行測試套件里的用例,生成測試結果tr = unittest.TextTestRunner()  # 調用unittest提供的TextTestRunner類生成對象trtr.run(ts)  # 調用TextTestRunner里的run方法來執行測試套件ts里的用例執行并生成結果

運行結果截圖:
在這里插入圖片描述

runtest2的代碼為:所使用的是discover方法

import unittestif __name__ == '__main__':# unittest.main()# 使用discover加載testcount.py和testcount2.py里的用例一起執行# 自動發現unitTest1包下的testcount打頭的Python文件里的測試方法,將其加載到測試套件ts里ts = unittest.defaultTestLoader.discover("./", pattern="testcount*.py")# 運行器運行套件用例tr =unittest.TextTestRunner()tr.run(ts)

運行截圖如下:
在這里插入圖片描述

🚀HTMLTestRunner生成測試報告

既然我們做的是測試,那么便要實現生成獨立的測試報告:這里我們需要用到第三方庫HTMLTestRunner.py------>獨立生成HTML文件格式的測試文檔:
在網上(包括在Python官方文庫)找不到HTMLTestRunner相關解釋資料。其實HTMLTestRunner是一個第三方的unittest HTML報告庫,關于unittest在Python官方文庫上很容易找到:然后下載下來放到Python的lib文件下

具體實現代碼在runtest2下,代碼修改如下:

import unittest
import HTMLTestRunnerif __name__ == '__main__':# unittest.main()# 使用discover加載testcount.py和testcount2.py里的用例一起執行# 自動發現unitTest1包下的testcount打頭的Python文件里的測試方法,將其加載到測試套件ts里ts = unittest.defaultTestLoader.discover("./", pattern="testcount*.py")# 運行器運行套件用例# tr =unittest.TextTestRunner()# tr.run(ts)# 除了可以使用unittest提供的TextTestRunner文本測試運行器來執行用例生成測試結果以外,# 還可以使用HTMLTestRunner.py模塊提供的HTMLTestRunner類來執行用例生成獨立的測試報告# 以二進制寫的模式打開當前目錄下的report.html文件,準備往里面寫內容,如果文件不存在則自動創建f = open('./report.html', 'wb')tr = HTMLTestRunner.HTMLTestRunner(stream=f, title="四則運算測試報告", description="說明信息")tr.run(ts)f.close()

生成的HTML文件測試報告截圖如下:
在這里插入圖片描述

??????總結

test case測試用例unittest提供了TestCase類用來編寫測試用例
test suite測試套件unittest提供了TestSuite類用來組裝測試用例生成測試用例集合
test runner測試運行器unittest提供了TextTestRunner類用來執行測試用例生成測試結果
test fixture測試固件unittest提供了一系列的固件:setUp,tearDown就是測試固件的一種,用來完成測試前的準備工作和測試后的清理工作。

??????如果喜歡這篇文章的話

🙏大大們可以動動發財的小手:
👉👉👉 點贊:👍收藏:??評論:??👈👈👈

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

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

相關文章

六種常用設計模式

單例設計模式 單例模式指在整個系統生命周期里,保證一個類只能產生一個實例,確保該類的唯一性。 單例模式分類 單例模式可以分為懶漢式和餓漢式,兩者之間的區別在于創建實例的時間不同: 懶漢式:指系統運行中&#…

SpringBootWeb 篇-深入了解 Mybatis 刪除、新增、更新、查詢的基礎操作與 SQL 預編譯解決 SQL 注入問題

🔥博客主頁: 【小扳_-CSDN博客】 ?感謝大家點贊👍收藏?評論? 文章目錄 1.0 Mybatis 的基礎操作 2.0 基礎操作 - 環境準備 3.0 基礎操作 - 刪除操作 3.1 SQL 預編譯 3.2 SQL 預編譯的優勢 3.3 參數占位符 4.0 基礎操作 - 新增 4.1 主鍵返回…

Python圖像處理:從基礎到高級的全方位指南

目錄 第一部分:Python圖像處理基礎 1.1 圖像處理概念 1.2 Python圖像處理常用庫 1.3 實戰案例:圖像顯示與保存 1.4 注意事項 第二部分:Python圖像處理高級技巧 2.1 圖像變換 2.2 圖像增強 2.3 圖像復原 第三部分:Python…

esp32s3中ap與sta模式的wps配對問題

無線路由器中的WPS是Wi-Fi Protected Setup的簡稱,中文翻譯為Wi-Fi安全防護設置,它是由Wi-Fi安全聯盟推出的一種無線加密認證方式。主要是為了簡化無線局域網的安裝及安全性能配置工作,通過這種設置,讓無線連接更加方便和安全。省…

20232802 黃千里 2023-2024-2 《網絡攻防實踐》實踐十一報告

20232802 2023-2024-2 《網絡攻防實踐》實踐十一報告 1.實踐過程 1.1web瀏覽器滲透攻擊 攻擊機:kali172.20.10.10靶機:win2k172.20.10.3 首先在kali中啟動msfconsole 輸入命令search MS06-014,搜索滲透攻擊模塊 輸入use exploit/window…

終于讓我找到了,你也可以學會的人工智能-機器學習教程

給大家分享一套非常棒的python機器學習課程——《AI小天才:讓小學生輕松掌握機器學習》,2024年5月完結新課,提供配套的代碼筆記軟件包下載!學完本課程,可以輕松掌握機器學習的全面應用,復雜特征工程&#x…

C# 跨線程訪問UI組件,serialPort1串口接收數據

在Windows應用程序(例如WinForms或WPF)中,UI組件(如按鈕、文本框等)都在主線程(也稱為UI線程)上運行。當你在一個非UI線程(例如,一個后臺線程或者網絡請求線程&#xff0…

關于新配置的adb,設備管理器找不到此設備問題

上面頁面中一開始沒有找到此android設備, 可能是因為我重新配置的adb和設備驅動, 只把adb配置了環境變量,驅動沒有更新到電腦中, 點擊添加驅動, 選擇路徑,我安裝時都放在了SDK下面,可以嘗試…

SpringBoot 實現 RAS+AES 自動接口解密

一、講個事故 接口安全老生常談了 過年之前做了過一款飛機大戰的H5小游戲,里面無限模式-需要保存用戶的積分,因為使用的Body傳參,參數是可見的。 為了接口安全我,我和前端約定了傳遞參數是:用戶無限模式的積分“我們…

HTML靜態網頁成品作業(HTML+CSS)——魅族商城首頁網頁(1個頁面)

🎉不定期分享源碼,關注不丟失哦 文章目錄 一、作品介紹二、作品演示三、代碼目錄四、網站代碼HTML部分代碼 五、源碼獲取 一、作品介紹 🏷?本套采用HTMLCSS,未使用Javacsript代碼,共有1個頁面。 二、作品演示 三、代…

基于Python+OpenCV卷積神經網絡的字符識別

歡迎大家點贊、收藏、關注、評論啦 ,由于篇幅有限,只展示了部分核心代碼。 文章目錄 一項目簡介 二、功能三、系統四. 總結 一項目簡介 一、項目背景與意義 字符識別是計算機視覺和模式識別領域的一個重要應用,它在文檔數字化、車牌識別、驗…

gpt-4o考場安排

說明 :經過多次交互,前后花了幾個小時,總算完成了基本功能。如果做到按不同層次分配考場,一鍵出打印結果就完美了。如果不想看中間“艱苦”的過程,請直接跳到“最后結果”及“食用方法”。中間過程還省略了一部分交互&…

Android-多個tv_item_[i] 點擊事件簡寫

private TextView[] tvConstellations new TextView[12];//獲取當前id元素并在其點擊的時候修改其顏色 for (int i 0; i < 12; i) {int resId getResources().getIdentifier("tv_constellation_" (i1), "id", getPackageName());tvConstellations[i…

神經網絡與深度學習 課程復習總結

神經網絡的發展歷史 第一代神經網絡&#xff08;1958~1969&#xff09; MCP模型&#xff08;1943年&#xff09;&#xff1a;麥卡洛克和皮茨提出了第一個人工神經元模型&#xff0c;簡化為輸入信號線性加權、求和、非線性激活&#xff08;閾值法&#xff09;。感知器&#xf…

鴻蒙開發 組件之間的傳值

1.Prop&#xff1a;父組件傳遞給子組件&#xff0c;單向傳遞&#xff0c;子組件改變值&#xff0c;父組件UI不更新。 引入子組件 并賦值&#xff0c;子組件用Prop 接收 import headerView from ../../common/bean/BaseNavHeaderView headerView({titlestr:添加地址,isback…

go slice 擴容

擴容 slice 會遷移到新的內存位置&#xff0c;新底層數組的長度也會增加&#xff0c;這樣就可以放置新增的元素。同時&#xff0c;為了應對未來可能再次發生的 append 操作&#xff0c;新的底層數組的長度&#xff0c;也就是新 slice 的容量是留了一定的 buffer 的。否則&…

【C++】STL快速入門基礎

文章目錄 STL&#xff08;Standard Template Library&#xff09;1、一般介紹2、STL的六大組件2.1、STL容器2.2、STL迭代器2.3、相關容器的函數vectorpairstringqueuepriority_queuestackdequeset, map, multiset, multimapunordered_set, unordered_map, unordered_multiset, …

LabVIEW2022安裝教程指南【附安裝包】

文章目錄 前言一、安裝指南1、軟件包獲取 二、安裝步驟總結 前言 LabVIEW是一種程序開發環境&#xff0c;提供一種圖形化編程方法&#xff0c;可可視化應用程序的各個方面&#xff0c;包括硬件配置、測量數據和調試&#xff0c;同時可以通過FPGA數學和分析選板中的NI浮點庫鏈接…

有趣的css - 兩個圓形加載效果

大家好&#xff0c;我是 Just&#xff0c;這里是「設計師工作日常」&#xff0c;今天分享的是一款小清新的加載動畫&#xff0c;適用于 app 列表加載&#xff0c;頁面加載或者彈層內容延遲加載等場景。 最新文章通過公眾號「設計師工作日常」發布。 目錄 整體效果核心代碼html…

AWS安全性身份和合規性之Amazon Macie

Amazon Macie是一項數據安全和數據隱私服務&#xff0c;它利用機器學習&#xff08;ML&#xff09;和模式匹配來發現和保護敏感數據。可幫助客戶發現、分類和保護其敏感數據&#xff0c;以及監控其數據存儲庫的安全性。 應用場景&#xff1a; 敏感數據發現 一家金融服務公司…