try / catchブロックをテストする例外を引き起こすイベントをシミュレートする方法は?


14

例外がどのように動作し、C#で例外をキャッチして処理する方法を理解していますが、例外が正しくキャッチされることを保証するために例外を引き起こす可能性のあるイベントをシミュレートするにはどうすればよいですか?たとえば、ネットワークの問題、データベースの問題などをシミュレートできるようなテストベッドのようなアプリケーションを実行できますか?例外はその性質上、再現するのが難しいように思われるため、コードで確実に対処できるようにすることは困難です。

私は主にC#/。NET / Visual Studioを使用して開発していますが、他の言語に関連する回答やリソースが役立つ場合があります。


:もう1つの可能な解決策は、このMSDNの資料に記載されているTestApiと故障注入テスト
ジョルジ

回答:


13

1)依存性注入モデルに従った場合、特定の部分の実際の実装を、必要に応じて例外をスローするモックに置き換えることができます。ただし、最初に特定の方法でアプリケーションを設計するか、完全にリエンジニアリングする必要があります。

お気に入り:

public class SqlUsersRepository : IUsersRepository
{
    public void RegisterNewUser (User newUser)
    {
        throw new SqlException ("Connection timeout");
    }
}

ただし、ここでは、コンシューマコードが具体的な実装例外の処理に関与してはならないという問題があります。

2)別のアプローチは、特定のメソッド呼び出しをカスタムラッパーに置き換えることです。

の代わりに:

FileStream fs = File.OpenRead (path);

あなたが使う:

FileStream fs = File.OpenRead_Test (path);

カスタム拡張メソッドを提供することにより(簡単なアイデア):

public static FileStream OpenRead_Test (this System.IO.File file, string path)
{
    throw new FileNotFoundException ();
}

3

モックフレームワークを調べる必要があります。

これらを使用して、実際のデータベースではなく、依存性注入を使用して偽のデータベース(たとえば)を呼び出します。つまり、コールごとに返されるものを完全に制御できます。

次に、呼び出されたときに目的の例外を単にスローするテストを設定します。

public void Test1()
{
    throw new NullArgumentException();
}

コードがこれを正しく処理すると、テストに合格します。


3

モックとインジェクションは、これまでのところあなただけを取得することができ、場合によってはアプローチの大きな変更を必要とします。

テストフレームワークに合わせてアプリを再設計したくない場合、本当に必要なのは、エラーが発生したホストまたは環境です。停止したネットワークの速度低下をシミュレートする方法は多数あります(Microsoftのテストツールでさえ、Webテスト領域でこれを少し持っています)。データベースセットと連携してシミュレーションを変更し、データベースが生成するエラーを変更するスクリプトを変更するために、改ざん可能なルーターの後ろにマシンを配置することで、私は最高の成功を収めました。

それでさえ、あなたがハードウェアに向かって十分に速くまたは十分に下に行くならば、あなたはほとんどあなたがシミュレートできない同時実行性の問題と遅延書き込み失敗のようなエラーがあります。時には、それらを実際に引き起こさなければならないこともあれば、セーフティネットなしで作業しなければならないこともあります。


同意-場合によっては、たとえば、リリースコードへの依存性注入によるオーバーヘッドを払う余裕がない場合があります。日常的な問題ではありませんが、起こる可能性があります。
Steve314
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.