在計算機編程中,單元測試(英語:Unit Testing)又稱爲模塊測試, 是針對程序模塊(軟件設計的最小單位)來進行正確性檢驗的測試工做。程序單元是應用的最小可測試部件。在過程化編程中,一個單元就是單個程序、函數、過程等;對於面向對象編程,最小單元就是方法,包括基類(超類)、抽象類、或者派生類(子類)中的方法。編程
上面這段內容摘自維基百科。可能有不少同窗搞不明白什麼是單元測試。即便搜了不少資料,也仍是搞不明白。你們可能對單元測試有一個誤解,以爲單元測試是開發作的,跟測試同窗扯不上關係,實際上單元測試不論是開發仍是測試同窗均可以作。筆者將用本身的理解來解釋一下什麼是單元測試。同時下面也會給出例子讓你們更深刻了解什麼是單元測試。好比咱們如今有一個加法函數,須要咱們輸入兩個值,那麼咱們怎麼保證咱們寫的函數是沒有問題的呢?是否是要調用這個函數,而後傳入兩個值,查看返回值是否正確?其實這就是在作單元測試。固然咱們沒有用規範的作法去作單元測試,那麼什麼是規範的方法呢?下面我將會以代碼形式舉例進行介紹。仍是用加法函數來進行舉例。以下面代碼所示:微信
def add(a, b): return a + b print(add(1, 3))
咱們已經定義一個add函數,如今調用add函數,傳入1和3,而後把返回值進行打印,經過打印咱們發現打印的結果爲4,能夠初步這個函數是沒問題的,可是咱們知道一組數據不能證實這個函數是沒錯的,因此咱們須要多驗證幾回,這個時候咱們又加入了一行測試代碼,以下面代碼所示:框架
def add(a, b): return a + b print(add(1, 3)) print(add('a', 3))
運行以後咱們發現咱們的程序報錯了,報錯內容以下:函數
Traceback (most recent call last):
File "F:/blogApiTest/test2.py", line 6, in單元測試
print(add('a', 3))
File "F:/blogApiTest/test2.py", line 2, in add
return a + b
TypeError: must be str, not int
原來字符串和數字不能相加!固然咱們你們都知道在Python程序裏字符串和整型不能相加,可是咱們就是要傳入字符串和整型進行相加,結果程序奔潰了。因此咱們能夠說這個add函數是有bug的,那麼咱們來修復一下上面代碼,以下面代碼所示:測試
def add(a, b): if (type(a) == int or type(a) == float) and (type(b) == int or type(b) == float): return a + b else: return "請輸入數字" print(add(1, 3)) print(add('a', 3))
經過測試後咱們發現程序已經被咱們修復,可是這裏咱們思考一下,咱們在編寫測試用例的時候都要寫一個預期結果,可是代碼中並無寫預期結果,預期結果在咱們的腦海裏,咱們根據打印出來的實際結果跟咱們腦海中預期結果進行比對,若是一致說明程序是沒問題的,若是不一致,程序是有問題的。想一想看,其實挺麻煩的,那麼咱們有沒有辦法在代碼中寫上預期結果和實際結果呢?答案是確定的,有!使用assert斷言!設計
assert通常格式是assert condition , 若是condition爲false,那麼raise一個AssertionError出來。好比咱們斷言1和2是否相等,能夠寫成 assert 1==2 。知道這個邏輯咱們就能夠給咱們的add函數加上斷言,以下代碼所示:code
def add(a, b): if type(a) == int and type(b) == int: return a + b else: return "請輸入數字" assert add(1, 2) == 3 assert add(1, 3) == 3
運行以後咱們會發現程序報出異常,以下代碼所示:對象
Traceback (most recent call last):
File "F:/blogApiTest/test2.py", line 9, inblog
assert add(1, 3) == 3
AssertionError
經過上面異常咱們發現,若是預期結果和實際結果不一致時,assert斷言只拋出 AssertionError,這樣咱們很難搞清斷言爲何失敗,對於咱們排查錯誤時也形成沒必要要的時間浪費。那麼有沒有別的方法能夠很快知道爲何會斷言失敗呢?答案是有的,使用Python Unittest單元的測試框架。
歡迎關注微信公衆號:軟件測試汪。軟件測試交流羣:809111560