➣ Reading Time: 6 minutes

前言

在 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個雙引號)」都可以,
在測試範圍前後各一個,來把這一段測試用的程式碼註解掉 (正常執行不會跑)。

  • 執行時,我們可以分成「一般正常執行」與「測試執行」

「一般正常執行」

python test.py

「測試執行」

python test.py -v

嘿對,你沒看錯,就多一個「-v」而已,這樣才優雅麻!

結果

正常執行

我們可以看到,正常執行 (沒有下 -v ) 的時候,沒有反應,
因為我們也沒有特別寫功能去執行他XD

測試執行 – 正確情況

在測試執行 (有下 -v ) 的時候,跑出了一些內容,
doctest 幫我們測試了 「my_add(1, 2)」 的這個 function,
我們「設定」他應該要回傳給我們 「3」。
而實際上也真的回傳給我們 「3」。

所以回傳 ok!

測試執行 – 錯誤情況

這邊示範一個錯誤情況,可以看以下範例:
我設定我們的函數應該要回傳給我們 「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 非常的實用!

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

 ⭐Python 基礎用法 相關文章整理⭐:
1.【Python】python list 清除, 移除內容元素 remove, pop, del, clear相關用法整理 sample code (內含範例程式碼)
2.【Python】寫模組 module、package 總整理 Importing files from different folder
3.【Python】python assert (斷言) 用法 sample code (內含範例程式碼)
4.【Python】python 一行 if else 語法 (one line if else) sample code (內含範例程式碼)
⭐Python 字串處理 相關文章整理⭐:
1.【Python】python string format str.format 總整理
⭐Python 檔案處理相關文章整理⭐:
1.【Python】python 開關檔範例 與 程式模板 with open / file open sample code
2.【Python】取出檔案名稱 (含副檔名、不含副檔名) os path basename split 取出 檔名 路徑 不要副檔名 sample code
3.【Python】在 python 中利用 os.chmod 更改檔案的權限 chmod 777
4.【Python】利用 shutil 來複製檔案 shutil copy file
5.【Python】python 建立資料夾範例 mkdir os.makedirs() sample code
6.【Python】python 移除資料夾範例 rmdir shutil.rmtree() sample code
7.【Python】確認檔案是否存在 os.path.isfile / 確認資料夾是否存在 os.path.isdir sample code is folder / file exist
⭐Python 系統偵測 相關文章整理⭐:
1.【Python】python pyinotify sample code 偵測指定路徑底下的文件變化 (內有範例程式碼)
⭐Python 平行運算 相關文章整理⭐:
1.【Python】python pooling multiprocess – 用多核心來執行程式 sample code (內含範例程式碼)
2.【Python】python thread multiprocess 比較總整理
⭐Python 測試程式 相關文章整理⭐:
1.【Python】python 測試程式 – 利用 doctest 測試 python testcase 的優雅寫法,適用於 leetcode (doctest in function,搭配 function 的用法)
2.【Leetcode】python – 利用 doctest 測試 leetcode python testcase 的優雅寫法 (doctest in class,搭配 class 的用法)