新しいアプリの DAL と呼ばれるものを構築しています。残念ながら、データベースへのネットワーク接続は実際の問題です。
テストの範囲内でネットワーク アクセスを一時的にブロックして、そのような状況で DAL が期待どおりに動作することを確認できるようにしたいと考えています。
更新: ネットワークを手動で無効にする方法はたくさんありますが、テスト自体で有効/無効にできれば便利です。
新しいアプリの DAL と呼ばれるものを構築しています。残念ながら、データベースへのネットワーク接続は実際の問題です。
テストの範囲内でネットワーク アクセスを一時的にブロックして、そのような状況で DAL が期待どおりに動作することを確認できるようにしたいと考えています。
更新: ネットワークを手動で無効にする方法はたくさんありますが、テスト自体で有効/無効にできれば便利です。
とりあえず、次のように偽の静的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);
}
}
}
}
オン/オフ スイッチを使用して、使用しているネットワーク クラス接続クラス (WebClient など) にラッパーを記述します :)
それか、ファイアウォールでアプリケーションをブロックします。
アプリケーションのネットワークを完全に停止しようとしている場合は、ネットワーク ケーブルを抜いても問題ありません。場合によっては、(異なるマシン上に) 複数のデータ ソースを持つデータ アクセス レイヤーがある場合があります。この場合、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");
}
セッションの途中でファイアウォールとの接続をブロックしてみてください。
ラッパーのアイデアも気に入っていますが、それは問題を抽象化するものであり、実際の動作が正確に得られない可能性があります。また、ラッパー層を挿入してから削除することは、その価値よりも面倒な場合があります。
編集:ネットワークアダプターをランダムにまたは設定された間隔でオン/オフするスクリプトを実行しますか?
「実際の」ネットワークの問題をシミュレートするのにはおそらく役立ちませんが、テストの範囲内で、DB接続文字列を存在しないマシンに向けることができます。
Toxiproxi を試してみてください。ネットワークの停止をシミュレートできます。
ネットワークシミュレーションをプログラムで変更するためのREST APIと.NETクライアントAPIさえあります(テストコードから) https://github.com/shopify/toxiproxy
このブログ エントリで説明されているように、データベース アプリケーションのテストで高レイテンシと低帯域幅をシミュレートするために使用できるツールがあります。
シミュレートする特定のネットワークの問題によって異なります。ほとんどの人にとって、それは「サーバーに到達できない」のと同じくらい簡単です。その場合、存在しないサーバーに接続しようとするだけです。ただし、ルーティング可能であるが応答しないものが必要なため、注意してください。dkjdsjk.com に接続しようとするとすぐに失敗します (DNS ルックアップ) が、www.google.com:1433 に接続しようとすると (おそらく) ファイアウォールが原因でタイムアウトになります。下。
帯域幅を制限できる (そして完全に遮断できる) WAN シミュレーターを探してください。帯域幅が制限された環境でアプリを実行すると、ユーザー エクスペリエンスがどのように変化するかを見るのはいつも興味深いことです。いくつかの情報については、こちらをご覧ください。
モックオブジェクトを使用して、本物(この場合はデータベース)の構成可能で破壊可能なバージョンを作成します。