返回介绍

6.6 测试覆盖

发布于 2024-01-23 21:41:46 字数 2254 浏览 0 评论 0 收藏 0

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

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

显然,要做的第一件事就是在系统中安装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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文