Python代码覆盖性测试入门

2017-04-16 董付国 Python小屋 Python小屋

覆盖测试通过代码分析工具和跟踪钩子来判断哪些代码可执行以及哪些代码被执行了,是对单元测试的有效补充,可以用来判断测试的有效性。

Python扩展库coverage可以实现对Python代码的覆盖测试,使用pip工具安装之后,可以使用命令“coverage run file.py”对Python程序file.py进行覆盖测试,然后使用命令“coverage report”直接查看测试报告,或者使用命令“coverage html”生成HTML文件的测试报告,这些HTML文件自动保存在htmlcov文件夹中。可以使用命令“coverage help”查看coverage支持的所有命令。

例如,有下面的代码用来判断一个整数是否为素数:
from random import randint

def isPrime(n):
    for i in range(2, int(n**0.5)+1):
        if n%i == 0:
            return 'No'
    else:
        return 'Yes'

n = randint(3, 2000)
print(n, ':', isPrime(n))

把上面的代码保存为isPrime.py,然后在命令提示符环境中首先执行命令“coverage run isPrime.py”测试,再执行命令“coverage report”查看测试报告。-m选项用来显示没有被执行到的代码行号,可以使用命令“coverage report -h”查看更多选项。
C:\Python 3.5>coverage run isPrime.py
1862 : No

C:\Python 3.5>coverage report
Name         Stmts   Miss  Cover
--------------------------------
isprime.py       8      1    88%

C:\Python 3.5>coverage report -m
Name         Stmts   Miss  Cover   Missing
------------------------------------------
isprime.py       8      1    88%    8

另外,扩展库coverage还提供了编程接口支持代码覆盖测试。例如,把上面的素数判断程序修改为下面的代码并执行,会自动生成测试报告。
import coverage
from random import randint

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

def isPrime(n):
    for i in range(2, int(n**0.5)+2):
        if n%i == 0:
            return 'No'
    else:
        return 'Yes'

n = randint(3, 2000)
print(n, ':', isPrime(n))

cov.stop()
cov.save()
cov.html_report()