1. 程式人生 > 其它 >一文搞懂 unittest 單元測試框架

一文搞懂 unittest 單元測試框架

前言

unittest 是一款基於 Python 語言的單元測試框架。unittest 是 Python 開發包
中的一個標準模組,使用的時候直接匯入即可。

官方文件:
https://docs.python.org/2/library/unittest.html

為啥要用框架?

  • 方便組建測試用例
  • 一鍵執行用例,跳過用例等
  • 並生成視覺化測試報告
  • 他支援測試自動化,多個用例共享前置以及清理程式碼

官網文件例子:

import unittest
print(help(unittest))


語法規則:

  • 匯入unittest:import unittest

  • 建立一個測試類,必須要繼承unittest.TestCase類

  • 建立一個測試方法,且方法要以“test” 開頭


import unittest


class IntegerArithmeticTestCase(unittest.TestCase):
    def testAdd(self):  # test method names begin with 'test'  # 測試用例的名稱要以test開頭
        self.assertEqual((1 + 2), 3)   # 斷言,assertEqual 判斷相等
        self.assertEqual(0 + 1, 1)

    def testMultiply(self):
        self.assertEqual((0 * 10), 0)
        self.assertEqual((5 * 8), 40)


if __name__ == '__main__':
    unittest.main()

"""
執行結果:
..
----------------------------------------------------------------------
Ran 2 tests in 0.000s

OK

"""

unittest的執行結果:

  • 2 : 表示執行了兩條用例

  • . 表示測試用例執行通過

  • F 表示執行失敗

  • E 表示執行錯誤

  • S 表示執行跳過



重要概念

  • Test Case:
    最小的測試單元,即測試方法。
    unittest提供了TestCase基類,我們建立的測試類要繼承該基類,它可以用來建立新的測試用例。

  • Test Suite:
    測試用例、測試套件或兩者的集合,用於組裝一組要執行的測試。
    使用TestSuite類來建立測試套件。

  • Test Runner:
    Test Runner是一個元件,用於協調測試的執行並向用戶提供結果。
    unittest提供了TextTestRunner類執行測試用例。

  • TestLoder:
    是用來載入 TestCase到TestSuite中,其中有幾個loadTestsFrom_()方法,就是從各個地方尋找TestCase,建立他們的例項,然後add到TestSuite中,再返回一個TestSuite例項

  • TextTestResult:
    測試結果會儲存到TextTestResult例項中,包括運行了多少用例,成功與失敗多少等資訊;

  • TestFixture:
    測試用例的初始化準備及環境還原,主要是setUp() 和 setDown()方法;


測試用例執行順序

unittest預設按照ASCII碼的順序載入測試用例(包括測試目錄和測試檔案、測試類、測試方法),即它並不是按照測試用例的建立順序從上到下執行的。

discover() 和 main()方法的執行順序是一樣的。故想讓某個測試檔案先執行,可以在命名上加以控制。

如何控制順序?

可以通過TestSuite類的addTest()方法按照一定的順序來載入測試用例,這樣想先被執行的用例就可以先載入。


import unittest


class IntegerArithmeticTestCase(unittest.TestCase):
    def testAdd(self):  # test method names begin with 'test'
        print("加法")
        self.assertEqual((1 + 2), 3)
        self.assertEqual(0 + 1, 1)

    def testMultiply(self):
        print("乘法")
        self.assertEqual((0 * 10), 0)
        self.assertEqual((5 * 8), 40)


class SubtractionTestCase(unittest.TestCase):
    def testSubtraction(self):
        print("減法")
        self.assertEqual((5 - 3), 2)


if __name__ == '__main__':
    # 建立測試套件
    suit = unittest.TestSuite()
    suit.addTest(IntegerArithmeticTestCase("testAdd"))  # 新增測試用例,新增 加法 用例到測試套件中
    suit.addTest(SubtractionTestCase("testSubtraction"))  # SubtractionTestCase 類名稱,testSubtraction 用例名稱
    # 建立測試執行器
    runner = unittest.TextTestRunner()
    runner.run(suit)

"""
..
----------------------------------------------------------------------
Ran 2 tests in 0.000s

OK
加法
減法

"""



Setup和Teardown

前置和後置
使用場景:
  • 前置: 先登入、插入資料,再執行其他用例
  • 後置: 執行完用例,退出登入,清理資料等

  • setUpModule/tearDownModule
    在整個模組的開始與結束時被執行

  • setUpClass/ tearDownClass
    在測試類的開始與結束時被執行

  • setUp/tearDown
    在測試用例的開始與結束時被執行


# coding:utf-8
import unittest

class Test(unittest.TestCase):
    def setUp(self):
        print('這是用例的前置處理')

    def tearDown(self):
        print('這是用例的後置處理')

    def test01(self):
        print('這是第一條用例')

    def test02(self):
        print('這是第二條用例')

    def test03(self):
        print('這是第三條用例')

if __name__ == '__main__':
    unittest.main()

"""
結果:
...
----------------------------------------------------------------------
Ran 3 tests in 0.000s

OK
這是用例的前置處理
這是第一條用例
這是用例的後置處理
這是用例的前置處理
這是第二條用例
這是用例的後置處理
這是用例的前置處理
這是第三條用例
這是用例的後置處理

"""