雖然python已經有很好用的測試框架可以使用,不過對於剛開始想要自己寫測試的人,這些框架該怎麼使用還是需要花點時間學習一番。在真正進入使用測試框架之後,不彷先來作個簡單的測試感覺一下,其實我們可以很簡單的使用python的assert來實作看看。
假設今天要設計提款功能,其中有兩個函式,一個會回傳存款減去提款剩下的金額,一個會檢查提款金額只能以1000為單位。所以這台atm很簡單,就是只讓你提1000為單位的金額,而且不能提超過你餘額的錢。
1 2 3 4 5 def withdraw (deposit, money ): return deposit - money def check_withdraw (money ): return 'accept' if money % 1000 == 0 else 'refuse'
接著就是來寫一個測試用的function class,把要測試的不同條件寫進去,如果全pass就給個PASS訊息。function class只是一個簡單的方法把函式都集中起來,當然可以再作不同的變化。
1 2 3 4 5 6 7 8 9 10 class TaskTest (object ): def test_withdraw (self, func ): assert func(1200 , 2000 ) < 0 , '存款小於提款不能允許提出' assert func(3000 , 2000 ) > 0 , '存款大於提款需允許提出' print ('ALL withdraw PASS!' ) def test_check_withdraw (self, func ): assert func(1300 ) == 'refuse' , '提款金額非以1000為單位必須拒絕' assert func(1000 ) == 'accept' , '提款金額以1000為單位必須接受' print ('All check_withdraw test PASS!' )
接著就開始執行測試囉!
1 2 3 4 5 >>> tester = TaskTest()>>> tester.test_withdraw(withdraw)ALL withdraw PASS! >>> tester.test_check_withdraw(check_withdraw)All check_withdraw test PASS!
那如果今天有人不小心動到函式內容,1000被改成1300會發生什麼事情呢?
1 2 def check_withdraw (money ): return 'accept' if money % 1300 == 0 else 'refuse'
一樣執行看看,就會發現在作檢查提款的測試時被assert中斷了!當測試沒測過就可以趕快回去檢查一下程式碼究竟發生什麼問題了
1 2 3 4 5 6 7 8 9 10 >>> tester = TaskTest()>>> tester.test_withdraw(withdraw)ALL withdraw PASS! >>> tester.test_check_withdraw(check_withdraw)Traceback (most recent call last): File "assert.py" , line 23 , in <module> tester.test_check_withdraw(check_withdraw) File "assert.py" , line 15 , in test_check_withdraw assert func(1300 ) == 'refuse' , '提款金額非以1000為單位必須拒絕' AssertionError: 提款金額非以1000 為單位必須拒絕
第一次寫測試其實可以從python的assert開始玩起,自己就可以簡單寫單元測試囉!針對已經是大型的系統就可以考慮使用一些python的測試框架作單元測試或是整合測試。如果像這樣的單元測試要一進步的話,可以先從使用python的unittest 開始!