unittest 單元測(cè)試
Python中有一個(gè)自帶的單元測(cè)試框架是unittest模塊,用它來(lái)做單元測(cè)試,它里面封裝好了一些校驗(yàn)返回的結(jié)果方法和一些用例執(zhí)行前的初始化操作。
在說(shuō)unittest之前,先說(shuō)幾個(gè)概念:
- TestCase 也就是測(cè)試用例
- TestSuite 多個(gè)測(cè)試用例集合在一起,就是TestSuite
- TestLoader是用來(lái)加載TestCase到TestSuite中的
- TestRunner是來(lái)執(zhí)行測(cè)試用例的,測(cè)試的結(jié)果會(huì)保存到TestResult實(shí)例中,包括運(yùn)行了多少測(cè)試用例,成功了多少,失敗了多少等信息
1. unittest的用法
下面寫(xiě)一個(gè)簡(jiǎn)單的單元測(cè)試用例:
1 import unittest 2 def calc(a,b): 3 return round(a/b,1) 4 class TestCalc(unittest.TestCase): 5 def test1(self): #測(cè)試用例 1 6 res = calc(1,2) 7 self.assertEqual(0.5,res,'計(jì)算不正確') #預(yù)計(jì)結(jié)果與返回res比較,'計(jì)數(shù)不正確',不是必須的 8 9 unittest.main() #僅用于查看結(jié)果,不能產(chǎn)生報(bào)告
注意:
1. 運(yùn)行時(shí),不要選擇Run 'Unittests for ...'這是通過(guò)pycharm自帶的運(yùn)行方式,不會(huì)產(chǎn)生測(cè)試報(bào)告的。
2. 要點(diǎn)擊菜單欄中的run...(alt + shift + F10) ,選當(dāng)前py文件,以一個(gè)python文件來(lái)運(yùn)行,或者在 Terminal 中運(yùn)行
3. 在測(cè)試用例里面,函數(shù)名必須以test開(kāi)頭,否則不會(huì)被執(zhí)行的。類(lèi)名無(wú)所謂。
下面是一些常用的斷言,也就是校驗(yàn)結(jié)果
assertEqual(a, b) a == b assertNotEqual(a, b) a != b assertTrue(x) bool(x) is True assertFalse(x) bool(x) is False assertIsNone(x) x is None assertIsNotNone(x) x is not None assertIn(a, b) a in b assertNotIn(a, b) a not in b
為用例添加前置條件和用例的執(zhí)行順序
1 import unittest 2 class TestCalc(unittest.TestCase): 3 def setUp(self): 4 print('這是setup') 5 def tearDown(self): 6 print('這是teardown') 7 @classmethod 8 def tearDownClass(cls): 9 print('這是tearDownClass') 10 @classmethod 11 def setUpClass(cls): 12 print('這是setUpClass') 13 def testa(self): 14 print('這是用例testa') 15 def testb(self): 16 print('這是用例testb') 17 18 if __name__ == '__main__': 19 unittest.main()
運(yùn)行結(jié)果:
這是setUpClass 這是setup 這是用例testa 這是teardown 這是setup 這是用例testb 這是teardown 這是tearDownClass .. ---------------------------------------------------------------------- Ran 2 tests in 0.000s OK
總結(jié):
- 在每一個(gè)測(cè)試用例前后執(zhí)行def setup(self),def tearDown(self)
- 在所有用例運(yùn)行前后執(zhí)行def setUpClass(cls),def tearDownClass(cls)
- 用例執(zhí)行順序:按首字母排序的
2. 生成測(cè)試報(bào)告
1) HTMLTestRunner 生成報(bào)告
那如何生成一個(gè)測(cè)試報(bào)告呢,需要加入另外一個(gè)模塊:HTMLTestRunner。
下載地址:http://tungwaiyip.info/software/HTMLTestRunner.html
下載HTMLTestRunner.py,放到python安裝目錄的lib下,使用執(zhí)行測(cè)試用例就會(huì)生成一個(gè)html的測(cè)試報(bào)告,里面會(huì)有每個(gè)測(cè)試用例的執(zhí)行結(jié)果,代碼如下:
1 import unittest,HTMLTestRunner 2 def calc(a,b): 3 return round(a/b,1) 4 class TestCalc(unittest.TestCase): 5 def test1(self): 6 '''用例描述:計(jì)算a/b的正確性''' 7 res = calc(1,2) 8 self.assertEqual(0.5,res,'計(jì)算不正確') 9 def test2(self): 10 '''用例描述:除數(shù)不能為0''' 11 res = calc(1,0) 12 self.assertIsNone(res) #判斷是不是None,如果是None就通過(guò) 13 14 suite = unittest.TestSuite() #定義了一個(gè)測(cè)試集合 15 suite.addTest(unittest.makeSuite(TestCalc)) #把剛才寫(xiě)的用例加到測(cè)試集合,addTests用于py文件,addTest用于類(lèi) 16 f = open('test.html','wb') 17 runner = HTMLTestRunner.HTMLTestRunner(f,title='測(cè)試用例標(biāo)題',description='測(cè)試用例描述') 18 runner.run(suite) #運(yùn)行用例
生成的 test.html 測(cè)試報(bào)告如下所示:

2) BeautifulReport 生成報(bào)告
手動(dòng)安裝BeautifulReport
下載地址:https://coding.net/u/pengzhuopeng/p/PythonLearner/git/tree/master/%E5%B7%A5%E5%85%B7?public=true
切換到BeautifulReport目錄下,執(zhí)行:python setup.py install
1 import unittest 2 from BeautifulReport import BeautifulReport as bf 3 def calc(a,b): 4 return round(a/b,1) 5 class TestCalc(unittest.TestCase): 6 def test1(self): 7 '''用例描述:計(jì)算a/b的正確性''' 8 res = calc(1,2) 9 self.assertEqual(0.5,res,'計(jì)算不正確') 10 def test2(self): 11 '''用例描述:除數(shù)不能為0''' 12 res = calc(1,0) 13 self.assertIsNone(res) #判斷是不是None,如果是None就通過(guò) 14 15 suite = unittest.TestSuite() #定義了一個(gè)測(cè)試集合 16 suite.addTest(unittest.makeSuite(TestCalc)) #把剛才寫(xiě)的用例加到測(cè)試集合,addTests用于py文件,addTest用于類(lèi) 17 report = bf(suite) 18 report.report(filename='test1',description='必填參數(shù),描述',log_path='.') 19 #log_path、filename不是必填,filename不填默認(rèn)生成文件名為“report.html”,log_path默認(rèn)當(dāng)前路徑,log_path='.'表當(dāng)前路徑
生成的 test1.html 報(bào)告如下圖所示


浙公網(wǎng)安備 33010602011771號(hào)