前言
在 python 裡面,我們常需要在程式碼寫完時,測試程式碼功能是否正常,
「doctest」 這個套件雖然冷門,但使用時非常方便,這裡推薦給大家。
例如刷 leetcode 時,測試使用也非常的方便!
安裝
使用時我們需要先安裝「doctest」這個套件。
不過通常應該是都已經內建了。
我們可以用 import doctest 來測試看看有沒有 error。
import doctest
基本使用
我們先來看一個簡單的例子,
假設我們想要測試「我們製作的加法」的功能是否正常。
程式碼範例如下:
import doctest
def my_add(a, b):
'''
>>> my_add(1, 2)
3
'''
return a+b
if __name__ == "__main__":
doctest.testmod()
- 我們可以注意到有註解的部份,就是我們要測試的內容。
# 我們測試當 my_add 這個函數放入 (1, 2) 會發生什麼事,「>>>」可以視為 input 的概念
>>> my_add(1, 2)
# 理論上,這個 function 應該要回傳 3 給我
3
再提醒一次,我們需要用「”’ (3個單引號) 或 “”” (3個雙引號)」都可以,
在測試範圍前後各一個,來把這一段測試用的程式碼註解掉 (正常執行不會跑)。
- 執行時,我們可以分成「一般正常執行」與「測試執行」
2023/8/10,感謝網友 Yuki 的提醒!
原本我學習到的內容有誤,以下內容已經校正完成
一般測試,只顯示錯誤
python test.py
只有出現錯誤時才會跳出訊息。
顯示所有測試,不論對錯
python test.py -v
v 這裡指的是 verbose,可以簡單理解為不論對錯都顯示。
結果
一般執行,只顯示報錯
我們可以看到,正常執行 (沒有下 -v ) 的時候
程式沒有反應,「因為全部內容都是正確的」
正確情況!不論結果對錯,一律顯示 (加 -v)
在測試執行 (有下 -v ) 的時候,跑出了一些內容,
doctest 幫我們測試了 「my_add(1, 2)」 的這個 function,
我們「設定」他應該要回傳給我們 「3」。
而實際上也真的回傳給我們 「3」。
所以回傳 ok!
錯誤情況!不論結果對錯,一律顯示 (加 -v)
這邊示範一個錯誤情況,可以看以下範例:
我設定我們的函數應該要回傳給我們 「1」。
import doctest
def my_add(a, b):
'''
>>> my_add(1, 2)
1
'''
return a+b
if __name__ == "__main__":
doctest.testmod()
- 結果
看到真的出現錯誤了!
Expected: (我們期待的結果)
1
Got: (實際上得到的結果)
3
當然就 failure 啦!
補充:適用於 leetcode 的 doctest in class,doctest 搭配 class 的用法
可以參考我的另外一篇文章,裡面有詳細介紹 doctest 在 class 中的用法,
學起來在 leetcode 撰寫 testcase 非常的實用!
【Leetcode】python – 利用 doctest 測試 leetcode python testcase 的優雅寫法 (doctest in class,搭配 class 的用法)