unittest框架解析
unittest 是python 的單元測試框架晕鹊,unittest 單元測試提供了創(chuàng)建測試用例痴脾,測試套件以及批量執(zhí)行的方案, unittest 在安裝pyhton 以后就直接自帶了,直接import unittest 就可以使用躁锁。
作為單元測試的框架峡谊, unittest 也是可以對程序最小模塊的一種敏捷化的測試崖面。在自動化測試中厚骗,必須需要知道所使用語言的單元測試框架。利用單元測試框架浑槽,創(chuàng)建一個類蒋失,該類繼承unittest的TestCase,這樣可以把每個case看成是一個最小的單元桐玻, 由測試容器組織起來篙挽,到時候直接執(zhí)行,同時引入測試報告镊靴。
unittest.TestCase:TestCase類铣卡,所有測試用例類繼承的基本類。
unittest.main():使用她可以方便的將一個單元測試模塊變?yōu)榭芍苯舆\行的測試腳本邑闲,main()方法使用TestLoader類來搜索所有包含在該模塊中以“test”命名開頭的測試方法算行,并自動執(zhí)行他們。執(zhí)行方法的默認順序是:根據ASCII碼的順序加載測試用例苫耸,數字與字母的順序為:0-9,A-Z儡陨,a-z褪子。所以以A開頭的測試用例方法會優(yōu)先執(zhí)行,以a開頭會后執(zhí)行骗村。
unittest.TestSuite():unittest框架的TestSuite()類是用來創(chuàng)建測試套件的嫌褪。
unittest.TextTextRunner():unittest框架的TextTextRunner()類,通過該類下面的run()方法來運行suite所組裝的測試用例胚股,入參為suite測試套件笼痛。
unittest.defaultTestLoader(): defaultTestLoader()類,通過該類下面的discover()方法可自動更具測試目錄start_dir匹配查找測試用例文件(test*.py),并將查找到的測試用例組裝到測試套件缨伊,因此可以直接通過run()方法執(zhí)行discover摘刑。用法如下:
unittest.skip():裝飾器,當運行用例時刻坊,有些用例可能不想執(zhí)行等枷恕,可用裝飾器暫時屏蔽該條測試用例。一種常見的用法就是比如說想調試某一個測試用例谭胚,想先屏蔽其他用例就可以用裝飾器屏蔽徐块。
@unittest.skip(reason): skip(reason)裝飾器:無條件跳過裝飾的測試,并說明跳過測試的原因灾而。
@unittest.skipIf(reason): skipIf(condition,reason)裝飾器:條件為真時胡控,跳過裝飾的測試,并說明跳過測試的原因旁趟。
@unittest.skipUnless(reason): skipUnless(condition,reason)裝飾器:條件為假時铜犬,跳過裝飾的測試,并說明跳過測試的原因轻庆。
@unittest.expectedFailure(): expectedFailure()測試標記為失敗癣猾。
unittest斷言
自動化的測試中, 對于每個單獨的case來說余爆,一個case的執(zhí)行結果中纷宇, 必然會有期望結果與實際結果, 來判斷該case是通過還是失敗蛾方, 在unittest 的庫中提供了大量的實用方法來檢查預期值與實際值像捶, 來驗證case的結果, 一般來說桩砰, 檢查條件大體分為等價性拓春, 邏輯比較以及其他, 如果給定的斷言通過亚隅, 測試會繼續(xù)執(zhí)行到下一行的代碼硼莽, 如果斷言失敗, 對應的case測試會立即停止或者生成錯誤信息( 一般打印錯誤信息即可) 煮纵,但是不要影響其他的case執(zhí)行懂鸵。
import unittest
# 被測試方法
class Search:
def search_fun(self):
print("search")
return True
class TestSearch(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
cls.search = Search()
@classmethod
def tearDownClass(cls) -> None:
cls.search = Search()
def test_search1(self):
print("testsearch1")
#search = Search()
assert True == self.search.search_fun()
def test_search2(self):
print("testsearch2")
#search = Search()
assert True == self.search.search_fun()
def test_search3(self):
print("testsearch3")
#search = Search()
assert True == self.search.search_fun()
class TestSearch1(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
cls.search = Search()
print("set up class1")
@classmethod
def tearDownClass(cls) -> None:
cls.search = Search()
print("tear down class1")
def test_search1(self):
print("testsearch1")
#search = Search()
assert True == self.search.search_fun()
def test_search2(self):
print("testsearch2")
#search = Search()
assert True == self.search.search_fun()
def test_search3(self):
print("testsearch3")
#search = Search()
assert True == self.search.search_fun()
def test_equal(self):
print("斷言相等")
self.assertEqual(1,1,"判斷1 == 1")
def test_notequal(self):
print("斷言不相等")
self.assertNotEqual(1,2,"判斷1 != 2")
class TestSearch2(unittest.TestCase):
def test_case1(self):
print("testsearch2")
if __name__ == '__main__':
#方法一行疏、執(zhí)行當前文件所有的unittest測試用例
#unittest.main()
#方法二匆光、執(zhí)行指定的測試用例,將要執(zhí)行的測試用例添加到測試套件里面酿联,批量執(zhí)行
#創(chuàng)建一個測試套件 testsuite
# suite = unittest.TestSuite()
# suite.addTest(TestSearch1("test_search1"))
# unittest.TextTestRunner().run(suite)
#方法三终息、執(zhí)行某個或多個測試類
suite1 = unittest.TestLoader().loadTestsFromTestCase(TestSearch1)
suite2 = unittest.TestLoader().loadTestsFromTestCase(TestSearch2)
suite = unittest.TestSuite([suite1,suite2])
unittest.TextTestRunner(verbosity=2).run(suite)
HTML報告生成
腳本執(zhí)行完畢之后夺巩,還需要看到HTML報告,下面我們就通過HTMLTestRunner.py 來生成測試報告