5

我正在使用 RSpec 编写测试。

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

4

5 回答 5

6

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

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

于 2009-07-30T10:30:13.193 回答
4

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

于 2009-07-30T10:15:06.500 回答
3

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

数字是好的,但在其中投入过多的股票可能同样危险。

于 2009-07-30T15:44:57.140 回答
3

我的目标是没有 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

多么酷啊?

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

于 2009-12-27T23:04:14.577 回答
1

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

于 2009-07-30T12:13:26.640 回答