-
2011-05-11
测试覆盖率,100%
版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://dreamhead.blogbus.com/logs/127864877.html
测试覆盖率这东西,高了不代表有多好,但低了肯定是有问题。
在这个项目里,我们把测试覆盖率限制为100%,其结果是全部内容都会有测试覆盖。坚持这样的标准,在做重构的时候,可以比较放心。
工具支持
我们用的测试覆盖率工具是cobertura,buildr缺省就对它进行有支持。
require 'buildr/java/cobertura'cobertura.check.branch_rate = 100
cobertura.check.line_rate = 100
(buildfile)在命令行里运行如下命令就可以运行测试,进行检查,生成报告:
buildr cobertura:html cobertura:check如果覆盖率不达标,构建就会失败。这时,我们可以通过它生成的报告来看,到底是哪里没有覆盖。报告位于
reports/cobertura/html/index.html提交流程
设定了目标,接下来,就是如何将这个目标贯彻下去。为了确保大家在提交之前都会保证测试覆盖率,我们制作了一个提交脚本,其基本流程是:
- 检查更新
- 运行测试
- 提交代码
因为这个项目里用到都是一个分布式源码管理工具:git,所以,第一步我们做的是本地提交。
项目组代码提交都要通过这个脚本,以此保证我们提交的代码,测试覆盖率没有问题。一旦某人因为一些特殊原因,强行手工提交,我们还有CI进行保证,它同样会运行测试覆盖率检查,一旦失败,CI就会红掉。
例外情况
真的是所有代码都会在这个100%的监控之下吗?不是。有一些代码只是为了调用一个特定的API,这样的代码是否100%意义不大,这样的测试本质上是在API写测试,而非自己的代码逻辑。所以,这种代码会被排除在外。
cobertura.exclude /.*.integration.*/但是,这样的代码同样会有相应的集成测试,只是不在单元测试的层面。一个基本的原则是,被排除的代码要尽可能少。在我们的项目里,只有这样只调用特定API的集成代码会被排除在外。
有了目标,有了工具支持,有了大家自我监督,100%其实也是一件很容易达到的事。
引用地址:








评论
但是,对你的观点依然有一些质疑。BlogBus的评论还限制字数。转到自己博客了。
http://www.cnblogs.com/Cajon/archive/2011/05/15/2046871.html
最后付一些个人的背景信息,也许对我们讨论有用。我是一个.NET控件开发人员。曾经尝试过绝对的TDD,后来不得要领,无疾而终。目前在项目中,会采用TDD来修Bug. :)
http://gigix.thoughtworkers.org/2011/4/17/why-is-100-test-coverage-easier-to-achieve
不然就总得面对类似一楼这样的问题。
另一方面,不知道你的代码是否包含用户交互的部分?这一部分也能够做到测试覆盖吗?
交互,只要是有逻辑的代码,就应该测试覆盖。当然,做到这一点还要在设计上分离,这是另外一个的话题。