2009-01-23 9 views
20

Estoy creando lo que podría llamarse el DAL para una nueva aplicación. Desafortunadamente, la conectividad de red a la base de datos es un problema real.¿Cómo se simula la falla de la red para propósitos de prueba (en C#)?

Me gustaría poder bloquear temporalmente el acceso a la red dentro del alcance de mi prueba para poder garantizar que mi DAL se comporte como se espera bajo esas circunstancias.

ACTUALIZACIÓN: hay muchas formas manuales de desactivar la red, pero seguro que sería bueno si pudiera activar/desactivar dentro de la prueba.

+0

posible que desee comprobar hacia fuera esta pregunta en las herramientas de red para simular conexiones lentas: http: // stackoverflow.com/questions/1094760/network-tools-that-simulate-slow-network-connection –

Respuesta

10

Por el momento, sólo estoy "desactivando" la red mediante el establecimiento de una dirección IP estática falsa de la siguiente manera:

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); 
      } 
     } 
    } 
} 
+0

¿cómo lo restableces? – whihathac

4

¿Intenta bloquear la conexión con un firewall a mitad de la sesión, tal vez?

También me gusta la idea de envoltorio, pero eso es un tipo de resumen del problema y es posible que no obtenga el comportamiento exacto en el mundo real. Además, insertar la capa de envoltura y luego quitarla puede ser más problemático que su valor.

Editar: ¿Ejecutar una secuencia de comandos que enciende/apaga el adaptador de red al azar o en intervalos establecidos?

5

Escribir un envoltorio a la clase conectividad clase de red que está utilizando (por ejemplo, cliente Web) con un interruptor de encendido y apagado :)

O eso, o bloquear su aplicación en el servidor de seguridad.

+0

Esta es una propuesta realmente interesante. ¿Conoces alguna forma de manejar esto de forma no intrusiva? (es decir, sin modificar el código?) ¿Cualquier envoltorio para la API de red Win32? – EFraim

2

Busque un simulador WAN que le permita restringir el ancho de banda (y cortarlo completamente) Siempre me parece interesante ver cómo cambia la experiencia del usuario cuando mis aplicaciones se ejecutan en un entorno de ancho de banda restringido. Mire here para alguna información.

2

Hay una herramienta que puede usar para simular alta latencia y bajo ancho de banda en la prueba de aplicaciones de base de datos como se explica en este blog entry.

5

Si está intentando una interrupción de red completa para su aplicación, desconectar el cable de red funcionará. A veces puede tener una capa de acceso a datos con múltiples orígenes de datos (en diferentes máquinas) en cuyo caso puede simular una excepción en sus pruebas con un Mock Framework como Rhino Mocks. Aquí hay alguna pseudo-código que puede tener en su prueba

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");   
} 
0

Use objetos simulados para crear versiones configurables, destructibles de la cosa real - en este caso, la base de datos.

2

Probablemente no sea útil para simular problemas de red "reales", pero podría apuntar su cadena de conexión DB a una máquina inexistente mientras esté dentro del alcance de su prueba.

+0

Acepto que una simple activación/desactivación no te lleva demasiado lejos al tratar con problemas de red "reales", pero es un punto de partida para probar lo que le sucede a la aplicación cuando la conectividad no funciona. – Larsenal

2

depende de qué problema particular de la red que desee simular. Para la mayoría de las personas, es tan simple como "servidor inalcanzable", en cuyo caso solo tratarías de conectarte a un servidor inexistente. Tenga cuidado, sin embargo, porque quiere algo que sea enrutable pero que no responda. Intentar conectarse a dkjdsjk.com fallará inmediatamente (búsqueda de DNS), pero al intentar conectar con www.google.com:1433 (probablemente) se agote el tiempo de espera debido a un firewall, que es la forma en que se comportará su aplicación cuando su servidor de base de datos esté abajo.

3

Trate Toxiproxi, se puede simular caída de la red.

Ellos tienen REST API e incluso API de cliente .NET para cambiar la simulación de la red mediante programación (de su código de prueba) https://github.com/shopify/toxiproxy

Cuestiones relacionadas