0%

使用assert來實作,第一次寫測試就上手

雖然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開始!