注意:琐碎的细节非常多,遇到问题多看看官方文档
1、命令行运行
如果程序的运行方式是:python my_program.py arg1 arg2
则替换成如下命令:coverage run my_program.py arg1 arg2
即用coverage脚本替代python命令启动程序。
2、和nosetests联合使用
有两种方式:
(1)coverage run $(which nosetests)
(2)nosetests --with-coverage ,这种方式使用nose builtin coverage模块,比官方coverage模块支持的功能少。使用时,优先考虑第一种方式
3、指定/忽略统计模块,忽略指定代码行
run命令的–source选项可指定哪些目录的文件被统计
coverage run --source=dir1,dir2
还可以指定模块,或在代码中添加指定的注释以忽略某些行代码,具体见官方文档
4、最佳实践
把coverage运行相关的option写在配置文件中,配置文件比命令行支持更多种类的option
5、coverage combine
coverage run 命令会生成 .coverage 文件,文件中存储了覆盖率统计结果。有时我们可能会分开跑不同类型的case,比如单独跑单测,再跑模块case,这样就会生成2个 .coverage 文件。将两个文件重命名为 .coverage.xxx 后移动到同一个目录,使用combine 命令,即可合并统计结果。
注意:coverage 通过文件的绝对路径,判断不同测试中的文件是否是同一个文件,是否能合并,因此不同测试中,源代码的文件位置要一致。如果不一致,可以通过在配置文件中 [path] section 配置。具体见path文档。
6、coverage run --parallel-mode
–parallel-mode 模式下创建的数据文件命名方式为 .coverage.machine_name.process_id.random_num,可以直接用于combine操作。这里 --parallel-mode 不是指并发或分布式之类的意思,仅仅是为了从不同的进程收集数据后combine。
7、coverage run -a
coverage.py 每次run会删除已有的 .coverage 文件,如果使用 -a 选项,则不会删除 .coverage,直接修改已有的 .coverage ,将前后两次的统计结果自动合并。
8、Measuring sub-processes
统计覆盖率情况,必须使用coverage.py 代替 python 启动程序,有些sub-process程序会默认使用python启动,导致sub-process部分代码覆盖率无法统计。coverage默认支持python threading(不是thread模块) 模块实现的多线程统计,其他的比如multi-process,gevent等需要另行配置,见文档
9、coverage run --branch
–branch 选项会增加分支覆盖率的统计,具体来说在 coverage report -m 输出的报告中增加 Branch and BrPart (for Partial Branch) 2列。
coverage中分支的定义是,一条语句执行完后,下一条要执行的语句有几种可能,就算几个分支。 比如下面的 if conditon 后,如果conditon 为 true,则下一条执行的语句为 execute_1;否则下一条执行的为 execute_2。尽管没有else,if 后可能执行的语句有2条,因此算2个分支。
if condition:
exectue_1
execute_2
Branch表示有多少个分支。
BrPart (for Partial Branch):假设一条语句后下一条要执行的可能语句有3条,测试只覆盖了其中1条,就说有2个BrPart,即有2个可能性测试未覆盖。一般报告中 “36->38” 这样箭头连接2个数字的标志,表示 36行后执行38行 这个分支没覆盖。
10、覆盖率计算
(1)不统计分支覆盖率时,覆盖率 = 已执行的代码行数 / 所有可执行的代码行数
(2)统计分支覆盖率时,覆盖率 = actual execution / execution opportunities,具体见官方文档。这个还没看懂…
11、生成报告
在 .coverage 文件所在目录,执行下列命令生成不同格式的报告
coverage report -m
coverage html
coverage xml
coverage annotate:生成带注释的源文件,标记哪些行被执行(>符号),哪些没有(!符号)
12、plugins
coverage 已有 Django,Mako plugin 可直接使用。具体细节及其他plugin见plugin
13、FAQ
FAQ