Python 單元測試
一,單元測試
單元測試是用來對一個模塊、一個函數或者一個類來進行正確性檢驗的測試工作。
單元測試的加載:通過unittest.main()來啟動單元測試的測試模塊;添加到testsuite集合中再加載所有的被測試對象,而testsuit裏存放的就是單元測試的用例。
補充查看模塊內容及使用方法 代碼如下:
import unittest
import HTMLTestRunner
from BeautifulReport import BeautifulReport
memblist1 = dir(unittest) # 查看模塊有哪些成員
for memb in memblist1 : #查看具體成員的用法
cur = getattr(unittest,memb)
print(help(cur))
memblist = dir(HTMLTestRunner) # 查看模塊有哪些成員
for memb in memblist : #查看具體成員的用法
cur = getattr(HTMLTestRunner,memb)
print(help(cur))
TestCase 也就是測試用例
TestSuite 多個測試用例集合在一起,就是TestSuite
TestLoader是用來加載TestCase到TestSuite中的
TestRunner是來執行測試用例的,測試的結果會保存到TestResult實例中,包括運行了多少測試用例,成功了多少,失敗了多少等信息
整個單元測試框架的邏輯分三步走:第一步testloader根據傳入的參數獲得相應的測試用例,即對應具體的測試方法,
然後makesuite在把所有的測試用例組裝成testsuite,最後把testsiute傳給testrunner進行執行。
而我們通常執行的unittest.main(),其實就是unittest.testprom方法,其執行的功能就是上面分析的三步,在第一步中其傳入的參數是自身的模塊__main__;
在第二步中把自身模塊中的所有測試類中的測試方法提取出來,並生成測試套件;最後再把測試套件傳遞給testrunner進行具體的測試。
常用斷言:
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
實例:
import unittest
def calc(x,y): #被測模塊
return x+y
class TestCalc(unittest.TestCase):#單元測試模塊
def test_pass_case(self):
‘‘‘這是通過的測試用例‘‘‘
print(‘這個通過用例‘)
res = calc(1,2)
self.assertEqual(3,res)
self.assertNotEqual(2,res)#返回的結果不一樣
def test_fail_case(self):
‘‘‘這是失敗的測試用例‘‘‘
print(‘這個是失敗的用例‘)
res = calc(1, 2)
self.assertEqual(5, res)
if __name__ ==‘__main__‘:
unittest.main() #他會幫你運行當前這個python裏面所有的測試用例。
註:以test
開頭的方法就是測試方法,不以test
開頭的方法不被認為是測試方法,測試的時候不會被執行。用例執行的順序是按照字母排列的順序來的
輸出結果::【F表示一個fail, F前的點表示一個通過,有E的話表示程序自身異常】
F.
======================================================================
FAIL: test_fail_case (__main__.TestCalc)
這是失敗的測試用例
----------------------------------------------------------------------
Traceback (most recent call last):
File "C:/Users/lidal/PycharmProjects/llq-code/day7/練習.py", line 16, in test_fail_case
self.assertEqual(5, res)
AssertionError: 5 != 3
----------------------------------------------------------------------
Ran 2 tests in 0.000s
FAILED (failures=1)
二,setUp 與 tearDown
setUp() 與 tearDown() 這兩個方法會分別在每調用一個測試方法的前後分別被執行
setUp()
和tearDown()
方法有什麽用呢?設想你的測試需要啟動一個數據庫,這時,就可以在setUp()
方法中連接數據庫,在tearDown()
方法中關閉數據庫,這樣,不必在每個測試方法中重復相同的代碼:
class TestCalc(unittest.TestCase):#單元測試模塊
def test_pass_case(self):
‘‘‘這是通過的測試用例‘‘‘
print(‘這個通過用例‘)
res = calc(1,2)
self.assertEqual(3,res)
self.assertNotEqual(2,res)#返回的結果不一樣
def test_fail_case(self):
‘‘‘這是失敗的測試用例‘‘‘
print(‘這個是失敗的用例‘)
res = calc(1, 2)
self.assertEqual(5, res)
def test_a(self):
print(‘hahahaha ‘)
def setUp(self):
print(‘setUp。。‘)
# 每個用例運行之前都會執行它
def tearDown(self):
# 每個用用例運行完之後都會執行它
print(‘tearDown。。‘)
三,setUpClass 與 tearDownClass
setUpClass() 與 tearDownClass()這兩個方法會在所有的用例執行前後執行一次
使用方法如下:
@classmethod
def setUpClass(cls):
print(‘我是setupClass‘)
@classmethod
def tearDownClass(cls):
print(‘我是tearDownClass‘)
四,輸出html 格式的測試報告
a,需安裝 HTMLTestRunner 模塊 (需自己手動導入至 )
import HTMLTestRunner
if __name__ ==‘__main__‘:
suite = unittest.TestSuite()#定義一個測試套件
# suite.addTest(TestCalc(‘test_pass_case‘))
# suite.addTest(TestCalc(‘test_a‘))
# suite.addTest(TestCalc(‘test_fail_case‘)) #單個添加用例的
suite.addTests(unittest.makeSuite(TestCalc)) #這個類裏面的所有測試用例
f = open(‘report.html‘,‘wb‘)#打開一個測試報告的文件
runner = HTMLTestRunner.HTMLTestRunner(stream=f,title=‘test_report‘,
description=‘描述‘)
runner.run(suite) #運行
b,安裝 BeautifulReport 模塊 ,較HTMLTsetRunner 模塊生成的測試報告更直觀,漂亮(同樣需要自己手動導入)
from BeautifulReport import BeautifulReport
if __name__ ==‘__main__‘:
suite = unittest.TestSuite()#定義一個測試套件
# suite.addTest(TestCalc(‘test_pass_case‘))
# suite.addTest(TestCalc(‘test_a‘))
# suite.addTest(TestCalc(‘test_fail_case‘)) #單個添加用例的
suite.addTests(unittest.makeSuite(TestCalc)) #這個類裏面的所有測試用例
# f = open(‘report.html‘,‘wb‘)#打開一個測試報告的文件
# runner = HTMLTestRunner.HTMLTestRunner(stream=f,title=‘test_report‘,
# description=‘描述‘)
# runner.run(suite) #運行
result = BeautifulReport(suite)
result.report(filename=‘testreport‘, description=‘描述‘, log_path=‘.‘)
五,輸出xml 格式的測試報告,供後續jenkins 使用
pip install xmlrunner 命令安裝 xmlrunner 模塊
import xmlrunner
if __name__ ==‘__main__‘:
suite = unittest.TestSuite()#定義一個測試套件
# suite.addTest(TestCalc(‘test_pass_case‘))
# suite.addTest(TestCalc(‘test_a‘))
# suite.addTest(TestCalc(‘test_fail_case‘)) #單個添加用例的
suite.addTests(unittest.makeSuite(TestCalc)) #這個類裏面的所有測試用例
runner = xmlrunner.XMLTestRunner(output=‘report‘) # 指定報告放的目錄
runner.run(suite)
輸出結果:可以看到在report目錄下已經產生了xml格式的報告了,而且還自動把日期加上了
Python 單元測試