2011-09-05 20 views
5

Uso de selenio y uso de mstest para controlarlo. Mi problema es que quiero que mi suite entera funcione contra 3 navegadores diferentes (IE, Firefox y Chrome).Ejecutar selenio contra varios navegadores con MSTEST

Lo que no puedo entender es cómo manejar mi prueba a nivel suite o cómo volver a ejecutar la suite con diferentes parámetros.

Sé que puedo agregar una fuente de datos a todas mis pruebas y hacer que la prueba individual se ejecute contra múltiples navegadores, pero entonces tendría que duplicar las 2 líneas para el origen de datos para cada prueba que no creo que sea muy buena solución.

¿Alguien sabe cómo puedo conducir datos mi inicio de ensamblaje? o si hay otra solución.

Respuesta

0

Esto es lo que hice. El beneficio de este enfoque es que funcionará para cualquier marco de prueba (mstest, nunit, etc.) y las pruebas en sí mismas no necesitan preocuparse ni saber nada sobre los navegadores. Solo necesita asegurarse de que el nombre del método solo aparezca una vez en la jerarquía de herencia. He utilizado este enfoque para cientos de pruebas y funciona para mí.

  1. Haga que todas las pruebas hereden de una clase de prueba base (por ejemplo, Prueba base).
  2. BaseTest mantiene todos los objetos del controlador (IE, FireFox, Chrome) en una matriz (multiDriverList en mi ejemplo a continuación).
  3. Hacer que los métodos siguientes en BaseTest:

    public void RunBrowserTest([CallerMemberName] string methodName = null) 
    {    
        foreach(IDriverWrapper driverWrapper in multiDriverList) //list of browser drivers - Firefox, Chrome, etc. You will need to implement this. 
        { 
         var testMethods = GetAllPrivateMethods(this.GetType()); 
         MethodInfo dynMethod = testMethods.Where(
           tm => (FormatReflectionName(tm.Name) == methodName) && 
            (FormatReflectionName(tm.DeclaringType.Name) == declaringType) && 
            (tm.GetParameters().Where(pm => pm.GetType() == typeof(IWebDriver)) != null)).Single(); 
         //runs the private method that has the same name, but taking a single IWebDriver argument 
         dynMethod.Invoke(this, new object[] { driverWrapper.WebDriver }); 
        } 
    } 
    
    //helper method to get all private methods in hierarchy, used in above method 
    private MethodInfo[] GetAllPrivateMethods(Type t) 
    { 
        var testMethods = t.GetMethods(BindingFlags.NonPublic | BindingFlags.Instance); 
        if(t.BaseType != null) 
        { 
         var baseTestMethods = GetAllPrivateMethods(t.BaseType); 
         testMethods = testMethods.Concat(baseTestMethods).ToArray(); 
        } 
        return testMethods; 
    } 
    
    //Remove formatting from Generic methods 
    string FormatReflectionName(string nameIn) 
    {    
        return Regex.Replace(nameIn, "(`.+)", match => ""); 
    } 
    
  4. uso de la siguiente manera:

    [TestMethod] 
    public void RunSomeKindOfTest() 
    { 
        RunBrowserTest(); //calls method in step 3 above in the base class 
    } 
    private void RunSomeKindOfTest(IWebDriver driver) 
    { 
        //The test. This will be called for each browser passing in the appropriate driver in each case 
        ...    
    }  
    
0

Para ello, escribimos una envoltura alrededor de WebDriver y se utiliza una sentencia switch basada en una propiedad para seleccionar el tipo de navegador.

Aquí hay un fragmento. Utilizando las capacidades deseadas, puede indicar a la cuadrícula qué navegadores ejecutar.

switch (Controller.Instance.Browser) 
      { 
       case BrowserType.Explorer: 
        var capabilities = DesiredCapabilities.InternetExplorer(); 
        capabilities.SetCapability("ignoreProtectedModeSettings", true); 
        Driver = new ScreenShotRemoteWebDriver(new Uri(uri), capabilities, _commandTimeout); 
        break; 
       case BrowserType.Chrome: 
        Driver = new ScreenShotRemoteWebDriver(new Uri(uri), DesiredCapabilities.Chrome(), _commandTimeout); 
        break; 
      } 
Cuestiones relacionadas