2011-11-14 16 views
0

私はフレームワーク4.0で開発されたasp.net Webフォームプロジェクトで作業しています。現在、単体テストはありません。コードカバレッジの分析

私は現在ユニットと統合のテストを導入したいサイトに新しい機能を追加しています。コードカバレッジの概念に慣れていない私は、新しい機能に対して高い割合を達成したいと考えています。

私はモック生成のためにビジュアルスタジオとライノモックで提供される統合テスト環境を使用します。新しい機能については、どのレベルのコードカバレッジを達成する必要がありますか?また、初心者のためにカバレッジをコード化するには、サイトの特定の機能に対してこれをどのように測定することができますか?

答えて

7

一貫して、コードカバレッジは、ユニットテストでは95%に近づいて取得することは可能ですが、あなたがする必要がありますあなたが実際にテストしているものと嘲笑しているものに常に注意を払ってください。

欠陥のあるモックを使用した単体テストによる100%コードカバレッジは、テストカバレッジをまったく持たない場合よりも悪いです。悪いモックはセキュリティの誤った感覚につながります。実際にあなたが何も知らないときにコードが現実世界でどのように運ばれるかを知っていると思います。あなたはこの誤った知識に自信を持っているので、あなたは何も知っていません。もしあなたが少なくとも何のテストもしていなければ、あなたはあなたのガイドとして恐怖を持っていました。

モックは素晴らしいテストツールですが、あなたのモックは決してあなたが現実世界と思われるもののエミュレーション以上のものではないことに留意する必要があります。あなたは、実世界コードの主な流れでは、一般的に問題を見つけることはできません。実世界が合理的な期待から逸脱し、モックがあなたを誤った安全の感覚に導くのは、背後の渦中です。

あなたが一般的に実際のシステムに対して実行しているため、インテグレーションテストの方が現実的に優れています。しかし、コードパスのすべてのコーナーケースを掃引し、コードカバレッジの最後の5%を絞り込むために、統合テストの失敗ケースをシミュレートすることは非常に難しいです。ユニットテストは、エラー状態を強制したり、コードのエラー処理を実行するのに優れています。

コードカバレッジ統計情報をあまり読み込まないように注意してください。あなたは彼らの言うことを知っています:嘘、虚偽の嘘、コードカバレッジ統計。 ;>コードカバレッジデータは、単体テストの実行内容を把握するための貴重なツールですが、絶対的な真実ではありません。コードカバレッジの結果は表面的に派手ですが、理解して調整する必要があります。

コードカバレッジツールは、全体の話をするのに手間がかかりません。ほとんどの場合、テスト実行中のある時点で一連のコードが実行されたことがわかります。それらの行は、コードの塊を介してすべての可能なコードパス上で実行されたかどうかを教えてくれません。理由の一部は、追加のif文ごとにコードパス置換の数が指数関数的に増加するためです。その程度の成長は管理が難しく、視覚化するのは難しいです。

は、このコードを考えてみましょう:

public class Class1 
{ 
    public static void foo(bool a, bool b) 
    { 
     int x = 100; 
     if (a) 
      Console.WriteLine("statement a"); 
     else 
      x -= 50; 

     if (b) 
      Console.WriteLine("statement c"); 
     else 
      x -= 50; 

     double y = 10/x; 
    } 
} 

[TestClass] 
public class UnitTest1 
{ 
    [TestMethod] 
    public void TestMethod1() 
    { 
     Class1.foo(true, true); 
     Class1.foo(true, false); 
     Class1.foo(false, true); 
    } 
} 

コードカバレッジは、このコードスニペットのすべての行は、あなたのユニットテストで行使されていることを教えてくれます。

おめでとうございます! 100%コードカバレッジバッジを達成しました。ああ、ところで、コードにはクラッシュバグが残っています。

単体テストがスニペット内のすべてのコード行を実行したという点で、カバレッジ結果は正しいです。しかし、それは完全な真実ではありません。同じ実行コンテキスト内の両方のelse節を通過する(a、b)=(false、false)のコードパスは単体テストでは実行されませんでした。そしてそれは実世界で実行時にエラーゼロによる除算を引き起こす1つのパスです。

私が間違ってはいけない - ユニットテストはサメタンクで遊ぶ前にあなたの仕事を正確にチェックするために不可欠です。コードカバレッジ分析は、あなたのコードのどの部分が今までにの光を見たことがないかを素早く判断する非常に強力なツールです。リリース前にもう少し注意を払う必要があります。

これらのツールを使用して、その結果を慎重に検討し、うまく対応します。

0

あなたの質問は少し奇妙です。

コードカバレッジは、特定の実行時に実行されるコードの量を示す基準です。通常、人々は単体テストの品質を評価するための基準としてコードカバレッジを使用します。この場合、カバーされていないコードはテストされていないコードと同じです。だから誰もがここで100%を見たいと思っています。あなたがPremiumまたはUltimateを持っている場合は、あなたの場合は

あなたは、VS2010で直接同じ目的でコードカバレッジを使用することができます:あなたはUIのように、テストの他のタイプを使用する場合がありますASP.NETアプリケーションの場合http://msdn.microsoft.com/en-us/library/ms243186.aspx

VS2010で(部分的に)生成して実行することも可能なテスト(Webフォーム用)、負荷テストなどが含まれます。

2

私の意見では、コードのカバレッジは、単体テストを行う際の誤解を招くメトリックです。高いカバレッジは、あなたが良い単体テストを持っているとは言いません。実際には何もテストすることなく、100%のカバレッジを持つことは非常に簡単です。また、興味深いカバレッジをunittestingするには支店のカバレッジがありますが、ほとんどのツールはラインカバレッジを提供します。

代わりに行うべきことは、TDDが正しく行われたかどうかを自分自身に知らせることです。適切なTDDを使用すると、単体テストが得られます。また、あなたは非常に良好なカバレッジを持っていることを測定せずに知ることができます。

0

このテストでは、あなたの機能とコードカバレッジに自信を持ってテストに自信を持たせることができます。もちろん、コードカバレッジが向上すれば、信頼性が向上します。

しかし、ビジネスを満たしていない機能については、この自信を覚えますが、予期しない例外を除いて爆破しませんあなたのコードについて

+0

ユニットテストで例外をチェックするだけでいいですか?私は、単体テストが何であるかについてはかなり間違っていると思います。 – svick

+0

申し訳ありませんが、私は正しい言葉を忘れました。これはおそらく英語が母国語ではないからです。とにかく、すべてのコンパイル時エラーをカバーするアプリケーションを構築すると、単体テストはすべての実行時エラーをカバーします既存のコードカバレッジ率として使用します。私はちょうどあなたのアプリケーションを意味しないコードカバレッジの高い割合が素晴らしいことを強調したい、それはそれです:-) –

関連する問題