Python代碼覆蓋率分析工具Coverage

簡介

在測試中,爲了度量產品質量,代碼覆蓋率被作爲一種測試結果的評判依據,在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')

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章