一貫して、コードカバレッジは、ユニットテストでは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つのパスです。
私が間違ってはいけない - ユニットテストはサメタンクで遊ぶ前にあなたの仕事を正確にチェックするために不可欠です。コードカバレッジ分析は、あなたのコードのどの部分が今までにの光を見たことがないかを素早く判断する非常に強力なツールです。リリース前にもう少し注意を払う必要があります。
これらのツールを使用して、その結果を慎重に検討し、うまく対応します。
ユニットテストで例外をチェックするだけでいいですか?私は、単体テストが何であるかについてはかなり間違っていると思います。 – svick
申し訳ありませんが、私は正しい言葉を忘れました。これはおそらく英語が母国語ではないからです。とにかく、すべてのコンパイル時エラーをカバーするアプリケーションを構築すると、単体テストはすべての実行時エラーをカバーします既存のコードカバレッジ率として使用します。私はちょうどあなたのアプリケーションを意味しないコードカバレッジの高い割合が素晴らしいことを強調したい、それはそれです:-) –