Как смоделировать сбой сети для целей тестирования (в C #)? - PullRequest
24 голосов
/ 24 января 2009

Я создаю то, что можно назвать DAL для нового приложения. К сожалению, сетевое подключение к базе данных является реальной проблемой.

Я хотел бы иметь возможность временно блокировать доступ к сети в рамках моего теста, чтобы я мог гарантировать, что мой DAL ведет себя так, как ожидается в этих обстоятельствах.

ОБНОВЛЕНИЕ: Есть много способов вручную отключить сеть, но было бы неплохо, если бы я мог включить / отключить сам тест.

Ответы [ 11 ]

11 голосов
/ 24 января 2009

В настоящее время я просто "отключаю" сеть, устанавливая фиктивный статический 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);
            }
        }
    }
}
5 голосов
/ 24 января 2009

Если вы пытаетесь полностью отключить сеть для своего приложения, отсоедините сетевой кабель. Иногда у вас может быть слой доступа к данным с несколькими источниками данных (на разных компьютерах), и в этом случае вы можете смоделировать исключение в ваших тестах с помощью Mock Framework, например, 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");        
}
5 голосов
/ 24 января 2009

Напишите оболочку для используемого вами класса подключения сетевого класса (например, WebClient) с включенным-выключенным переключателем :)

Либо так, либо заблокируйте ваше приложение в брандмауэре.

4 голосов
/ 24 января 2009

Попробуйте заблокировать соединение с брандмауэром в середине сеанса, может быть?

Мне также нравится идея обёртки, но это своего рода абстракция проблемы, и вы, возможно, не получите точного поведения в реальном мире. Кроме того, вставка слоя-обертки и последующее его удаление может быть более проблематичным, чем его стоимость.

Редактировать : Запустить сценарий, который включает или выключает сетевой адаптер случайно или через заданные интервалы?

3 голосов
/ 16 августа 2016

Попробуйте Toxiproxi, он может симулировать отключение сети.

У них есть REST API и даже .NET Client API для программного изменения симуляции сети (из вашего тестового кода) https://github.com/shopify/toxiproxy

2 голосов
/ 22 января 2014

Только что нашли альтернативу, позволяющую напрямую закрывать TCP-соединения:

http://lamahashim.blogspot.ch/2010/03/disabling-network-using-c.html

Он основан на Windows IP Helper API (использует DllImport): http://msdn.microsoft.com/en-us/library/windows/desktop/aa366073(v=vs.85).aspx

2 голосов
/ 24 января 2009

Зависит от того, какую конкретную проблему сети вы хотите смоделировать. Для большинства людей это так же просто, как «недоступность сервера», в этом случае вы просто попытаетесь подключиться к несуществующему серверу. Будьте осторожны, потому что вы хотите что-то, что маршрутизируется, но не отвечает. Попытка подключиться к dkjdsjk.com сразу не удастся (поиск DNS), но попытка подключиться к www.google.com:1433 (вероятно) истечет время ожидания из-за брандмауэра - именно так ваше приложение будет вести себя, когда ваш сервер БД работает вниз.

2 голосов
/ 24 января 2009

Возможно, это не полезно для симуляции "реальных" проблем с сетью, но вы можете просто указать строку подключения к БД на несуществующей машине, находясь в рамках вашего теста.

2 голосов
/ 24 января 2009

Существует инструмент, который вы можете использовать для моделирования высокой задержки и низкой пропускной способности при тестировании приложений баз данных, как описано в этой записи в блоге .

2 голосов
/ 24 января 2009

Ищите симулятор WAN, который позволит вам ограничить пропускную способность (и полностью ее обрезать). Мне всегда интересно наблюдать, как меняется пользовательский интерфейс, когда мои приложения работают в среде с ограниченной пропускной способностью. Посмотрите здесь для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...