分類

展開全部 | 收合全部

分類

展開全部 | 收合全部

【Python 測試程式 #1】利用 doctest 測試 python testcase 的優雅寫法,適用於 leetcode (doctest in function,搭配 function 的用法)

前言

在 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

⭐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 (內含範例程式碼)
5.【Python】lambda 與 def function 使用方法與比較整理(內含範例程式碼)
6.【Python】python map 使用方法 與 其他寫法比較整理 (內含範例程式碼) sample code
7.【Python】python zip 使用方法 與 其他寫法比較整理 (內含範例程式碼) sample code
⭐Python 字串處理 相關文章整理⭐:
1.【Python】python print 變數的值 & 變數名稱 方法總整理
2.【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 偵測指定路徑底下的文件變化 (內有範例程式碼)
2.【Python】python 利用 argparse 使程式執行時可帶參數 (內附範例程式碼) sample code
⭐Python 平行運算 相關文章整理⭐:
1.【Python】threading – 建立多執行緒來執行程式 (內含範例程式碼) sample code
2.【Python】multiprocessing – 01 | 用多核心來執行程式 (內含範例程式碼) sample code
3.【Python】multiprocessing – 02 | pool, map, apply_async – 用多核心來執行程式並取得結果 (內含範例程式碼) sample code
4.【Python】python thread multiprocess 比較總整理
5.【Python】python pooling multiprocess – 用多核心來執行程式 sample code (內含範例程式碼)
⭐Python 測試程式 相關文章整理⭐:
1.【Python】python 測試程式 – 利用 doctest 測試 python testcase 的優雅寫法,適用於 leetcode (doctest in function,搭配 function 的用法)
2.【Leetcode】python – 利用 doctest 測試 leetcode python testcase 的優雅寫法 (doctest in class,搭配 class 的用法)
⭐Python Chatbot 相關文章整理⭐:
1.【Chatbot】(全圖文說明) LINE Developers bot 機器人註冊與設定
2.【Chatbot】(全圖文說明) ngrok 本地伺服器設定方法 – LINE bot local server
3.【Chatbot】Dialogflow API 串接 python 的方法 (內含範例程式碼)
4.【Chatbot】[講義分享] 手把手實作line機器人 (linebot API 運用)
⭐Python Google Colab (Colaboratory) 相關文章整理⭐:
1.【Colab】Python colab 上傳檔案的方法 (內含範例程式碼) upload files
2.【Colab】Python colab 連接 google 雲端硬碟取用資料 (內含範例程式碼) mount google drive
⭐Python 其他筆記 相關文章整理⭐:
1.【Python】anaconda 更新 (upgrade) python 3.8 版本筆記
2.【Sublime】Sublime 將縮排 “tab” 改成 4格空白 的方法 (圖文說明) sublime indent 4 spaces
3.【Sublime】Python 縮排小技巧 (很爛但實用) 快速將 tab 改成「4格空白」的方法
⭐【喜歡我的文章嗎? 歡迎幫我按讚~ 讓基金會請創作者喝一杯咖啡!
如果喜歡我的文章,請幫我在下方【按五下Like】 (Google, Facebook 免註冊),會由 「LikeCoin」 贊助作者鼓勵繼續創作,讀者們「只需幫忙按讚,完全不用出錢」哦!

likecoin-steps
Howard Weng
Howard Weng

我是 Howard Weng,很多人叫我嗡嗡。這個網站放了我的各種筆記。希望這些筆記也能順便幫助到有需要的人們!如果文章有幫助到你的話,歡迎幫我點讚哦!
另外,因為定位是「個人的隨手筆記」,有些文章內容「⚠️可能我理解有誤⚠️」或「?只寫到一半?」,如果有發現這樣的情況,歡迎在該文章的最下面留言提醒我!我會儘快修正或補上!感謝大家的建議與幫忙,讓網站能變得更好?

文章: 890

4 則留言

  1. 基本使用那邊的描述有些怪怪的吧,實際上 `-v` 只是 verbose 開關,並不會影響 `testmod()` 有沒有執行
    只是在沒下 `-v` 的時候是只有 test 出錯才會顯示資訊,而下了 `-v` 就是無論如何都會顯示

★留個言吧!內容有誤或想要補充也歡迎與我討論!