2009-07-30 13 views

答えて

4

コードに対するテストの優れた点は、作成したコードに自信を持てるようにすることであり、アプリケーションの残りの部分であなたが何をしているのかがわかるようにリファクタリングすることができます。私は1:1.5から1:2.5程度までのテスト・レシオを持っていますが、アプリケーションの複雑さによってテスト・レシオが実際に変わる可能性があります。

6

コードに対するテスト比率は、誤解を招く統計情報です。より良い方法はrcovを使用することです、あなたは簡単に100%のコードカバレッジなくなりrake spec:rcov

を実行することにより、それを使用することができ、時にはあなたはすぐにlaw of diminishing returnsに実行し、絶対的な目標として掲げています。個人的に私は全生産コードで90%のコードカバレッジを目指しています。これは主に任意ですが、目的の番号を目指す方がずっと簡単です。

+0

これに同意すると、おそらくrcovが良いでしょう。誤解を招く可能性もありますが、それが本当に簡単なコードなら、カバレッジはそれほど重要ではありませんが、必ずしもそうではありません。これは本当に主観的な領域です。 – nitecoder

+1

コードカバレッジはすべてではありません。 rcovは、コードがテスト中に実行されるかどうかをチェックするだけです。それはあなたの条件を完全にテストしていないかどうかを教えてくれません。 –

+0

@railsninja簡単なコードでコードカバレッジがそれほど重要ではないのはなぜですか?あなたは簡単なコードで間違いを少なくしますか?私はより良い区別は、それが生産コードであるかどうかであろうと思う。 – Olly

1

簡単なコード私は多くのテストコードをプロダクションコードとして期待しています。複雑なコードは、テストコードの2倍の価値があります。テスト駆動型開発を行い、コード内のすべてがテストによって駆動され、それが重要であるため、比率について心配する必要はありません。

3

私たちは現在、意見について話しています。優れたコードとテストの比は、リファクタリング時に何があなたの周りに壊れているのかを知ることができるように、書かれていることと自信の両方に自信を持たせる必要がある程度までコードがカバーされています。

数値は良好ですが、数値が大きすぎると危険です。

3

私の目標は、rcovとheckleによって明らかにされたテストされていないコードです。あなたがrcovで得ることができるすべてのカバレッジを取得したら、heckleでコードを実行することができます。ヘックルはあなたのコードを修正し、テストによってキャッチされなかった変更を表示します。

rspecはヘッケルを知っています。 heckle gemをインストールした後: "spec foo_spec.rb -H Foo"。ああ、奇妙なエラーが発生した場合は、1.2.4ではなくruby2rubyのバージョン1.2.2をインストールしてください。ここで

は野次る私は完全に指定したと思った機能不満だ:

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 

それがどのようにクールですか?

私が見つけた唯一のことは、完全なテストカバレッジを得ることが本当に難しいということは、並行性を含むテストです。競争条件。ミューテックスやクリティカルセクションが存在しなければならないことを証明しようとするのは難しいでしょう。時々あなたはそれを行うことができます。時々、あなたは肩を肩をすくめ、テストする方法がわからないコード行を入れ、次に進む必要があります。

関連する問題