這篇文章主要介紹了Python unittest單元測試框架的使用,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
一、測試模型
下面這部分來自於某書籍資料,拿過來,按需參考一下:
測試模型
(1)線性測試
1、概念:
通過錄製或編寫對應應用程式的操作步驟產生的線性腳本。單純的來模擬用戶完整的操作場景。(操作,重複操作,數據)都混合在一起。
2、優點:每個腳本相對獨立,且不產生其他依賴和調用。任何一個測試用例腳本拿出來都可以單獨執行。
3、缺點:開發成本高,用例之間存在重複的操作。比如重複的用戶登錄和退出。
維護成本高,由於重複的操作,當重複的操作發生改變時,則需要逐一進行腳本的修改。
4.線性測試實例:用戶登錄
(2)模塊化驅動測試
1、概念:
將重複的操作獨立成功共模塊,當用例執行過程中需要用到這一模塊操作時則被調用。
操作+(重複操作,數據)混合在一起。例如,自動化測試的執行需要保持測試用例的獨立性和完整性,所以每一條用例在執行時都需要登錄和退出操作,so可以把登錄和退出的操作封裝為公共函數。
2、優點:由於最大限度消除了重複,從而提高了開發效率和提高測試用例的可維護性。
3、缺點:雖然模塊化的步驟相同,但是測試數據不同。比如說重複的登錄模塊,如果登錄用戶不同,依舊要重複編寫登錄腳本。
4.實例:對公共模塊,例如登陸和退出進行模塊化封裝
(3)數據驅動測試
1、概念:它將測試中的測試數據和操作分離,數據存放在另外一個文件中單獨維護。
通過數據的改變從而驅動自動化測試的執行,最終引起測試結果的改變。
操作+重複操作+數據分開。
2、優點:
通過這種方式,將數據和重複操作分開,可以快速增加相似測試,完成不同數據情況下的測試。
3、實例從excel表格讀取用戶名密碼,登錄郵箱。
二、unittest框架
用Python搭建自動化測試框架,需要組織用例以及測試執行,大部分推薦的是unittest。現在用的也是這個,隨著了解,也有其他的框架,有時間再多去學習,保持持續學習哦~
附上官方文檔地址:連結描述https://docs.python.org/2.7/library/unittest.html#
unittest是Python自帶的單元測試框,可以用來作自動化測試框架的用例組織執行框架。優點:提供用例組織與執行方法;提供比較方法;提供豐富的日誌、清晰的報告。
大致流程:
通過命令行或者unittest.main()執行時,main會調用TextTestRunner中的run()來執行,或者可以直接通過TextTestRunner來執行用例。
在Runner執行時,默認將執行結果輸出到控制臺,我們可以設置其輸出到文件,在文件中查看結果。
unittest中最核心的部分是:TestFixture、TestCase、TestSuite、TestRunner。
1、Test fixture
用於一個測試環境的準備和銷毀還原。
當測試用例每次執行之前需要準備測試環境,每次測試完成後還原測試環境,比如執行前連接資料庫、打開瀏覽器等,執行完成後需要還原資料庫、關閉瀏覽器等操作。這時候就可以啟用testfixture。
setUp():準備環境,執行每個測試用例的前置條件;
tearDown():環境還原,執行每個測試用例的後置條件;
setUpClass():必須使用@classmethod裝飾器,所有case執行的前置條件,只運行一次;
tearDownClass():必須使用@classmethod裝飾器,所有case運行完後只運行一次;
例如:
def setUp(self): print("do something before test : prepare environment")def tearDown(self): print("do something after test : clean up ")2、TestCase
類,unittest.TestCase
一個類class繼承 unittest.TestCase,就是一個測試用例。一個TestCase的實例就是一個測試用例,就是一個完整的測試流程。
包括測試前環境準備setUp()|setUpClass()、執行代碼run()、測試環境後的還原tearDown()|tearDownClass()。
繼承自unittest.TestCase的類中,測試方法的名稱要以test開頭。且只會執行以test開頭定義的方法(測試用例)。例如:【先準備待測試的方法function.py】
def add(a,b): return a+bdef minus(a,b): return a-bdef multi(a,b): return a*bdef divide(a,b): return a/b【測試腳本】:
import unittestfrom A_UnitTest_basicDemo_ok.function import * class TestFunc(unittest.TestCase): def setUp(self): print("do something before test : prepare environment") def tearDown(self): print("do something after test : clean up ") def test_add(self): print("add:") self.assertEqual(3,add(1,2)) def test_minus(self): print("minus") self.assertEqual(3,minus(5,2)) def test_multi(self): print("multi") self.assertEqual(6,multi(2 ,3)) def test_divide(self): print("divide") self.assertEqual(2,divide(4,2)) if __name__ == "__main__": unittest.main(verbosity=2)或者也可以使用setUpClass() & tearDownClass()方法:
@classmethoddef setUpClass(cls): print("this setupclass() method only called once")@classmethoddef tearDownClass(cls): print("this teardownclass() method only called once too")【verbosity】
在測試用例文件的末尾加上如下代碼:
if __name__ == "__main__": unittest.main(verbosity=2)在unittest.main()中加參數verbosity可以控制錯誤報告的詳細程度:默認為1。0,表示不輸出每一個用例的執行結果;2表示詳細的執行報告結果。
【執行結果】:輸出到控制臺
this setupclass() method only called oncetest_add (__main__.TestFunc) ... okadd:test_divide (__main__.TestFunc) ... okdividetest_minus (__main__.TestFunc) ... okminustest_multi (__main__.TestFunc) ... okmulti
this teardownclass() method only called once tooRan 4 tests in 0.000s
OK3、TestSuite
上述簡單的測試會產生兩個問題,可不可以控制test測試用例的執行順序?若不想執行某個測試用例,有沒有辦法可以跳過?
對於執行順序,默認按照test的 A-Z、a-z的方法執行。若要按自己編寫的用例的先後關係執行,需要用到testSuite。
把多個測試用例集合起來,一起執行,就是testSuite。testsuite還可以包含testsuite。一般通過addTest()或者addTests()向suite中添加。case的執行順序與添加到Suite中的順序是一致的。
例如:run_main.py
if __name__ == "__main__": suite = unittest.TestSuite()tests=[TestFunc("test_add"),TestFunc("test_minus"),TestFunc("test_multi"),TestFunc("test_divide")]suite.addTests(tests)runner = unittest.TextTestRunner(verbosity=2)runner.run(suite)TestSuite可以再包含testsuite,示例如下:
suite1 = module.TheTestSuite()suite2=module.TheTestSuite()alltests=unittest.TestSuite([suite1],[suite2])跳過某個case:skip裝飾器
若想讓某個測試用例不執行,有沒有辦法呢?當然是有的,可以使用skip裝飾器。
例如:
@unittest.skip("i don't want to run this case -> test_minus() ... ")def test_minus(self): print("minus") self.assertEqual(3,minus(5,2))加上「@unittest.skip()」後,執行看看,對比控制臺的輸出結果就可以明顯看出區別了。
Skip裝飾器有如下幾種情況:
(1)skip():無條件跳過
@unittest.skip("i don't want to run this case. ")2)skipIf(condition,reason):如果condition為true,則 skip
@unittest.skipIf(condition,reason)(3)skipUnless(condition,reason):如果condition為False,則skip
@unittest.skipUnless(condition,reason)(4)還可以使用TestCase.skipTest(reason)。例如:
def test_divide(self): self.skipTest('do not run test_divide()') print("divide") self.assertEqual(2,divide(4,2))控制臺輸出(部分):test_divide (__main__.TestFunc) ... skipped 'do not run test_divide()'
4、TestLoader
TestLoadder用來加載TestCase到TestSuite中。
loadTestsFrom*()方法從各個地方尋找testcase,創建實例,然後addTestSuite,再返回一個TestSuite實例。
該類提供以下方法:
unittest.TestLoader().loadTestsFromTestCase(testCaseClass)unittest.TestLoader().loadTestsFromModule(module)unittest.TestLoader().loadTestsFromName(name,module=None)unittest.TestLoader().loadTestsFromNames(names,module=None)unittest.TestLoader().getTestCaseNames(testCaseclass)unittest.TestLoader().discover()TestLoader 之discover:
用discover()來加載測試多個測試用例,再用TextRunner類的run()方法去一次執行多個腳本的用例,達到批量執行的效果。
discover方法裡面有三個參數:
TextTestRunner():執行測試用例。runner.run(test)會執行TestSuite、TestCase中的run(result)方法。
如下:run_main.py示例
import unittestimport oscase_path = os.path.join(os.getcwd(),"case")report_path = os.path.join(os.getcwd(),"report")def all_cases(): discover= unittest.defaultTestLoader.discover(case_path,pattern="test*.py",top_level_dir=None) print(discover) return discoverif __name__ == "__main__": runner = unittest.TextTestRunner(verbosity=2) runner.run(all_cases())5、生成測試報告
生成TXT測試報告
代碼示例:
if __name__ == "__main__": suite = unittest.TestSuite() # 生成.txt的測試報告(控制臺的輸出寫入到文件中) suite.addTests(unittest.TestLoader().loadTestsFromTestCase(TestFunc)) with open('UnittestTextReport.txt','a') as f: runner = unittest.TextTestRunner(stream=f,verbosity=2) runner.run(suite)可以看到在目錄下,生成了UnittestTextReport.txt文件。
但是txt格式的文件太過於簡陋。我們可以藉助與第三方提供的庫來輸出更加形象的html報告,也可以自定義輸出自己想要格式的html格式的報告。
生成HTML測試報告
先下載HTMLTestRunner.py(注意Python的版本),http://tungwaiyip.info/software/HTMLTestRunner.html。然後放在
Python的Lib目錄下;
在run_main.py文件中加入:from HTMLTestRunner import
HTMLTestRunner
HTMLTestRunner()方法有三個參數:
--stream:測試報告寫入文件的存儲區域
--title:測試報告的主題
--description:測試報告的描述
代碼示例:
if __name__ == "__main__": suite = unittest.TestSuite() with open('HtmlReport.html','wb') as f: runner = HTMLTestRunner(stream=f,title='function test report',description='generated by HTMLTestRunner',verbosity=2) runner.run(suite)三、代碼示例
function.py
def add(a,b): return a+bdef minus(a,b): return a-bdef multi(a,b): return a*bdef divide(a,b): return a/bTest_function.py
import unittestfrom UnitTest_1.function import * class TestFunc(unittest.TestCase): @classmethod def setUpClass(cls): print("this setupclass() method only called once") @classmethod def tearDownClass(cls): print("this teardownclass() method only called once too") def test_add(self): print("add:") self.assertEqual(3,add(1,2)) def test_minus(self): print("minus") self.assertEqual(3,minus(5,2)) @unittest.skip("i don't want to run this case. ") def test_multi(self): print("multi") self.assertEqual(6,multi(2,3)) def test_divide(self): print("divide") self.assertEqual(2,divide(5,2)) if __name__ == "__main__": unittest.main(verbosity=2)Test_suite.py
import unittestfrom UnitTest_1.test_function import TestFuncfrom HTMLTestRunner import HTMLTestRunnerfrom io import StringIO if __name__ == "__main__": suite = unittest.TestSuite() tests = [TestFunc("test_add"),TestFunc("test_minus"),TestFunc("test_multi"),TestFunc("test_divide")] suite.addTests(tests) ''' runner = unittest.TextTestRunner(verbosity=2) runner.run(suite) ''' ''' suite.addTests(unittest.TestLoader().loadTestsFromTestCase(TestFunc)) with open('UnittestTextReport.txt','a') as f: runner = unittest.TextTestRunner(stream=f,verbosity=2) runner.run(suite) ''' with open('HtmlReport.html','wb') as f: runner = HTMLTestRunner(stream=f,title='function test report',description='generated by HTMLTestRunner',verbosity=2) runner.run(suite)以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持"軟體測試unittest"。
您可能感興趣的文章:
Python unittest 簡單實現參數化的方法
Pytest如何使用skip跳過執行測試
Python Django框架單元測試之文件上傳測試示例
Python單元測試與測試用例簡析
Python單元測試模塊doctest的具體使用
Python unittest單元測試框架及斷言方法
Python unittest單元測試框架實現參數化
Python編寫單元測試代碼實例
全面介紹python中很常用的單元測試框架unitest
Python+unittest+requests+excel實現接口自動化測試框架
基於Python的接口自動化unittest測試框架和ddt數據驅動詳解
Python單元測試框架unittest使用方法講解
python單元測試unittest實例詳解
Python中unittest用法實例
Python+request+unittest實現接口測試框架集成實例
python中如何打包用戶自定義模塊
詳解Python yaml模塊
python用Configobj模塊讀取配置文件
Python中fnmatch模塊的使用詳情
Python unittest裝飾器實現原理及代碼
對python的unittest架構公共參數token提取方法詳解
Python單元測試工具doctest和unittest詳細使用解析
Python + Requests + Unittest接口自動化測試實例分析
python pytest進階之fixture詳解
python pytest進階之conftest.py詳解
pytest之assert斷言的具體使用
Pytest接口自動化測試框架搭建模板
Python基於Hypothesis高級測試庫生成測試數據
pytest配置文件pytest.ini的詳細使用
Pytest中skip和skipif的具體使用方法
python中pytest收集用例規則與運行指定用例詳解
python pytest進階之xunit fixture詳解
python使用pytest接口自動化測試的使用
python單元測試之pytest的使用
pytest基本用法簡介
pycharm中使用request和Pytest進行接口測試的方法
通過代碼實例解析Pytest運行流程
pycharm不以pytest方式運行,想要切換回普通模式運行的操作
在pycharm中文件取消用 pytest模式打開的操作
Pytest單元測試框架如何實現參數化
Python 測試框架unittest和pytest的優劣
python單元測試框架pytest的使用示例
Python測試框架:pytest學習筆記
詳解如何使用Pytest進行自動化測試
Pytest測試框架基本使用方法詳解
測試入門以及pytest入門
Python測試框架之pytest詳解
刷完500道高頻面試題,我能去面試大廠了嗎?(持續更新)
今天也要點一鍵哦❤️❤️
"贊"、"在看"、