單元測試框架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!