27

新しいアプリの DAL と呼ばれるものを構築しています。残念ながら、データベースへのネットワーク接続は実際の問題です。

テストの範囲内でネットワーク アクセスを一時的にブロックして、そのような状況で DAL が期待どおりに動作することを確認できるようにしたいと考えています。

更新: ネットワークを手動で無効にする方法はたくさんありますが、テスト自体で有効/無効にできれば便利です。

4

11 に答える 11

12

とりあえず、次のように偽の静的IPを設定して、ネットワークを「無効」にしているだけです。

using System.Management;

class NetworkController
{

    public static void Disable()
    {
        SetIP("192.168.0.4", "255.255.255.0");
    }

    public static void Enable()
    {
        SetDHCP();
    }


    private static void SetIP(string ip_address, string subnet_mask)
    {
        ManagementClass objMC = new ManagementClass("Win32_NetworkAdapterConfiguration");
        ManagementObjectCollection objMOC = objMC.GetInstances();

        foreach (ManagementObject objMO in objMOC) {
            if ((bool)objMO("IPEnabled")) {
                try {
                    ManagementBaseObject setIP = default(ManagementBaseObject);
                    ManagementBaseObject newIP = objMO.GetMethodParameters("EnableStatic");

                    newIP("IPAddress") = new string[] { ip_address };
                    newIP("SubnetMask") = new string[] { subnet_mask };

                    setIP = objMO.InvokeMethod("EnableStatic", newIP, null);
                }
                catch (Exception generatedExceptionName) {
                    throw;
                }
            }


        }
    }

    private static void SetDHCP()
    {
        ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
        ManagementObjectCollection moc = mc.GetInstances();

        foreach (ManagementObject mo in moc) {
            // Make sure this is a IP enabled device. Not something like memory card or VM Ware
            if ((bool)mo("IPEnabled")) {
                ManagementBaseObject newDNS = mo.GetMethodParameters("SetDNSServerSearchOrder");
                newDNS("DNSServerSearchOrder") = null;
                ManagementBaseObject enableDHCP = mo.InvokeMethod("EnableDHCP", null, null);
                ManagementBaseObject setDNS = mo.InvokeMethod("SetDNSServerSearchOrder", newDNS, null);
            }
        }
    }
}
于 2009-01-23T23:25:22.027 に答える
6

オン/オフ スイッチを使用して、使用しているネットワーク クラス接続クラス (WebClient など) にラッパーを記述します :)

それか、ファイアウォールでアプリケーションをブロックします。

于 2009-01-23T22:15:01.137 に答える
5

アプリケーションのネットワークを完全に停止しようとしている場合は、ネットワーク ケーブルを抜いても問題ありません。場合によっては、(異なるマシン上に) 複数のデータ ソースを持つデータ アクセス レイヤーがある場合があります。この場合、Rhino Mocks のようなモック フレームワークを使用して、テストで例外をシミュレートできます。これは、テストに含まれる可能性のある疑似コードです。

void TestUserDBFailure()
{
    // ***** THIS IS PSEUDO-CODE *******
    //setting up the stage - retrieval of the user info create an exception
    Expect.Call(_userRepository.GetUser(null))
       .IgnoreArguments()
       .Return(new Exception());

    // Call that uses the getuser function, see how it reacts
    User selectedUser = _dataLoader.GetUserData("testuser", "password");        
}
于 2009-01-23T22:47:29.607 に答える
4

セッションの途中でファイアウォールとの接続をブロックしてみてください。

ラッパーのアイデアも気に入っていますが、それは問題を抽象化するものであり、実際の動作が正確に得られない可能性があります。また、ラッパー層を挿入してから削除することは、その価値よりも面倒な場合があります。

編集:ネットワークアダプターをランダムにまたは設定された間隔でオン/オフするスクリプトを実行しますか?

于 2009-01-23T22:12:39.020 に答える
3

「実際の」ネットワークの問題をシミュレートするのにはおそらく役立ちませんが、テストの範囲内で、DB接続文字列を存在しないマシンに向けることができます。

于 2009-01-23T23:24:26.863 に答える
3

Toxiproxi を試してみてください。ネットワークの停止をシミュレートできます。

ネットワークシミュレーションをプログラムで変更するためのREST APIと.NETクライアントAPIさえあります(テストコードから) https://github.com/shopify/toxiproxy

于 2016-08-16T17:49:04.777 に答える
2

このブログ エントリで説明されているように、データベース アプリケーションのテストで高レイテンシと低帯域幅をシミュレートするために使用できるツールがあります。

于 2009-01-23T22:47:25.910 に答える
2

シミュレートする特定のネットワークの問題によって異なります。ほとんどの人にとって、それは「サーバーに到達できない」のと同じくらい簡単です。その場合、存在しないサーバーに接続しようとするだけです。ただし、ルーティング可能であるが応答しないものが必要なため、注意してください。dkjdsjk.com に接続しようとするとすぐに失敗します (DNS ルックアップ) が、www.google.com:1433 に接続しようとすると (おそらく) ファイアウォールが原因でタイムアウトになります。下。

于 2009-01-23T23:53:02.063 に答える
2

帯域幅を制限できる (そして完全に遮断できる) WAN シミュレーターを探してください。帯域幅が制限された環境でアプリを実行すると、ユーザー エクスペリエンスがどのように変化するかを見るのはいつも興味深いことです。いくつかの情報については、こちらをご覧ください。

于 2009-01-23T22:22:25.833 に答える
0

モックオブジェクトを使用して、本物(この場合はデータベース)の構成可能で破壊可能なバージョンを作成します。

于 2009-01-23T23:15:21.437 に答える