6.6 测试覆盖

测试覆盖是完善单元测试的工具。它通过代码分析工具和跟踪钩子来判断代码的哪些部分被执行了。在单元测试期间使用时,它可以用来展示代码的哪些部分被测试所覆盖而哪些没有。

编写测试当然有用,但是知道代码的哪些部分没有被测试到才是关键所在。

广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元

显然,要做的第一件事就是在系统中安装Python的coverage模块(https://pypi.python.org/pypi/coverage)。安装之后就可以通过shell使用coverage程序1

单独使用coverage非常简单且有用,它可以指出程序的哪些部分从来没有被运行过,以及哪些可能是“僵尸代码”。此外,在单元测试中使用的好处也显而易见,可以知道代码的哪些部分没有被测试过。前面谈到的测试工具都可以与coverage集成。

使用nose时,只需要加入很少的选项就可以生成一份不错的代码覆盖报告,如示例6.15所示。

示例6.15 使用nosetests --with-coverage

$ nosetests --cover-package=ceilometer --with-coverage tests/test_pipeline.py
..............................................
Name                              Stmts Miss Cover Missing
ceilometer                    0  0 100%  
ceilometer.pipeline             152  20 87% 49, 59, 113,
127-128, 188-192, 275-280, 350-362
ceilometer.publisher          12   3 75%  32-34
ceilometer.sample                 31   4 87%  81-84
ceilometer.transformer               15    3 80%  26-32, 35
ceilometer.transformer.accumulator   17  0  100%
ceilometer.transformer.conversions   59  0  100%
TOTAL                                  888    393    56%  

---------------------------------------------------------
Ran 46 tests in 0.170s
OK

加上--cover-package选项是很重要的,否则就会看到每个被用到的Python包,包括标准库和第三方库。这个输出包括没有被运行的代码行,也就是没有被测试的代码行。所有需要做的只是打开你喜欢的文本编辑器然后开始写点儿什么。

但是也可以做得更好一点儿,让coverage生成漂亮的HTML报表。只需要加上--cover-html标志,这个cover目录就会在HTML页面中打开,然后每一页都会显示源代码的哪些部分运行与否如图6-1所示。

如果愿意的话,可以使用--cover-min-percentage=COVER_MIN_PERCENTAGE选项,如果测试集运行时被执行的代码没有达到指定的最低百分比,这将会让测试集失败。

 警告

  代码覆盖率是100%并不意味着代码已经被全部测试可以休息了。它只表明整个代码路径都被运行了,并不意味着每一个可能的条件都被测试到了。也就是说,这是个值得追求的目标,但并不意味着这是终点。

使用testrepository时,可以使用setuptools集成运行coverage

示例6.16 使用coverage和testrepository

$ python setup.py testr --coverage

这样可以结合coverage自动运行测试集,并在cover目录中生成HTML报告。

接下来你应该利用这些信息来巩固测试集,并为当前没有被运行过的任何代码添加测试。这是非常重要的,因为它有利于项目的后期维护,并有利于提升代码的整体质量。

阅读 ‧ 电子书库

图6-1 ceilometer.publisher的覆盖率


1如果通过操作系统的软件安装程序进行安装的话,命令名也可能是python-coverage。例如,Debian系统中就叫python-coverage