Python中有一個自帶的單元測試框架是unittest模塊,用它來作單元測試,它裏面封裝好了一些校驗返回的結果方法和一些用例執行前的初始化操做。html
在說unittest以前,先說幾個概念:python
TestCase 也就是測試用例sublime-text
TestSuite 多個測試用例集合在一塊兒,就是TestSuiteapi
TestLoader是用來加載TestCase到TestSuite中的框架
TestRunner是來執行測試用例的,測試的結果會保存到TestResult實例中,包括運行了多少測試用例,成功了多少,失敗了多少等信息單元測試
下面寫一個簡單的單元測試用例測試
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
import unittest
class MyTest(unittest.TestCase):#繼承unittest.TestCase
def tearDown(self):
#每一個測試用例執行以後作操做
print('111')
def setUp(self):
#每一個測試用例執行以前作操做
print(22222)
def test_run(self):
self.assertEqual(1,1)
#測試用例
if __name__ == '__main__':
unittest.main()#運行全部的測試用例
|
下面是一些經常使用的斷言,也就是校驗結果ui
1
2
3
4
5
6
7
8
|
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
|
那如何生成一個測試報告呢,須要加入另一個模塊了,HTMLTestRunner,這個模塊須要本身安裝,使用執行測試用例就會生成一個html的測試報告,裏面會有每一個測試用例的執行結果,代碼以下:spa
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
import HTMLTestRunner
import unittest
class MyTest(unittest.TestCase):#繼承unittest.TestCase
def tearDown(self):
#每一個測試用例執行以後作操做
print('111')
def setUp(self):
#每一個測試用例執行以前作操做
print(22222)
def test_run(self):
# self.assertEqual(1,1)
self.assertIs(1,1)
#測試用例
def test_run2(self):
# self.assertEqual(1,1)
self.assertIs(1,1)
#測試用例
def test_run3(self):
# self.assertEqual(1,1)
self.assertIs(1,1)
#測試用例
def test_run1(self):
# self.assertEqual(1,1)
self.assertIs(1,1)
#測試用例
if __name__ == '__main__':
test_suite = unittest.TestSuite()#建立一個測試集合
test_suite.addTest(MyTest('test_run1'))#測試套件中添加測試用例
#test_suite.addTest(unittest.makeSuite(MyTest))#使用makeSuite方法添加全部的測試方法
fp = open('res.html','wb')#打開一個保存結果的html文件
runner = HTMLTestRunner.HTMLTestRunner(stream=fp,title='api測試報告',description='測試狀況')
#生成執行用例的對象
runner.run(test_suite)
#執行測試套件
|
若是咱們有不少個模塊,每一個模塊下面都寫了不少python文件,每一個python文件裏面都有測試用例,那怎麼把這個目錄下的用例都執行了呢,就要先找到這個目錄下的全部python文件,而後找到裏面的測試用例,逐個執行,代碼以下:code
1
2
3
4
5
6
7
8
9
10
|
import unittest,HTMLTestRunner
suite = unittest.TestSuite()#建立測試套件
all_cases = unittest.defaultTestLoader.discover('.','test_*.py')
#找到某個目錄下全部的以test開頭的Python文件裏面的測試用例
for case in all_cases:
suite.addTests(case)#把全部的測試用例添加進來
fp = open('res.html','wb')
runner = HTMLTestRunner.HTMLTestRunner(stream=fp,title='all_tests',description='全部測試狀況')
runner.run(suite)
#運行測試
|
咱們在後續進行持續集成的時候,要讓代碼自動運行,就會用到Jenkins了,可是上面產生的測試報告都是html格式的,Jenkins不認識,就在Jenkins裏面顯示不出來。那我們就要產生一些Jenkins認識的測試報告,Jenkins認識xml格式的報告,那我們就產生xml格式的唄,就須要用一個新的模塊,xmlrunner,安裝直接 pip install xmlrunner便可,代碼以下:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
import unittest
import xmlrunner
#導入這個模塊
class My(unittest.TestCase):
def test1(self,a,b,c):
self.assertEqual(a+b,c)
if __name__=='__main__':
test_suite = unittest.TestSuite()
test_suite.addTest(unittest.makeSuite(My))
runner = xmlrunner.XMLTestRunner(output='report')#指定報告放的目錄
runner.run(test_suite)
|
而後我們運行,能夠看到在report目錄下已經產生了xml格式的報告了,並且還自動把日期加上了