簡介
在測試中,為了度量產品質量,代碼覆蓋率被作為一種測試結果的評判依據,在Python代碼中用來分析代碼覆蓋率的工具當屬Coverage。代碼覆蓋率是由特定的測試套件覆蓋被測源代碼的程度來度量,Coverage是一種用於統計Python代碼覆蓋率的工具,通過它可以檢測測試代碼的有效性,即測試case對被測代碼的覆蓋率幾何。
Coverage支不僅持分支覆蓋率統計,還可以生成HTML/XML報告。並且XML報告可以結合Jenkins和Sonar集成工具一起使用。
Coverage官方文檔:http://coverage.readthedocs.org/en/latest/
安裝
Coverage作為Python的一個第三方庫,使用時需要先安裝,使用pip命令進行安裝。
安裝命令:pip install coverage
C:\Users\TynamYang>pip install coverage Collecting coverage Downloading coverage-5.1-cp37-cp37m-win32.whl (204 kB) |████████████████████████████████| 204 kB 731 kB/s Installing collected packages: coverage Successfully installed coverage-5.1 C:\Users\TynamYang>
安裝完成后可以看到安裝的版本:coverage-5.1
安裝完成后使用coverage,coverage有兩種使用方法,一種是在命令行中使用,一種是調用API使用。方便控制部分需要測試的代碼。
命令行中使用
1、基本參數
命令行中使用文檔:http://coverage.readthedocs.org/en/latest/cmd.html
命令行中使用時常用參數:
- run – 運行Python程序並收集執行數據
- report – 報告覆蓋率結果
- html – 生成HTML文件,內容含覆蓋率結果列表
- json – 生成JSON文件,內容含覆蓋率結果
- xml – 生成XML報告文件,內容含覆蓋率結果
- erase – 清除之前收集的覆蓋率數據
- combine – 合並多個數據文件
- debug – 獲取調試信息
可以使用help命令查看幫助: coverage help
2、運行代碼收集信息
在使用coverage時,基本需要兩步運行,第一步運行源代碼,收集被測試的源代碼覆蓋率的信息,第二步生成代碼覆蓋率的信息報告。
如下測試代碼:
#test.py # coding:utf-8 import unittest def add_numb(a, b): return a + b def division_numb(a, b): return a / b class Test(unittest.TestCase): def test_add_1(self): self.assertEqual(add_numb(1,1), 2) def test_add_2(self): self.assertEqual(add_numb(2,0), 1) def test_division_1(self): self.assertEqual(division_numb(2,1), 2) def test_division_2(self): self.assertEqual(division_numb(2,0), 2) if __name__ == "__main__": unittest.main(verbosity=2)
使用命令運行: coverage run test.py
C:\Users\TynamYang\Desktop> coverage run test.py test_add_1 (__main__.Test) ... ok test_add_2 (__main__.Test) ... FAIL test_division_1 (__main__.Test) ... ok test_division_2 (__main__.Test) ... ERROR ====================================================================== ERROR: test_division_2 (__main__.Test) ---------------------------------------------------------------------- Traceback (most recent call last): File "test.py", line 22, in test_division_2 self.assertEqual(division_numb(2,0), 2) File "test.py", line 9, in division_numb return a / b ZeroDivisionError: division by zero ====================================================================== FAIL: test_add_2 (__main__.Test) ---------------------------------------------------------------------- Traceback (most recent call last): File "test.py", line 16, in test_add_2 self.assertEqual(add_numb(2,0), 1) AssertionError: 2 != 1 ---------------------------------------------------------------------- Ran 4 tests in 0.003s FAILED (failures=1, errors=1) PS C:\Users\TynamYang\Desktop>
代碼執行完成后會生成一個覆蓋率統計結果文件:.coverage。該文件名可通過設置COVERAGE_FILE環境變量進行修改。
3、生成報告
查看報告有兩種方式,一種是在當前命令行模式下查看,一種是生成HTML報告文件查看。
命令行模式下查看
根據運行代碼后生成的.coverage文件,使用report參數可在命令行模式下查看覆蓋率統計結果。
使用命令:coverage report
PS C:\Users\TynamYang\Desktop> coverage report Name Stmts Miss Cover ----------------------------- test.py 16 0 100% PS C:\Users\TynamYang\Desktop>
由結果可以得知,執行的test.py文件,代碼覆蓋率是100%
結果展示中的字段含義:
- tmts:語句總數
- Miss:未執行到的語句數
- Cover:覆蓋率,計算公式 Cover=(Stmts-Miss)/Stmts
生成HTML報告文件
使用命令生成HTML報告:coverage html -d covhtml
其中參數-d是指定生成的html所在的文件夾名
命令執行完成后會生成一個covhtml文件。
文件中的index.html文件覆蓋率數據統計。
也可以看一些示例:https://nedbatchelder.com/files/sample_coverage_html/
各字段說明:
- Stmts 總的有效代碼行數(不包含空行和注釋行)
- Miss 未執行的代碼行數(不包含空行和注釋行)
- Branch 總分支數
- BrMiss 未執行的分支數
- Cover 代碼覆蓋率
- Missing 未執行的代碼部分在源文件中行號
以執行的測試原文件命名的文件,可以高亮顯示覆蓋和未覆蓋的代碼。如test_py.html。
也可以看一些示例,如http://nedbatchelder.com/code/coverage/sample_html/
調用API使用
調用API使用文檔:http://coverage.readthedocs.org/en/latest/api.html
在python代碼中通過調用coverage模塊執行代碼生成代碼覆蓋率的統計結果。使用方法也非常簡單,如下示例:
if __name__ == "__main__": # 實例化對象 cov = coverage.coverage() # 開始分析 cov.start() suite = unittest.defaultTestLoader.discover(os.getcwd(), "test.py") unittest.TextTestRunner().run(suite) # 結束分析 cov.stop() # 結果保存 cov.save() # 命令行模式展示結果 cov.report() # 生成HTML覆蓋率報告 cov.html_report(directory='covhtml')