6.6 测试覆盖
测试覆盖是完善单元测试的工具。它通过代码分析工具和跟踪钩子来判断代码的哪些部分被执行了。在单元测试期间使用时,它可以用来展示代码的哪些部分被测试所覆盖而哪些没有。
编写测试当然有用,但是知道代码的哪些部分没有被测试到才是关键所在。
显然,要做的第一件事就是在系统中安装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。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论