前言
在 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 的用法)
Reference
- https://openhome.cc/Gossip/CodeData/PythonTutorial/AssertDocTest.html
- https://ithelp.ithome.com.tw/articles/10244417
- http://technology-sea.blogspot.com/2012/02/python-doctest-test-case.html
- https://stackoverflow.com/questions/2708178/python-using-doctests-for-classes
请问有什么方法能够只运行一个程序中某个函数的doctest用例呢?
我也有想過這個問題, 不過目前還沒有什麼特別方便的解法,
暫時都是先以另外寫控制測試 function 作為輔助
基本使用那邊的描述有些怪怪的吧,實際上 `-v` 只是 verbose 開關,並不會影響 `testmod()` 有沒有執行
只是在沒下 `-v` 的時候是只有 test 出錯才會顯示資訊,而下了 `-v` 就是無論如何都會顯示
感謝指正!已經更新於文章裡面了!
真的太感謝了… 我自己之前也不知道學的觀念是錯的