1. 安装
  2. 准备 Python 代码
  3. 运行
    1. 命令行方式
    2. API 方式
  4. 查看覆盖率结果

覆盖率是度量测试完整性的一个手段,是测试有效性的一个度量。通过已执行代码表示,用于可靠性、稳定性以及性能的评测。

Coverage.py 是一个用来统计 Python 代码覆盖率的工具。通过它可以检测测试代码对被测代码的覆盖率。

安装

参考 https://coverage.readthedocs.io/en/latest/install.html

1
pip install coverage

准备 Python 代码

如对于以下 Python 代码 test_simple_class.py,第 20 行和第 30 行代码在运行时并没有覆盖到。把注释了的代码去掉注释后覆盖率即可达到 100%。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
"""Test for SimpleClass.
"""

import unittest


class SimpleClass(object):
"""A simple class.
"""
def __init__(self, num1, num2):
self.num1 = num1
self.num2 = num2

def sum(self):
"""Sum.

Returns:
int, the sum of num1 and num2.
"""
return self.num1 + self.num2

def difference(self):
"""Difference.

Returns:
int, the difference of num1 and num2.
"""
if self.num1 < self.num2:
return self.num2 - self.num1
return self.num1 - self.num2


class TestSimpleClass(unittest.TestCase):
"""Test of SimpleClass.
"""
def setUp(self):
self.simple_class = SimpleClass(1, 2)

# def test_sum(self):
# """Test sum.
# """
# self.assertEqual(self.simple_class.sum(), 3, 'test sum fail')

def test_difference(self):
"""Test difference.
"""
self.assertEqual(self.simple_class.difference(), 1,
'test difference fail')
# self.simple_class.num1, self.simple_class.num2 = \
# self.simple_class.num2, self.simple_class.num1
# self.assertEqual(self.simple_class.difference(), 1,
# 'test difference fail')


if __name__ == '__main__':
unittest.main()

运行

命令行方式

统计行代码覆盖率:运行以下命令即可得到测试脚本 test_simple_class.py 的覆盖率文件 .coverage

1
coverage run test_simple_class.py

更多常见参数:

1
coverage run test_simple_class.py arg1 arg2 --branch --include=PATH1,PATH2 --omit=PATH1,PATH2 --source=SRC1,SRC2
  • arg1, arg2test_simple_class.py 执行时的参数
  • --branch:统计分支覆盖率,默认只有行覆盖率
  • --include=PATH1,PATH2:包含路径
  • --omit=PATH1,PATH2:排除路径
  • --source=SRC1,SRC2:覆盖率要统计的源信息

API 方式

可以在 Python 代码中直接调用 coverage 模块执行代码覆盖率的统计:

1
2
3
4
5
6
7
8
9
10
import coverage

cov = coverage.coverage()
cov.start()

# run your code

cov.stop()
cov.report()
cov.html_report()

查看覆盖率结果

  1. 简单文本方式

    根据覆盖率统计结果文件 .coverage 展示统计结果,-m 参数展示没被覆盖到的代码行号。

    1
    coverage report -m

    输出结果如下:

    1
    2
    3
    Name                   Stmts   Miss  Cover   Missing
    ----------------------------------------------------
    test_simple_class.py 18 2 89% 20, 30

  2. HTML 格式

    根据覆盖率统计结果文件 .coverage 把结果以 HTML 格式保存在 htmlcov 文件夹里。

    打开 htmlcov/index.html 即可看到覆盖率报告。

  3. XML格式

    根据覆盖率统计结果文件 .coverage 把结果以 XML 格式保存在 coverage.xml 文件里。