系統開發時,如果是以V字形開發流程作為開發方式,在建立好程式的個別功能後,會需要建立針對個別功能做測試,此時可以使用像是pytest等工具來輔助,測試程式的功能是否有達到預期的目的、同時檢測程式的覆蓋率、並生成結果紀錄檔案,提供日後其他開發者或自己在確認程式功能完整性時有一個客觀的確認資料。
安裝
本篇文章使用pytest做為測試的工具,安裝時可以使用以下指令安裝pytest[1]與pytest-cov[2]
- 安裝pytest: pip install pytest
- 安裝pytest-cov: pip install pytest-cov
其中pytest是測設工具的本體,pytest-cov 則是用來確認程式覆蓋率的額外工具。
pytest預設條件
pytest 在使用時有以下預設條件
- 測試程式名稱: test_ + 自定義程式名稱 .py 、 自定義程式名稱 + _test.py
- 測試函式名稱: test_ + 自定義名稱
- 測試Class名稱: Test + 自定義名稱
依照以上名稱定義方式建立測試程式後,在資料夾中執行終端機後,輸入pytest後即可執行程式測試。如: 建立一個test_calculate.py程式:
def addone(x):
return x+1
def addtwo(x):
return x+2
def test_addone():
assert addone(3) == 4
接著在測試程式的資料夾中開啟終端機,並且輸入「pytest」
pytest-cov相關介紹
pytest-cov 是用來判斷程式中覆蓋率用,可以判斷程式C0、C1中的覆蓋率。
常用指令
- — cov = PATH: 指定測試對象路徑
- — cov-report = type:
有使用此指令時,測試完成後會依照指定輸出格式(html, xml 等),自動生成覆蓋率測試結果的報告。 - — cov-branch:
使用此指令時,表示要檢查的是C1覆蓋率,如未使用則是檢查C0覆蓋率。
使用例子
在終端機中輸入如:
pytest - - cov -v test_calculate.py - - cov-branch - - cov-report=html
執行後,程式會在資料夾中自動生成一個htmlcov資料夾,並將覆蓋率測試後的報告存放於其中。
點選其中的index.html檔案即可看到測試程式中的C1程式覆蓋率
如要更加仔細看測試程式中,各行的執行情況、測試的覆蓋項目,可以點選帶有測試程式名稱的html檔案,如,此處例子中的test_calculate_py.html
C1覆蓋率Html中的資訊
根據前面做的測試,生成後的html中有四個狀態項目: run、missing、excluded、partial
- run: 指的是在測試程式中,有被成功讀取、執行的項目。
- missing: 在測試中,並未被執行的項目。
- excluded: 在測試中,被跳過的項目、程式碼。
- partial: 在測試中,有被執行的選擇條件。
excluded 觸發方式
在測試程式中,如有要跳過測試項目,有兩種方式可以執行。
設定跳過測試的項目
此方式可以透過在測試程式的函式前,加上:
@pytest.mark.skip
pytest在執行測試時,即會自動跳過該測試項目,如:
import pytest
def addone(x):
return x+1
def addtwo(x):
return x+2
def test_addone():
assert addone(3) == 4
@pytest.mark.skip
def test_addtwo():
assert addtwo(3) == 5
使用C1覆蓋率測試
設定跳過執行原始程式碼
在原始程式中要跳過的行、項目後面,加上註解:
#pragma: no cover
如:
import pytest
def addone(x):
return x+1
def addtwo(x): # pragma: no cover
return x+2
def test_addone():
assert addone(3) == 4
pytest-cov在執行測試時,會自動跳過此部分程式碼的覆蓋率的確認
partial 觸發方式
在原始程式中,如有像if else的選項,當測試程式中的條件只有滿足其中一個條件時,partial就會被觸發,如:
import pytest
def add(x):
if x <3:
x = x+1
else:
x = x+2
return x
def test_add():
assert add(2) == 3
執行後:
測試程式介紹
透過上面的例子,可以注意到我在測試程式中有使用python 的assert指令來做為測試結果的判斷工具。當測試後得到的結果與預期的不同時,在終端機的介面會直接跳出提示,說明哪一個程式並未被滿足。如:
import pytest
def add(x):
return x+1
def delete(x):
return x-1
def test_add():
assert add(2) == 3
def test_delete_1():
assert delete(3) == 1
def test_delete_2():
assert delete(3) == 2
測試結果:
透過跳出來的提示,可以回頭修正原先建立好的程式中出錯的邏輯、變數。
參考資料
[1] pytest
[2] pytest-cov
コメント