1. 程式人生 > 實用技巧 >單元測試框架unittest介紹和簡單案例

單元測試框架unittest介紹和簡單案例

單元測試

單元測試(unit testing)是指對軟體中的最小可測試單元進行檢查和驗證。對於單元測試中單元的含義,一般來說,要根據實際情況去判定其具體含義,如C語言中單元指一個函式,Java裡單元指一個類,圖形化的軟體中可以指一個視窗或一個選單等。總的來說,單元就是人為規定的最小的被測功能模組。

單元測試框架

在單元測試框架出現之前,開發人員在建立可執行測試時飽受折磨。最初的做法是在應用程式中建立一個視窗,配有"測試控制工具(harness)"。它只是一個視窗,每個測試對應一個按鈕。這些測試的結果要麼是一個訊息框,要麼是直接在窗體本身給出某種顯示結果。由於每個測試都需要一個按鈕,所以這些視窗很快就會變得擁擠、不可管理。

單元測試框架提供了一種統一的程式設計模型,可以將測試定義為一些簡單的類,這些類中的方法可以呼叫希望測試的應用程式程式碼。開發人員不需要編寫自己的測試控制工具;單元測試框架提供了測試執行程式(runner),只需要單擊按鈕就可以執行所有測試。利用單元測試框架,可以很輕鬆地插入、設定和分解有關測試的功能。測試失敗時,測試執行程式可以提供有關失敗的資訊,包含任何可供利用的異常資訊和堆疊跟蹤。 不同程式語言有不同的單元測試框架,如Java 的Junit, TestNg, c#的 Nunit,Python的unittest,Pyunit,testtools, subunit....

單元測試框架作用

  • 提供用例組織與執行
  • 提供豐富的斷言方法
  • 提供豐富的日誌與測試結果

Python單元測試框架——unittest

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

unittest單元測試框架不僅可以適用於單元測試,還可以適用WEB自動化測試用例的開發與執行,該測試框架可組織執行測試用例,並且提供了豐富的斷言方法,判斷測試用例是否通過,最終生成測試結果。

unittest核心

1.TestCase

一個TestCase的例項就是一個測試用例。什麼是測試用例呢?就是一個完整的測試流程,包括測試前準備環境的搭建(setUp),執行測試程式碼(run),以及測試後環境的還原(tearDown)。元測試(unit test)的本質也就在這裡,一個測試用例是一個完整的測試單元,通過執行這個測試單元,可以對某一個問題進行驗證。

2.TestSuite

而多個測試用例集合在一起,就是TestSuite,而且TestSuite也可以巢狀TestSuite。 TestLoader是用來載入TestCase到TestSuite中的,其中有幾個loadTestsFrom__()方法,就是從各個地方尋找TestCase,建立它們的例項,然後add到TestSuite中,再返回一個TestSuite例項。

3.TextTestRunner

TextTestRunner是來執行測試用例的,其中的run(test)會執行TestSuite/TestCase中的run(result)方法。 測試的結果會儲存到TextTestResult例項中,包括運行了多少測試用例,成功了多少,失敗了多少等資訊。

4.Fixture

而對一個測試用例環境的搭建和銷燬,是一個fixture。

unittest案例

構造一個類Math 包含整數加法運算

Calculate.py
# #!/usr/bin/python3
# -*- coding: utf-8 -*-
# @Time : 2020/8/19 14:32
# @Author : Gengwu
# @FileName: Calculate.py
# @Software: PyCharm

class Math:
    def __init__(self,a,b): #初始化方法,a和b兩個引數
        self.a=int(a)  #強制轉化成int型
        self.b=int(b)  #強制轉化成int型

    def add(self): #定義加法運算
        return self.a+self.b

test_Math.py
# #!/usr/bin/python3
# -*- coding: utf-8 -*-
# @Time : 2020/8/19 14:43
# @Author : Gengwu
# @FileName: test_Math.py
# @Software: PyCharm

from Calculate import Math #匯入Calculate
import  unittest  #匯入unitest

class TestMath(unittest.TestCase): #測試類,繼承unittest裡面的testcase類
    def setUp(self): #setup測試之前的準備
        print("test start")

    def test_add(self): #定義個變數
        j=Math(5,10) #傳入值
        self.assertEqual(j.add(),15) #斷言。兩個引數,判斷第一個引數和第二個引數是不是相等
        #self.assertEqual(j.add(),12)

    def tearDown(self) :  #測試完成後列印測試完成
            print("test end")

if __name__=='__main__': #除錯unittest
    suite=unittest.TestSuite() #定義變數suite。
    suite.addTest(TestMath("test_add")) #呼叫addtest裝載

    runer=unittest.TextTestRunner() #執行
    runer.run(suite)

允許程式碼檢視輸出結果如下:

可以看到允許了幾個case,用了多久。

這樣就完成了一個簡單的單元測試。

Best Regards! Make a little progress every day!