1. 程式人生 > >單元測試框架之unittest(一)

單元測試框架之unittest(一)

一、單元測試的含義

unittest單元測試框架的設計靈感來源於Junit(Java語言的單元測試框架),它與其他語言的單元測試框架風格相類似,支援自動化測試、為測試共享setUp和shutDown、它可以在將測試用例聚合到一起形成一個集合一起執行的同時在測試報告中展示獨立的測試結果。

為了達到此目的,unittest支援幾個重要的面向物件式的概念:

1、test fixture

  一個test fixture所做的事情是執行單個或多個測試用例時的準備工作和執行結束後的一些相關清理工作,這包括:建立臨時或代理資料庫、目錄或開始伺服器程序。

2、test case

  一個test case 是一個獨立的測試單元,針對於一組特定的輸入得到的特殊相應的驗證,通過繼承unittest提供的基類TestCase, 然後可以建立新的測試用例

3、test suite

  一個test suite 是一組測試用例的集合,也可以是一組test suite的集合,也可以兩者混合的集合,test suite就是用來聚合你想要一起執行的測試用例的

4、test runner

  一個test runner 是一個協調測試執行並向用戶提供執行結果的組建,它可以使用圖形介面、文字介面或返回一個特殊值標識測試執行的結果

二、例項程式碼

下面我們看Python官方給的一個簡單的小例子,來測試三個字串

import unittest

class TestStringMethods(unittest.TestCase):  # 測試類繼承了unittest.TestCase類,因此在該類裡可以建立新的測試用例

    
def test_upper(self): self.assertEqual('foo'.upper(), 'FOO') # ‘foo’是一個字串,upper()方法會將這個字串轉成大寫,assertEqual是unittest提供的一個斷言方法,用來比較逗號前後兩個值是否相等 def test_isupper(self): self.assertTrue('FOO'.isupper()) # assertTrue也是unittest提供的斷言方法,用來判斷括號內的內容是真是假,如果是真則斷言成功,否則為失敗,'FOO'是個字串並且是大寫,呼叫isupper()方法,返回結果
self.assertFalse(
'Foo'.isupper()) # assertFalse則正好相反,如果括號內返回為假則斷言成功,否則為失敗 def test_split(self): s = 'hello world' self.assertEqual(s.split(), ['hello', 'world']) # check that s.split fails when the separator is not a string with self.assertRaises(TypeError): s.split(2) if __name__ == '__main__': unittest.main()

程式碼解析:

在第三個用例裡,定義了一個字串,s='hello world', 然後進行了斷言,斷言的條件裡呼叫了一個split()方法,實際上初學者看到這會比較懵,s.split()到底返回的是什麼,它是否等於逗號後邊['hello', 'world']?

學這個東西就是要多試試,那麼接下來我們進行一個嘗試

啟動命令列CMD,進入python環境

定義一個字串  s = 'hello world', 然後 print(s)回車,我們看一下結果應該是  hello world

那麼如果我們print(s.split())呢,結果應該是['hello', 'world'], 到此我們就得到了答案,第三條用例裡的斷言self.assertEqual(s.split(), ['hello', 'world'])是成功,繼續向split()對字串'hello world'做了什麼?

如果我們print(s.split(2)) 會是什麼結果?  如果我們print(s.split('o'))又會是什麼結果?

最後的unittest.main(),有了它我們就有了一個簡單的方式執行這個指令碼,unittest.main()提供了命令列介面執行指令碼的方式

假設我們上邊的指令碼儲存在檔案testingunit.py裡,然後我們啟動命令列,輸入python  testingunit.py  看看是個什麼結果?

如果我們執行python testingunit.py -v 又是什麼結果?