Python中有一個自帶的單元測試框架是unittest模塊,用它來做單元測試,它里面封裝好了一些校驗返回的結果方法和一些用例執行前的初始化操作。
在說unittest之前,先說幾個概念:
TestCase 也就是測試用例
TestSuite 多個測試用例集合在一起,就是TestSuite
TestLoader是用來加載TestCase到TestSuite中的
TestRunner是來執行測試用例的,測試的結果會保存到TestResult實例中,包括運行了多少測試用例,成功了多少,失敗了多少等信息
1.單元測試:
開發自己測自己寫的代碼;
2.導入模塊unittest:
import unittest #導入unittest模塊
import HTMLTestRunner #導入HTMLTestRunner 報告模板模塊
from BeautifulReport import BeautifulReport #導入BeautifulReport 報告模板模塊
3.運行一個簡單的unittest:
import unittest #單元測試模塊 class TestCalc(unittest.TestCase): def test1(self): #函數名要以test開頭,否則不會被執行 self.assertEqual(1,1) def test2(self): self.assertEqual(1,2) unittest.main() #會運行當前python文件里面的所有測試用例
4.unittest單元測試的基本流程:
用例集/測試套件:存放測試用例的
①.先把所有的測試用例都放到用例集
②.運行這些測試用例
③.產生報告
代碼:
一.生成報告模板HTMLTestRunner模塊(比較丑且相對不好用)
注:1.安裝並導入HTMLTestRunner 模塊,該模塊是可以生成報告的模塊。
2.運行代碼時,要以Run xx.py方式運行,不能以unittest方式運行,否則不會生成報告。
import unittest #單元測試模塊 import HTMLTestRunner #用來生成報告的模塊 class TestCalc(unittest.TestCase): def testcc(self): #函數名要以test開頭,否則不會被執行 '''這是第一個測試用例''' #用例描述,在函數下,用三個單引號里面寫用例描述 self.assertEqual(1,1) print('第一個用例') def testaa(self): '''這個是第二個測試用例''' self.assertEqual(1,2) print('第二個用例') def testdd(self): '''用例描述3''' print('第三個用例') def testbb(self): '''用例描述4''' print('第四個用例') suite = unittest.TestSuite() #定義一個測試集合 suite.addTest(unittest.makeSuite(TestCalc)) #把寫的用例加進來(將TestCalc類)加進來 f = open('test.html','wb') #以二進制模式打開一個文件 runner = HTMLTestRunner.HTMLTestRunner(f,title='unittest用例標題',description='這是用例描述') runner.run(suite) #運行用例(用例集合)
在瀏覽器打開生成的test.html文件,HTMLTestRunner報告如圖:
5.setup()/teardown()與setUpClass/tearDownClass。如圖:
import unittest #單元測試模塊 import HTMLTestRunner #用來生成報告的模塊 class TestCalc(unittest.TestCase): def setUp(self): #每個用例運行之前運行的 print('setup是啥時候運行的') def tearDown(self): #每個用例運行之后運行的 print('teardown是啥時候運行的') @classmethod def setUpClass(cls): #在所有用例執行之前運行的 print('我是setUpclass,我位於所有用例的開始') @classmethod def tearDownClass(cls): #在所有用例都執行完之后運行的 print('我是tearDownClass,我位於多有用例運行的結束') def testcc(self): #函數名要以test開頭,否則不會被執行 '''這是第一個測試用例''' #用例描述,在函數下,用三個單引號里面寫用例描述 self.assertEqual(1,1) print('第一個用例') def testaa(self): '''這個是第二個測試用例''' self.assertEqual(1,1) print('第二個用例') def testdd(self): '''用例描述3''' print('第三個用例') def testbb(self): '''用例描述4''' print('第四個用例') unittest.main() #會運行當前python文件里面的所有測試用例
運行結果:
二.報告模板BeautifulReport(模板相對好用)
代碼:
import unittest #單元測試模塊 from BeautifulReport import BeautifulReport as bf #導入BeautifulReport模塊,這個模塊也是生成報告的模塊,但是比HTMLTestRunner模板好看 class TestCalc(unittest.TestCase): def setUp(self): #每個用例運行之前運行的 print('setup是啥時候運行的') def tearDown(self): #每個用例運行之后運行的 print('teardown是啥時候運行的') @classmethod def setUpClass(cls): #在所有用例執行之前運行的 print('我是setUpclass,我位於所有用例的開始') @classmethod def tearDownClass(cls): #在所有用例都執行完之后運行的 print('我是tearDownClass,我位於多有用例運行的結束') def testcc(self): #函數名要以test開頭,否則不會被執行 '''這是第一個測試用例''' #用例描述,在函數下,用三個單引號里面寫用例描述 self.assertEqual(1,1) print('第一個用例') def testaa(self): '''這個是第二個測試用例''' self.assertEqual(1,1) print('第二個用例') def testdd(self): '''用例描述3''' print('第三個用例') def testbb(self): '''用例描述4''' print('第四個用例') suite = unittest.TestSuite() #定義一個測試集合 suite.addTest(unittest.makeSuite(TestCalc)) #把寫的用例加進來(將TestCalc類)加進來 run = bf(suite) #實例化BeautifulReport模塊 run.report(filename='test',description='這個描述參數是必填的')
瀏覽器查看生成的報告頁面: