【问题标题】:What is a good Code to Test Ratio? [closed]什么是好的代码测试比率? [关闭]
【发布时间】:2009-07-30 09:49:12
【问题描述】:

我正在使用 RSpec 编写测试。

您认为什么是好的代码测试比率?

【问题讨论】:

    标签: ruby-on-rails ruby rspec


    【解决方案1】:

    代码测试比率是一个有点误导性的统计数据。一个更好的方法是使用rcov,您可以通过运行rake spec:rcov轻松使用它

    虽然有时将 100% 的代码覆盖率作为绝对目标,但您很快就会遇到law of diminishing returns。我个人的目标是在所有生产代码中实现 90% 的代码覆盖率;尽管这主要是任意的,但我发现有一个目标数字要容易得多。

    【讨论】:

    • 我同意这一点,rcov 可能更好。虽然也可能会产生误导,如果它真的是微不足道的代码,那么覆盖率可能不那么重要,但并非总是如此。这是一个非常主观的领域。
    • 代码覆盖率并不是一切。 rcov 只检查代码是否在测试中执行。如果您没有完全测试条件,它不会告诉您。
    • @railsninja 为什么代码覆盖率在琐碎代码中不那么重要?因为你会在琐碎的代码中犯更少的错误?我认为更好的区别在于它是否是生产代码。
    • -1:rcov 只显示调用了哪些代码,但不一定经过测试!这比$ rake stats的代码与测试比率更具误导性
    【解决方案2】:

    良好的测试与代码比率是一种让您对自己编写的代码充满信心的测试,同时也让您可以自信地重构,因为您会知道您在应用程序的其余部分中受到的影响。我的测试比率从 1:1.5 到 1:2.5 左右不等,它确实会根据您的应用程序的复杂性而有所不同。

    【讨论】:

      【解决方案3】:

      我们目前正在谈论意见。良好的代码测试比率是这样一种比率,即您的代码被覆盖到需要的程度,以使对所写内容的信心和信心,当您进行重构时,您会知道周围发生了什么问题。

      数字很好,但在其中放太多股票同样危险。

      【讨论】:

        【解决方案4】:

        我的目标是不让 rcov 和 heckle 泄露未经测试的代码。当你获得了 rcov 所能获得的所有覆盖率后,你就可以通过 heckle 运行代码了。 Heckle 修改您的代码并向您显示哪些修改未被测试捕获。

        rspec 知道 heckle。安装 heckle gem 后:“spec foo_spec.rb -H Foo”。哦,如果您遇到奇怪的错误,请安装 ruby​​2ruby 的 1.2.2 版本而不是 1.2.4。

        这是我认为我已经完全指定的功能的抱怨:

        The following mutations didn't cause test failures:
        
        --- original
        +++ mutation
         def model_matches?(substring)
        -  s = substring.gsub(/\./, ".")
        +  s = substring.gsub(/\033!\032\002l\}\?V\010d\}\r\-\fyg,a\*jFT\003_"ga\016\020ufN\0066/, ".")
           s = substring.gsub(/\*/, ".*")
           s = "^#{s}$"
           Regexp.new(s, "i").=~(@model)
         end
        
        --- original
        +++ mutation
         def model_matches?(substring)
        -  s = substring.gsub(/\./, ".")
        +  s = substring.gsub(/\./, "\023GA3w+h-#z$?I;a\"k0n^r$\005io#l\023H1M{\034m")
           s = substring.gsub(/\*/, ".*")
           s = "^#{s}$"
           Regexp.new(s, "i").=~(@model)
         end
        
        --- original
        +++ mutation
         def model_matches?(substring)
        -  s = substring.gsub(/\./, ".")
        +  s = nil
           s = substring.gsub(/\*/, ".*")
           s = "^#{s}$"
           Regexp.new(s, "i").=~(@model)
         end
        
        --- original
        +++ mutation
         def model_matches?(substring)
           s = substring.gsub(/\./, ".")
           s = substring.gsub(/\*/, ".*")
           s = "^#{s}$"
        -  Regexp.new(s, "i").=~(@model)
        +  Regexp.new(s, "v\022").=~(@model)
         end
        

        这有多酷?

        我发现真正难以获得完整测试覆盖的唯一事情是涉及并发的测试,特别是。比赛条件。试图证明互斥锁或临界区必须到位可能很困难。有时你可以做到。有时,您只需耸耸肩,输入您不知道如何测试的代码行,然后继续。

        【讨论】:

          【解决方案5】:

          它因人而异。简单的代码我希望测试代码和生产代码一样多。复杂的代码很容易得到两倍的测试代码。进行测试驱动开发,不必担心比率,因为代码中的所有内容都是由测试驱动的,这很重要。

          【讨论】:

            猜你喜欢
            • 2010-09-08
            • 2010-11-21
            • 1970-01-01
            • 1970-01-01
            • 2011-05-10
            • 2012-10-30
            • 2010-09-11
            • 1970-01-01
            • 2023-04-07
            相关资源
            最近更新 更多