python內置模塊之unittest測試(五)

系列文章

單元測試模塊unittest

  • unittest的四個核心的概念:

TestLoader:加載或分發測試任務的調度器;單元測試

TestCase:測試用例的對象;測試

TestSuite:多個測試用例的容器;ui

TextTestRunner:執行測試用例的工做者;this

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))
相關文章
相關標籤/搜索