在測試中,爲了度量產品質量,代碼覆蓋率被做爲一種測試結果的評判依據,在Python代碼中用來分析代碼覆蓋率的工具當屬Coverage。代碼覆蓋率是由特定的測試套件覆蓋被測源代碼的程度來度量,Coverage是一種用於統計Python代碼覆蓋率的工具,經過它能夠檢測測試代碼的有效性,即測試case對被測代碼的覆蓋率幾何。
Coverage支不只持分支覆蓋率統計,還能夠生成HTML/XML報告。而且XML報告能夠結合Jenkins和Sonar集成工具一塊兒使用。
Coverage官方文檔:http://coverage.readthedocs.org/en/latest/html
Coverage做爲Python的一個第三方庫,使用時須要先安裝,使用pip命令進行安裝。
安裝命令:pip install coveragepython
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使用。方便控制部分須要測試的代碼。json
一、基本參數
命令行中使用文檔:http://coverage.readthedocs.org/en/latest/cmd.html
命令行中使用時經常使用參數:api
能夠使用help命令查看幫助: coverage help工具
二、運行代碼收集信息
在使用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.pyui
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環境變量進行修改。spa
三、生成報告
查看報告有兩種方式,一種是在當前命令行模式下查看,一種是生成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%
結果展現中的字段含義:debug
生成HTML報告文件
使用命令生成HTML報告:coverage html -d covhtml
其中參數-d是指定生成的html所在的文件夾名
命令執行完成後會生成一個covhtml文件。
文件中的index.html文件覆蓋率數據統計。
也能夠看一些示例:https://nedbatchelder.com/files/sample_coverage_html/
各字段說明:
以執行的測試原文件命名的文件,能夠高亮顯示覆蓋和未覆蓋的代碼。如test_py.html。
也能夠看一些示例,如http://nedbatchelder.com/code/coverage/sample_html/
調用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')