python程序調試與測試單元測試

概述

  • 單元測試只是對工程中的代碼單元(通常細化到每個函數)進行正確性驗證的工作;
  • 對自己寫的模塊和類進行必要的單元測試,保證嚴謹正確,既是良好的開發習慣,也是一種規範;
  • Python中的標準庫中單元測試的模塊是單元測試;
import unittest

單元測試

待測試的工具類

# 待測的工具類
class MathUtil:

    # a,b相加
    def sum(self, a, b):
        return a + b

    # a,b相減
    def sub(self, a, b):
        return a - b

    # 判斷a是否大於b
    def gt(self, a, b):
        return a > b

測試用例類,有以下幾個要點:

  • 測試用例類必須繼承unittest.TestCase生成生成
  • 具體的測試項函數必須以的的testXXX來命名
  • 設置()方法會在每個測試項執行前調用,如有必要的初始化工作可以通過覆寫該方法來實現
  • TEARDOWN()方法會在每個測試項結束後調用,如有善後工作可以通過覆寫該方法來實現
  • 在具體的測試項函數中,使用的測試用例的assertXXX系列函數預言結果
  • 如果程序執行結果與預測的一致,測該單項測試通過,否則不通過
# 測試用例類,必須繼承於unittest.TestCase
class MathUtilTest(unittest.TestCase):
    '''MathUtil工具類測試用例'''

    # 測試項初始化方法
    def setUp(self):
        print("MathUtilTest setUp")
        self.mu = MathUtil()

    # 測試項結束時調用
    def tearDown(self):
        print("MathUtilTest tearDown")

    '''
    一系列的測試方法,都必須以testxxx命名
    '''

    # 測試MathUtil的sum方法
    def testSum(self):
        print("testSum...")

        # 斷言相等
        self.assertEqual(self.mu.sum(3, 4), 7)

    # 測試MathUtil的sub方法
    def testSub(self):
        print("testSub...")

        # 斷言相等
        self.assertEqual(self.mu.sub(3, 4), -1, "testSub failed!!!")

    # 測試MathUtil的gt方法
    def testGt(self):
        print("testOthers...")

        # 斷言真假
        self.assertTrue(self.mu.gt(5, 4))
        self.assertFalse(self.mu.gt(4, 5))

        # 斷言拋出異常
        with self.assertRaises(TypeError):
            self.mu.sum(1, "2")

執行單元測試

if __name__ == '__main__':

    # 運行當前模塊中的所有測試用例
    unittest.main()

本次測試全部通過 

修改MathUtil的總和()方法,使其邏輯錯誤,觀察這一次的單元測試結果

class MathUtil:
    def sum(self, a, b):
        return a - b

結果下顯示testSum這一單項測試失敗:AssertionError:-1!= 7結果結果-1與預測值7不相符: 
 

測試套件

  • unittest.main()方法會執行當前模塊中的所有測試用例類中的所有測試項,這顯得不太靈活;
  • unittest.TestSuite類是一個測試用例容器,可以按需添加測試用例於其中,使得單元測試既可以批量進行,又可以自主增減測試項目;
import unittest
from unittest.runner import TextTestRunner

# 定義一個測試套件
suite = unittest.TestSuite()

# 往測試套件裏新增用例類下的所有測試項
suite.addTest(unittest.makeSuite(MathUtilTest))
suite.addTest(unittest.makeSuite(MyTest2))
suite.addTest(unittest.makeSuite(MyTest3))

# 執行測試套件
runner = TextTestRunner()
ret = runner.run(suite)
print(ret)
  •  

版權聲明:本文爲博主原創文章,未經博主允許不得轉載.https://my.csdn.net/pangzhaowen

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章