1. 程式人生 > >python之測試模塊unittest

python之測試模塊unittest

方法 測試文件 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文件獲得測試的結果。

知識點

  1. 每個繼承TestCase的類都是一個測試用例,其中的每一個以test開頭的方法都是一個測試實例;

  2. 測試的實例必須以test開頭,否則無法被識別;在方法下面加註釋後,在測試的結果終端可以顯示;

  3. 測試的執行時沒有順序的,完後後標誌:成功是 .,失敗是 F,出錯是 E,跳過是 S。

  4. 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添加裝飾器;
  1. unittest.skip(reason):無條件跳過,reason可以用來寫跳過的原因。

  2. unittest.skipIf(condition, reason):當condition為True是跳過;condition可以是一個函數,類等任何對象;

  3. 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