web-dev-qa-db-ja.com

コードカバレッジはコードの品質を向上させますか?

コードカバレッジが実際にコード品質を向上させるかどうかについての測定基準があるかどうか私は知りたいですか?調査研究はありますか?

もしそうなら、それは何パーセントで収益を減少させるケースになりますか?
そうでない場合、なぜそれほど多くの人々がそれを宗教的な教義として扱うのですか?

私の懐疑論は逸話的であり、私が関わった2つのプロジェクトによってもたらされました-どちらも同じ合理的に複雑な製品を実装しました。最初のものは、あちこちで対象となる単体テストを使用しました。 2つ目は、必須の70%のコードカバレッジです。欠陥の量を比較すると、2番目の欠陥はほぼ1桁多い。どちらの製品も異なるテクノロジーを使用し、開発者のセットも異なりましたが、それでも驚いています。

13
AngryHacker

ユニットテストのコンテキストで Code Coverage メトリックを参照していると想定しています。もしそうなら、私はあなたが間接的にここであなたの質問にすでに答えていると思います:

最初のプロジェクトは、あちこちで対象となる単体テストを使用しました。 2つ目は、必須の70%のコードカバレッジです。欠陥の量を比較すると、2番目の欠陥の方がほぼ1桁多い。

要するにいいえ、コードカバレッジメトリックはプロジェクトの品質をまったく改善しません。

また、コードカバレッジは単体テストの品質を反映しているが、そうではないという一般的な信念もあります。また、システムのどの部分が適切にテストされているかについての情報も提供しません。テストスイートによって実行されたコードを示すだけです。確かなことは、コードカバレッジは、システムのどの部分がテストされていないかという情報のみを提供するということです

ただし、単体テストの品質が確かである場合、コードカバレッジメトリックは全体的なコード品質に関連する場合があります。単体テストの品質は、ビジネス要件に反するコードベースの変更を検出できる能力として定義できます。言い換えると、特定の要件(承認基準)に違反するすべての変更は、良質のテストによって検出される必要があります(このようなテストは単に失敗するはずです)。テストスイートの品質を測定するための最も単純で自動化されたアプローチの1つは、追加の労力をかけずに mutation Testing です。

UPDATE:

http://martinfowler.com/bliki/TestCoverage.html

11

コードカバレッジは、コードのどの程度がテストでカバーされているかを示します。テストの品質についてはあまりわかりません。たとえば、70%のコードカバレッジは、ゲッターやセッターなどのささいな機能を実行し、一部の複雑な計算が正しい結果やコーナーケースなどを提供することの確認など、より重要なことを省いた自動テストによって得られる可能性があります。 100%のコードカバレッジがある場合でも、テストでは、コードの失敗を引き起こすコードへの特別な入力を考慮しない場合があります。したがって、比較的高いコードカバレッジは、コードが十分にテストされていることを必ずしも意味せず、したがって、テストによって重要な欠陥が依然として検出されない可能性があります。

一方、コードカバレッジが低いということは、多くのコードがテストされていないことを意味しますまったくしたがって、一部の重要なモジュールが適切に検証されていない可能性があります。自動テストのコードカバレッジを比較的低くすることは意味がある場合があります。対応する自動テストを作成するよりも、GUIボタンをクリックして適切なダイアログが開くことを確認する(手動テスト)方が効果的です。それでも、このシナリオでさえ、自動テストと手動テストを組み合わせたカバレッジは高くなります。

したがって、IMOコードカバレッジaloneは、一方向でしか機能しないため、テストの品質を示す適切な指標ではありません。

  1. コードカバレッジスコアが低いと、テストされていないコードが正しく指摘され、バグが発生したり、デッドコードになる可能性があります。
  2. コードカバレッジスコアが高いと、テストの質が低下し、コードの品質に対する信頼が高まる可能性があります。

[〜#〜]ノート[〜#〜]

手動テストのコードカバレッジを教えてくれたgnatに感謝します。

19
Giorgio

reductio ad absurdumとして:次のテストは関数の行の60%をカバーします:

def abs(x):
    if x < 0:
        return -x
    else:
        return x

assertEquals(abs(-10), 10)

この例では、100%のカバレッジがあります。

def abs(x):
    if x < 0:
        return -x

assertEquals(abs(-10), 10)

もちろん、後者だけにバグがあります。

12
RemcoGerlich

コードカバレッジは役立ちますが、それだけでは良い指標ではありません。
それが役立つのは、そのカバレッジを提供するテストを作成するために、人々が意識的にコードを操作することを強制することであり、それにより、潜在的な問題を確認して修正する可能性があります。

しかし、これを行う人々が実際にコードに興味がない場合は、コードが実際に何をするか、それが正しいかどうかを気にすることなく、すべてをカバーするテストコードを機械的に構築できます。

その結果、誤った安心感につながる可能性があります。しかし、チームが適切に動機付けされており、品質の提供に関心がある場合は、チームが疑わしいコードの領域を見つけ、潜在的な問題について調査する必要があるのを助けるための良い方法です。

また、対象となる行を数えるだけでは十分ではありません。たとえば、条件ステートメントまたは考えられるすべての結果を通じてさまざまなパスをテストするなど、ブランチカバレッジも必要です。

2
jwenting

いいえ。コードカバレッジはコードの品質を向上させません。

単純なコードカバレッジは、コードの行がテストメソッドでどれだけ実行されたであったかを示します。
製品コードがアサートされたかどうかを示すものではありません。

これでは、プロダクションコードの品質に関する情報を提供できないと思います。

TDDスタイルでコードを記述する場合、コードカバレッジはまったく必要ありません。あなたはすでに、以前に書かれたテストでカバーされたコードだけを書いています。

1
Fabio

単体テストを作成しないプログラマーの前に、70%のコードカバレッジ要件が課されましたか?もしそうなら、結果は70%のコードカバレッジルールではなく、プロジェクトのプログラマーの態度にもっと関係していると思いますか?

コードカバレッジは、単体テストのターゲット設定に役立つ優れたツールですが、単体テストの利点を信じ、単体テストの作成に熟練している人々によってのみ使用されます。

1
Ian