1. 代碼覆蓋率
單元測試代碼覆蓋率作為一種度量方式,可以計算單元測試用例對于被測代碼的覆蓋程度,即:被執行的代碼數量和代碼總數量的比值
統計代碼覆蓋率,經(jīng)常在單元測試后再進(jìn)行,可以為測試結果提供評判依據
Python 項目最常使用的代碼覆蓋率統計工具就是:Coverage
2. Coverage
Coverage 是用于統計 Python 代碼覆蓋率的工具,不僅支持分支覆蓋率統計,生成 HTML 格式的統計報告,而且可以集成到 Jenkins 中使用
安裝 Coverage 依賴(lài)同樣是使用 pip 安裝
# 安裝 Coverage 依賴(lài)
pip3 install coverage
Coverage 官方提供了 2 種方式,用于統計代碼覆蓋率,分別是:
1、Coverage 命令行
2、Coverage API
更詳細的介紹可以參考官方文檔:
https://coverage.readthedocs.io/en/latest/
3. 實(shí)戰一下首先,用 Python 編寫(xiě)一段簡(jiǎn)單被測代碼,如下:# 被測代碼
# main.py
def get_level(cource):
"""
自定義的方法
:param cource:成績(jì)
:return:
"""
if cource >= 90:
return "優(yōu)秀"
elif cource >= 80:
return "良好"
elif cource >= 60:
return "合格"
elif cource >= 40:
return "不合格"
else:
return "差"
然后,編寫(xiě)單元測試用例
根據上面的被測方法,這里使用 Python 自帶的unittest 依賴(lài)庫來(lái)編寫(xiě) 2 個(gè)簡(jiǎn)單的測試用例并且,特意只覆蓋到了上面方法的 2 個(gè)分支,即:優(yōu)秀和良好# 單元測試
# test_get_level.py
import unittest
from main import *
class GetLevel(unittest.TestCase):
def test_get_level1(self):
self.assertEquals(get_level(90), "優(yōu)秀")
def test_get_level2(self):
self.assertEquals(get_level(80), "良好")
if __name__ == '__main__':
unittest.main(verbosity=2)
右鍵運行單元測試,會(huì )發(fā)現兩個(gè)測試用例都是通過(guò)的接下來(lái),分別使用 Coverage 命令和 API 在本地生成代碼覆蓋率統計報告1、Coverage命令
在項目根目錄下,運行 coverage run 命令,生成 .coverage 文件,搜集被測試源代碼覆蓋率的信息
# 1、搜集被測代碼覆蓋率信息,保存到 .coverage 文件中
coverage run test_get_level.py
# 2、生成覆蓋率統計結果報告
coverage html -d coverage_result然后,使用 coverage html -d 命令在同級目錄下生成代碼覆蓋率統計報告
用瀏覽器打開(kāi)統計報告文件夾中的 index.html 文件,其中:statements:代碼總行數,不包含空行和注釋行
missing:未執行的代碼行數
coverage:代碼覆蓋率
點(diǎn)擊 test_get_level.py 文件,可以非常直觀(guān)地查看到,哪些代碼執行了,哪些代碼沒(méi)有被執行
2、Coverage API使用 Coverage API生成代碼覆蓋率統計報告更方便只需要使用查找測試套件并運行,然后使用 Coverage API 進(jìn)行分析、保存、展示即可
# 使用 API 生成代碼覆蓋率統計報告
# exec_api.py
import coverage
import unittest
# 實(shí)例化一個(gè)對象
cov = coverage.coverage()
cov.start()
# 測試套件
suite = unittest.defaultTestLoader.discover("./", "test_get_level.py")
unittest.TextTestRunner().run(suite)
# 結束分析
cov.stop()
# 結果保存
cov.save()
# 命令行模式展示結果
cov.report()
# 生成HTML覆蓋率報告
cov.html_report(directory='result_html')
4. 最后
上面只是通過(guò)一個(gè)簡(jiǎn)單的 Python 方法結合 unittest 單元測試框架,展示了 Coverage 獲取代碼覆蓋率統計報告的方法。
實(shí)際項目中,更多應用場(chǎng)景是: Python自動(dòng)化、Django/Flask Web項目統計單元測試用例的代碼覆蓋率,以提升產(chǎn)品的質(zhì)量。
聯(lián)系客服