• 使用Rcov计算Rspec在Rails3项目中的测试覆盖率

    日期:2011-01-05 | 分类:ruby/rails | Tags:rails rspec 测试

        在计算机的世界里有很多这样的事物,咋一接触它们觉得很生涩,太难用,但如果坚持下来,稍稍领会其精神,就会发现这个东西实在是太好了。在我看来,测试算是其中之一吧。从真正写测试到现在已经有一段时间了,从开始觉得写它是费力不讨好的观念也逐步转变成没有它心里就不踏实的状态。前两天在看文章时发现“测试覆盖率”这个词语,也许它存在很久了,但对于我来说还是比较新鲜的东西,赶紧拿来尝试一番,顺便也对自己的测试代码进行一番评测。下面就简单说一下我的经历

        因为我的Ruby版本是1.8.7, 所以采用了Rcov用作测试覆盖率的工具(貌似还有一个选择simple_cov,但是针对ruby1.9开发的, 这里就没采用)。因为我的测试框架是采用的Rspec, 而Rspec又内在集成了Rcov的接口, 所以在使用起来非常简单。在Gemfile中加入 gem 'rcov' 后,依次执行以下命令

    1
    2
    
    bundle install
    rake spec:rcov

        此时你的测试代码会挨个执行一遍,测试完成后会在Rails的根目录下多出一个coverage文件夹,用浏览器打开coverage/index.html即可看到rcov生成的报告了。

        此外,你可能运行时会遇到rcov没有加载到rspec_helper的情况,这篇文章提到了这个问题,可能会帮助你解决,或者升级到rspec2.4.0也能解决问题。

    no such file to load -- spec_helper (LoadError)

        关于测试覆盖率应该包含多个方面的概念,如业务覆盖,代码覆盖。这里所涉及覆盖率其实都是代码覆盖,即程序代码在测试时被调用执行的部分除以项目总代码的一个比例,因此100%的代码覆盖率只代表了所有的代码在测试时被执行过,并不代表代码的所有情况被执行过。比如下面例子

    1
    2
    3
    
    def price(total_cost, total_count)
      return total_cost/total_count
    end
    

        这段代码在测试时我只需要对这个方法进行一次调用即可达到100%的测试覆盖率,但当我调用price(10, 0)时仍然会出错,所以即使测试代码覆盖率达到100%了也不能安心睡大觉。那这个东西该在什么情况下使用呢?首先,忘掉这个东西,还是按照平时的方式写测试、写代码。待工作完成之后可以再捡起这个工具进行一番测试,检查出哪里的测试代码有死角没有测到,该修的修,该补的补。完成这些之后再忘掉这个东西,仅此而已。

        相关链接: http://51it.ca/bbs/thread-4285-1-1.html

    分享到:

    评论

  • 写得不错,也够清楚,赞一个!