如何建置 python, pytest, vscode 的測試程式的 debug 環境

更新 發佈閱讀 10 分鐘

Let's build debug environment for testing software development.

軟體工程師的日常

你知道嗎?軟體工程師的日常有很大部分時間都在 Trace code & Debug 度過。

根據我的觀察,測試領域大家愛用的程式語言是 python,幾乎都會搭配一個測試框架 ,例如 pytest, IDE 用 Microsoft vscode,考慮團隊共同開發,工作站的作業系統會選 Linux。

如何配置上述條件的 debug 環境來提高開發效率可以分兩個部分來討論:

  1. 獨立運行的 python 虛擬環境
  2. 建立 IDE vscode 的 debug 配置

獨立運行的 python 虛擬環境

什麼是「python 虛擬環境」? python 的虛擬環境可以理解是從系統獨立「格」出來的一個虛擬空間,每個虛擬空間可以有自己的 python 解譯器、所需的套件以及環境設定。可以想像一個被拿來格套的公寓,每間套房都有自己的衛浴、床鋪等設施,不同的住戶入住會有不同的電器需求與室內裝修風格。

用 python 的 venv 套件就能在作業系統上建立一到多個 python 虛擬環境。以我目前的 Linux 作業系統為例,雖然系統已經有提供 python 3.7,但我需要在專案 A 跑 python 3.8.17,在專案 B 跑 python 3.12.9,可以先用 venv 把 python 3.8.17 的虛擬環境建起來,如法泡製後面的 python 3.12.9。

# 使用 venv 建立 python 虛擬環境​
# 指定 .venv3817 目錄當作虛擬環境的根目錄​
$~/Python-3.8.17/python --version # 習慣先確認下版本
$~/Python-3.8.17/python -m venv .venv3817

一定會有人好奇,要建這麼多虛擬環境感覺好麻煩,難道不能直接使用作業系統的 python 環境嗎?在只有單人的作業環境是可以,只是每次切換專案都需要重新整備開發環境,重新安裝所需的 python 版本與套件,管理成本實在太高了。在多人共用的工作站就修改系統設定所有人都會受到影響。所以花點空間來換取獨立的虛擬環境是最好的選擇,還有萬一不小心手賤玩壞了直接整個目錄砍掉完全不用擔心。

啟動與退出虛擬環境

我的習慣是會幫不同版本的 python 虛擬環境按照編譯器版本取名字,例如:python 3.8 的就會用 .venv3817,前面的點(.)可以讓虛擬環境的資料夾變成隱藏屬性。建立好虛擬環境後就可以用 source 指令啟動 python 虛擬環境,接著就可以安裝需要的擴充套件。

# 啟動虛擬環境
$source .venv3817/bin/activate
(.venv3817)$

看到提示字符 $ 前面出現 (.venv3817) 代表已經成功進入虛擬環境。deactivate 指令可以退出目前的 python 虛擬環境。看到提示字符 $ 前的 (.venv3817) 消失,代表退出成功。

# 退出虛擬環境
(.venv3817)$deactivate
$

所以要切換不同虛擬環境就是先 deactivate 退出原本虛擬環境再用 source 指令進入指定的虛擬環境。

安裝必要套件

成功進入 python 虛擬環境後,就可以用 pip 安裝 python 套件,習慣上會按照不同的目的批次處理套件。例如:要安裝的套件放到 requirements.txt 內,要移除的套件放到 requirements-uninstall.txt,其他如內部開發的套件就放在 requirement-framework.txt。等待套件安裝時間取決於套件數量,可以先去喝個水上個廁所,套件安裝完畢後代表虛擬環境準備工作告一段落了。

# 先把 pip 升級
# 安裝套件 requirements.txt
# 解安裝​不需要的套件 requirements-unistall.txt
# 安裝內部開發套件 requirement-framework.txt
(.venv3817)$pip install --upgrade pip
(.venv3817)$pip install -r requirements.txt
(.venv3817)$pip uninstall -y -r requirements-uninstall.txt
(.venv3817)$pip install -r requirement-framework.txt

建立 IDE vscode 的 debug 配置

接下來開始配置 vscode 的 debug 環境設定,目標是在 vscode 的 .vscode 目錄內建立一個 launch.json 檔案,並完成裡面的配置設定。vscode 啟動 debug 模式會從此檔識別出 debug 進入點,以及 debug 啟動程式所需參數也會寫在這個檔案內。如果是第一次啟動 vscode 發現沒有 .vscode 目錄或 launch.json 檔案,先以用 vscode 的選單工具 Run-> Add configuration 先把檔案與基礎的環境與參數建起來。

一般的 python 程式要進 debug mode 都是透過 python 的 main() 函數進入,這是 file debug 模式。因為測試程式會使用 pytest 模組,所以進入點會改由模組啟動,其實就是 python -m 的意思,所以使用選單工具時,當 IDE 有問到要以哪種模式啟動時,要記得選 by module 把然後把模組名稱 pytest 填入。

{
"version": "0.2.0",
"configuations":[
{
"name": "Python Debugger: pytest debug",
"type": "debugpy",
"module":"pytest",
"request":"launch"
}
]
}

加入 args 參數設定

設定好以模組 pytest 啟動 debug 模式後,會得到基本的 debug 環境設定。接下來還需要手動補上一組 args 設定,告知 vscode debug 程式所需的外部參數。因為是模組方式啟動,需要的外部參數就是 pytest 單獨執行時可以帶入的參數,例如可用 -k testcase 來啟動特定名稱 testcase 作為進入點。pytest 本身還有很多參數可以搭配使用,更多細節可以參考 pytest 的 help file,再按照需求添加至 args 的設定就可以了。

{
"version": "0.2.0",
"configuations":[
{
"name": "Python Debugger: pytest debug",
"type": "debugpy",
"request":"launch",
"module":"pytest",
"justMyCode": true,
"args":[
"-rA",
"--show-capture=no",
"--capture=no",
"--tb=no",
"-c",
"testcase/pytest.ini",
"--topo_config_path=topology/testbed_2/main.yaml",
"-m",
"test_group",
"test_case"
]
}
]
}

選擇要搭配的 python 解譯器

我想你應該注意到了,現在系統內有三個 python 執行環境,vscode 怎麼知道要用哪個環境的 python 解譯器來 debug 呢?可以觀察 IDE 右下角的 button,可以看出我目前用的解譯器是 .venv3129 的 python,點選它就可以切換不同版本的 python 虛擬環境讓 vscode 知道該用哪個版本的解譯器進行除錯。

Location of selecting python interpreter

Location of selecting python interpreter

Select a target verion for debugging

Select a target verion for debugging

完成這關聯性設定後,python, pytest 與 vscode 的 debug 環境就配置完成。接下來就可以開心地下斷點,按 F5 進行日常開發、trace code 與除錯的工作了。

結論:久久做一次,做一次久久

要建立 python, pytest, vscode 的 debug 環境上並不太困難,也都是做一次久久,然後久久才做一次的小事。只是每次要執行的時候總是「流程記得很清楚步驟細節總是很模糊」,會令人感到煩躁心情不美麗;善用文件化補充細節就能在下次需要重建 debug 環境時省下不少時間。

留言
avatar-img
留言分享你的想法!
avatar-img
Warren Lo的沙龍
24會員
72內容數
WarrenLo's 軟體設計武功祕笈
Warren Lo的沙龍的其他內容
2025/05/25
我最近處理很多 Code Review 的活動,來說說自己對 Code Review 的看法。 可以直接去 google 打關鍵字,可以找到這樣的一段話...
Thumbnail
2025/05/25
我最近處理很多 Code Review 的活動,來說說自己對 Code Review 的看法。 可以直接去 google 打關鍵字,可以找到這樣的一段話...
Thumbnail
2025/05/10
前幾天突然想起好多年前到泰國出差的時候,同事看到我在找垃圾桶要做垃圾分類,他突然冒出一句 「Everything’s general」。意思是你不知道怎麼分類就放進一般垃圾就對了,貌似玩笑的一句話其實隱含著軟體抽象設計的道理...
Thumbnail
2025/05/10
前幾天突然想起好多年前到泰國出差的時候,同事看到我在找垃圾桶要做垃圾分類,他突然冒出一句 「Everything’s general」。意思是你不知道怎麼分類就放進一般垃圾就對了,貌似玩笑的一句話其實隱含著軟體抽象設計的道理...
Thumbnail
2024/09/25
當我們從事軟體開發工作一段時間後,有些人會開始接觸軟體架構設計。由於每個軟體架構設計者的對問題的理解與知識經驗差異會導出不同的設計架構。近期與同事的軟體設計案例經驗交流後,就很希望自己剛開始學習軟體架構設計的時候就有人能用實際的軟體架構設計經驗來帶我入門...
Thumbnail
2024/09/25
當我們從事軟體開發工作一段時間後,有些人會開始接觸軟體架構設計。由於每個軟體架構設計者的對問題的理解與知識經驗差異會導出不同的設計架構。近期與同事的軟體設計案例經驗交流後,就很希望自己剛開始學習軟體架構設計的時候就有人能用實際的軟體架構設計經驗來帶我入門...
Thumbnail
看更多
你可能也想看
Thumbnail
雙11於許多人而言,不只是單純的折扣狂歡,更是行事曆裡預定的,對美好生活的憧憬。 錢錢沒有不見,它變成了快樂,跟讓臥房、辦公桌、每天早晨的咖啡香升級的樣子! 這次格編突擊辦公室,也邀請 vocus「野格團」創作者分享掀開蝦皮購物車的簾幕,「加入購物車」的瞬間,藏著哪些靈感,或是對美好生活的想像?
Thumbnail
雙11於許多人而言,不只是單純的折扣狂歡,更是行事曆裡預定的,對美好生活的憧憬。 錢錢沒有不見,它變成了快樂,跟讓臥房、辦公桌、每天早晨的咖啡香升級的樣子! 這次格編突擊辦公室,也邀請 vocus「野格團」創作者分享掀開蝦皮購物車的簾幕,「加入購物車」的瞬間,藏著哪些靈感,或是對美好生活的想像?
Thumbnail
Python擁有便攜性和通用性,適用於多種場景,同時具有全球通用性。Python在科技製造業、資料分析、人工智慧等領域有廣泛應用,對於理工科背景者而言有獨特的優勢。透過在線課程、自學書籍、實作專案,以及參與社群和開源專案,理工背景者可以達成從轉職進入Python程式領域的目標。
Thumbnail
Python擁有便攜性和通用性,適用於多種場景,同時具有全球通用性。Python在科技製造業、資料分析、人工智慧等領域有廣泛應用,對於理工科背景者而言有獨特的優勢。透過在線課程、自學書籍、實作專案,以及參與社群和開源專案,理工背景者可以達成從轉職進入Python程式領域的目標。
Thumbnail
有關Python的國際認證
Thumbnail
有關Python的國際認證
Thumbnail
什麼是Python python是電腦程式語言的一種,如同python官方網站上的介紹 "Python是一種程式語,可讓你更快速地工作並更有效的整合系統"。簡單地說,就是你可用python這個程式語言去告訴電腦你想要作什麼,讓電腦來幫你完成你要作的事情。
Thumbnail
什麼是Python python是電腦程式語言的一種,如同python官方網站上的介紹 "Python是一種程式語,可讓你更快速地工作並更有效的整合系統"。簡單地說,就是你可用python這個程式語言去告訴電腦你想要作什麼,讓電腦來幫你完成你要作的事情。
Thumbnail
Python是一種易學且功能強大的程式語言,具有直譯、動態語法等特性,並擁有豐富的標準庫。它在各領域如Web開發、數據科學和人工智慧等得到廣泛應用,並被許多大公司如Google和Facebook等使用。Python還有強大的框架、豐富的交互機能、和龐大的社區。
Thumbnail
Python是一種易學且功能強大的程式語言,具有直譯、動態語法等特性,並擁有豐富的標準庫。它在各領域如Web開發、數據科學和人工智慧等得到廣泛應用,並被許多大公司如Google和Facebook等使用。Python還有強大的框架、豐富的交互機能、和龐大的社區。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News