使用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的功能,等我學會再整理分享!