【unittest】unittest基礎01
阿新 • • 發佈:2022-03-04
一、什麼是unittest
unittest是Python單元測試框架,類似於JUnit框架。
unittest中有4個重要的概念:test fixture、 test case、 test suite,、test runner
Testcase:一個TestCase的例項就是一個測試用例(包括測試前準備環境的搭建(setUp),執行測試程式碼 (run),以及測試後環境的還原(tearDown)。
Test suite:多個測試用例集合在一起,就是TestSuite,而且TestSuite也可以巢狀TestSuite。
Test runner:其中的run(test)會執行TestSuite/TestCase中的run(result)方法。
Test fixture:對一個測試用例環境的搭建和銷燬,是一個fixture,通過覆蓋 TestCase的setUp()和tearDown()方法來實現
TestLoader:是用來載入TestCase到TestSuite中的,其中有幾個loadTestsFrom__()方法,就是從各個地方尋找TestCase,建立它們的例項,然後add到TestSuite中,再返回一個TestSuite例項。
二、簡單用法
unittest是python自帶的一個單元測試框架,類似於java的junit,基本結構是類似的。基本用法如下:
1.用import unittest匯入unittest模組 2.定義一個繼承自unittest.TestCase的測試用例類,如class xxx(unittest.TestCase): 3.定義setUp和tearDown,這兩個方法與junit相同,即如果定義了則會在每個測試case執行前先執行setUp方法,執行完畢後執行tearDown方法。 4.定義測試用例,名字以test開頭,unittest會自動將test開頭的方法放入測試用例集中。 5.一個測試用例應該只測試一個方面,測試目的和測試內容應很明確。主要是呼叫assertEqual、assertRaises等斷言方法判斷程式執行結果和預期值是否相符。 6.呼叫unittest.main()啟動測試
三、unittest模組的常用方法
assertEqual(a, b) a == b assertNotEqual(a, b) a != b assertTrue(x) bool(x) is True assertFalse(x) bool(x) is False
例項展示01:
import unittest class TestSample(unittest.TestCase): #類共享的fixture,在整個測試類開頭執行一次 @classmethod def setUpClass(cls): print('整個測試類只執行一次 --start') #測試用例fixture def setUp(self): print('每給測試開始前執行一次') #測試用例預設以test開頭 def test_equal(self): self.assertEqual(1,1) def test_not_equal(self): self.assertNotEqual(1,0) #測試用例fixture def tearDown(self): print('每個測試結束後執行一次') #整個測試列結束執行一次 @classmethod def tearDownClass(cls): print('整個測試類只執行一次 --End') if __name__ == '__main__': unittest.main()
實戰參考程式碼:
新建lagouTest專案:
itesting_test程式碼:
import unittest class ITestingTest(unittest.TestCase): @classmethod def setUpClass(cls) -> None: print("整個測試類支援一次 --start") def setUp(self) -> None: print('整個測試開始前執行一次') # 測試用例預設以test開頭 def test_equal(self): self.assertEqual(1, 1) def test_not_equal(self): self.assertNotEqual(1, 0) # 測試用例fixture def tearDown(self): print('每個測試結束後執行一次') # 整個測試列結束執行一次 @classmethod def tearDownClass(cls): print('整個測試類只執行一次 --End')
test_to_run程式碼參考:
import unittest class TestToRun(unittest.TestCase): def setUp(self) -> None: #setUp()方法,通常開啟瀏覽器,初始化API請求或者準備測試資料 pass def testAssertNotEqual(self): #這裡具體的測試方法,此處只是演示 self.assertEqual(1,2) def testAssertEqual(self): self.assertEqual(1,1) def tearDown(self) -> None: #定義測試後的清理動作 pass
main.py檔案:
解析tests資料夾,手動查詢並載入測試用例到測試套件
import os import unittest import importlib.util #解析tests資料夾並且返回module的字元列表 def get_module_name_string(file_dir): return_list=[] for root,dirs,file in os.walk(file_dir): #root 所指的是當前正在遍歷的這個資料夾的本身的地址 #dirs 是一個 list ,內容是該資料夾中所有的目錄的名字(不包括子目錄) #file 同樣是 list , 內容是該資料夾中所有的檔案(不包括子目錄) for i in file: if not (i.endswith('__init__.py') or i.endswith('.pyc')) and i.startswith('test'): f=os.path.join(root,i) mod ='tests.' + f.split('\\tests\\')[1].replace('.py','') return_list.append(mod) return return_list if __name__ == '__main__': #定義suite測試套件 suites=unittest.TestSuite() #使用package.mod方式獲取所有模組的string #os.path.join(os.path.dirname(__file__) 獲取當前目錄 mod_sting_list=get_module_name_string(os.path.join(os.path.dirname(__file__),'tests')) print(mod_sting_list) #遍歷每一個mod string 先匯入再把他加入測試用例 for mod_string in mod_sting_list: print(mod_string) #m為對應的test用例檔案目錄 m =importlib.import_module(mod_string) #測試載入器TestLoader test_case =unittest.TestLoader().loadTestsFromModule(m) #新增測試用例到測試套件 suites.addTest(test_case) #runner測試執行器,指定runner為TextTestRunner runner=unittest.TextTestRunner(verbosity=2) #執行suite runner.run(suites)
動態載入檔案
if __name__ == '__main__': #動態查詢測試用例檔案 loader =unittest.defaultTestLoader #生成測試suite #os.path.join(os.path.dirname(__file__) 起始檔案位置,top_level_dir必須指定 suite=loader.discover(os.path.join(os.path.dirname(__file__),'tests'),pattern='test*.py',top_level_dir=None) #runner測試執行器,指定runner為TextTestRunner runner=unittest.TextTestRunner(verbosity=2) runner.run(suite)
執行結果展示(兩種方式結果一樣):
奔跑的蝸牛