python之測試模塊unittest
阿新 • • 發佈:2018-04-09
方法 測試文件 ret 裝飾器 原因 name 使用 繼承 ssm
單元測試模塊unittest
- unittest的四個核心的概念:
TestLoader:加載或分發測試任務的調度器;
TestCase:測試用例的對象;
TestSuite:多個測試用例的容器;
TextTestRunner:執行測試用例的工作者;
TextTestResult:測試結果保存的對象;
fixture:搭建一個測試環境;
# 使用斷言方法 assertEqual 如果兩個值相等,則pass assertNotEqual 如果兩個值不相等,則pass assertTrue 判斷bool值為True,則pass assertFalse 判斷bool值為False,則pass assertIsNone 不存在,則pass assertIsNotNone 存在,則pass
- 如果斷言錯誤,就會報assertionError錯誤;
簡單測試實例
# mytest.py
def add(a, b):
return a+b
def minus(a, b):
return a-b
def multi(a, b):
return a*b
def divide(a, b):
return a/b
# test.py
import unittest
from mytest import *
class MathTest(unittest.TestCase):
‘‘‘測試main模塊‘‘‘
def test_add(self ):
‘‘‘測試add函數‘‘‘
self.assertEqual(2,add(1,1))
def test_minus(self):
‘‘‘測試minus函數‘‘‘
self.assertEqual(2,minus(3,1))
def test_multi(self):
‘‘‘測試multi函數‘‘‘
self.assertEqual(15,multi(3,5))
def test_divide(self):
‘‘‘測試divide函數‘‘‘
self .assertEqual(2,divide(10,5))
if __name__ == ‘__main__‘:
unittest.main(verbosity=1)
執行test.py文件獲得測試的結果。
知識點
每個繼承TestCase的類都是一個測試用例,其中的每一個以test開頭的方法都是一個測試實例;
測試的實例必須以test開頭,否則無法被識別;在方法下面加註釋後,在測試的結果終端可以顯示;
測試的執行時沒有順序的,完後後標誌:成功是 .,失敗是 F,出錯是 E,跳過是 S。
unittest.main中的verbosity方法可以控制報告的詳細程度,設為 0,則不輸出每一用例的執行結果;如果設為 2,則輸出詳細的執行結果,默認為1;
setUP()和tearDown()
- 如果需要在測試前做一些準備工作,測試後一些掃尾的工作,使用setUp和tearDown函數;
import unittest
class MathTest(unittest.TestCase):
‘‘‘測試main模塊‘‘‘
def setUp(self):
"""測試前的準備工作"""
pass
def tearDown(self):
"""測試後的工作"""
pass
- 上述兩個方法會在每個testcase執行的前後執行,如果想所有的測試實例只執行一次準備和結尾的工作,使用:
import unittest
class MathTest(unittest.TestCase):
‘‘‘測試main模塊‘‘‘
@classmethod
def setUpClass(cls):
"""測試前的準備工作"""
pass
@classmethod
def tearDownClass(cls):
"""測試後的工作"""
pass
多個測試模塊的集成
- 如果有多個測試文件,每個都去手動執行的方式是不現實的,可以使用TestSuite。
# test_suite.py
import unittest
from mytest import MathTest
if __name__ == ‘__main__‘:
# 創建一個TestSuite的容器
suite = unittest.TestSuite()
# 添加測試用例,指定按照添加的順序來
tests = [MathTest("test_add"), MathTest("test_minus"), MathTest("test_divide")]
# 在容器中加入
suite.addTests(tests)
# 可以加入單個
# suite.addTest(MathTest("test_minus"))
# 有時候我們並不關註執行的順序
tests2 = unittest.TestLoader().loadTestsFromTestCase(MathTest)
tests1 = unittest.TestLoader().loadTestsFromTestCase(MathTest)
# 以列表的形式加入,tests1和tests2是一個容器,容器可以嵌套容器
suite.addTests([test1,test2])
# 一般結果默認輸出到終端,可以設置輸出到文件
with open(‘UnittestTextReport.txt‘, ‘a‘,encoding=‘utf-8‘) as f:
runner = unittest.TextTestRunner(stream=f, verbosity=2)
runner.run(suite)
跳過某些測試
- 在測試的testcase添加裝飾器;
unittest.skip(reason):無條件跳過,reason可以用來寫跳過的原因。
unittest.skipIf(condition, reason):當condition為True是跳過;condition可以是一個函數,類等任何對象;
unittest.skipUnless(condition, reason):當condition為False是跳過;
class MathTest(unittest.TestCase):
‘‘‘測試main模塊‘‘‘
@unitteat.skip(‘skip this add‘)
def test_add(self):
‘‘‘測試add函數‘‘‘
self.assertEqual(2,add(1,1))
python之測試模塊unittest