Python代码覆盖率工具之Coverage
Python代码覆盖率工具之Coverage
在软件开发过程中,确保代码覆盖率是质量控制的关键一环。通过测量代码覆盖率,开发者可以了解哪些部分的代码正在被测试执行,哪些部分尚未被覆盖,从而优化测试策略,提高代码质量。在Python中,Coverage是一个非常流行且功能强大的代码覆盖率工具。本文将详细介绍如何使用Coverage
工具来测量Python程序的代码覆盖率。
一、安装Coverage工具
使用Coverage
工具之前,首先需要安装它。可以通过Python的包管理工具pip
来进行安装:
pip install coverage
安装完成后,可以通过命令coverage --version
来检查是否安装成功。
二、使用Coverage工具
Coverage
工具提供了两种主要的使用方式:命令行方式
和API方式
。
1. 命令行方式
假设我们有一个简单的Python程序main.py
,内容如下:
def print_hi(name):
if "cnblogs" in name:
print(f'Hi, 博客园')
elif "test-gang" in name:
print(f'Hi, 小罡测试笔记')
else:
print(f'Hi, python')
if __name__ == '__main__':
print_hi('test-gang')
我们可以使用以下步骤来测量这个程序的代码覆盖率:
- 执行覆盖率测试:
coverage run main.py
这条命令会运行main.py
,同时记录哪些代码被执行了。
- 生成覆盖率报告:
coverage report
这条命令会在控制台输出一个简单的覆盖率报告,显示哪些代码被执行了,哪些没有。
- 生成HTML格式的覆盖率报告:
coverage html
这条命令会生成一个HTML格式的覆盖率报告,打开生成的htmlcov/index.html
文件,可以直观地查看代码的覆盖率情况。
命令概览
您可以通过执行coverage help
命令来查阅coverage
工具所提供的各项命令:
用法: coverage <command> [options] [args]
命令列表:
annotate 为源文件添加执行信息注释。
combine 将多个数据文件进行合并。
debug 展示coverage.py的内部调试信息。
erase 清除之前收集的覆盖率数据。
help 获取关于如何使用coverage.py的帮助信息。
html 生成HTML格式的覆盖率报告。
json 生成JSON格式的覆盖率报告。
lcov 生成LCOV格式的覆盖率报告。
report 报告各个模块的覆盖率统计数据。
run 运行Python程序并测量其代码执行情况。
xml 生成XML格式的覆盖率报告。
如需进一步了解各个coverage
命令的详细参数,可以分别执行coverage <command> --help
命令,例如:coverage combine --help
用法: coverage combine [options] <path1> <path2> ... <pathN>
此命令用于合并来自多个覆盖率数据文件的数据。合并后的结果将保存到一个单独的文件中,该文件代表所有输入数据的并集。位置参数可以是指向数据文件或包含数据文件的目录的路径。如果未提供路径,则默认合并当前目录下名为默认数据文件的数据。
选项:
-a, --append 将覆盖率数据追加到现有的.coverage文件中,而不是每次运行都清空该文件。
--data-file=DATAFILE 指定要操作的数据文件的基本名称,默认为“.coverage”。[环境变量: COVERAGE_FILE]
--keep 保留原始数据文件,而不是在合并后删除它们。
-q, --quiet 静默模式,不打印任何执行过程中的消息。
--debug=OPTS 设置调试选项,多个选项之间用逗号分隔。[环境变量: COVERAGE_DEBUG]
-h, --help 显示此命令的帮助信息。
--rcfile=RCFILE 指定配置文件的路径。默认情况下,将尝试使用“.coveragerc”、“setup.cfg”、“tox.ini”和“pyproject.toml”。[环境变量: COVERAGE_RCFILE]
2. API方式
除了命令行方式,Coverage
还提供了API方式,可以在Python代码中直接使用Coverage
类来测量覆盖率。以下是一个简单的示例:
import coverage
def print_hi(name):
if "cnblogs" in name:
print(f'Hi, 博客园')
elif "test-gang" in name:
print(f'Hi, 小罡测试笔记')
else:
print(f'Hi, python')
if __name__ == '__main__':
cov = coverage.Coverage() # 创建Coverage对象
cov.start() # 开始测量
print_hi('test-gang') # 需要测量的代码块
cov.stop() # 结束测量
cov.save() # 保存结果
cov.report() # 生成控制台报告
cov.html_report() # 生成HTML报告