使用Pytest進行單元測試(Unittest)

--

雖然 Python 內建 unittest,但有些不便之處,所以這次專案就使用pytest!網路上查到的資訊都說這個測試模組方便、順手、好用,但是對於初學者來說,一點都不好懂也不順手啊!

雖然單元測試比較偏後端工程師的工作了,但考慮未來想要自由接案還是有需要懂一點後端技能,只好硬著頭皮學(真的很硬)。

最後還是讓我得到這個綠字我痛哭流涕。

Unittest單元測試的概念

一個專案有時候同時有多個開發者,有些功能有時候會不小心被組員在不知情的情況下改壞了,但是有了單元測試就可以檢查該程式的功能是否仍正常運作。有的獨立開發者經驗老道,或是對自己的產出很有自信就不一定會寫測試(碰到問題再說?)。

維基百科上的解釋:
在電腦編程中,單元測試又稱為模組測試,是針對程式模組來進行正確性檢驗的測試工作。程式單元是應用的最小可測試部件。在程序化編程中,一個單元就是單個程式函式過程等;對於物件導向程式設計,最小單元就是方法,包括基礎類別、抽象類、或者衍生類別中的方法。

單元測試主要測試的標的通常是function函式,測試專案使用到的函式是否回傳正確。用assert(斷言?)的方式確認答案是否正確,所以一般測試文件會提供一個情境跟相對應的回傳值,有點像是驗算的方式確認該函式是不是得到期待的結果

Pytest基本設定

pytest 遵循標準的 test discovery rules ,幾點需要注意的:

  • 需要在環境裡安裝pytest(在terminal裡執行)
pip install pytest
  • 測試文件的檔名必須為test開頭或結尾如: test_*.py*_test.py。所以要用.py可以用的編輯器,這邊筆者是使用spyder編輯。
  • 類別名稱必須是 `Test` 開頭
  • 函數與類別內的方法都必須要 test_ 做為 prefix,通常會命名測試函示為test_欲測函式名稱,如下圖藍字。

Pytest執行

執行測試最好在虛擬環境中執行,其實沒弄懂為什麼,但我太容易把東西搞砸,加上查到的資料都這樣建議。

執行Pytest就會偵測搜集前面綴有test_的函數 ,有幾個就會顯示collected了幾個,順利的話就會跑底下的內容,幾個綠點就是幾個通過的測試!

如果有測試不過的,會有像下面著樣的結果,五個綠點後面一個紅字F表示第六個測試Fail了,下圖是開頭跟結尾,中間有一大串失敗的過程,但主要也是一句最後的訊息去看為什麼錯了。但是F不代表測試寫不對,如果該測試本來就是提供錯誤的答案,結果當然會是F。但如果下面紅字F的地方寫的是E就表示跑測試本身有問題,可能在設定的地方有錯。

邊做邊學Pytest範例

這是我為專案做的其中一隻測試

第一件事就是先定義測試函式為test_get_sector_known(),

response定義如果我輸入EC2Y 5,資料庫吐回來的一堆東西,再把這些東西用json格式存取,語法.json()。

假設這筆資料有效response.status_code就會是200,並且得到以下結果。28-31行都是我假定的回傳值,若status code正確且該程式回傳一樣的回傳值,就會通過passed。

其實pytest還有很多可以深入探討的東西,我也還在學習的路上,接下來要研究@pytest.fixture的功能,等我學會再整理分享!

--

--

社會科學家的Python習作簿

紀錄一個沒有程式語言背景的社會科學家,在學習Python路上的紀錄。因為喜歡用數據解決問題而投入統計語言的不歸路,記錄下來除了分享也幫助自己理解。到其他地方找到我:https://linktr.ee/lifan | lifan.su@outlook.com