2011-09-05 18 views
5

Im usando selenio e usando mstest per guidarlo. Il mio problema è che voglio che la mia intera suite funzioni su 3 diversi browser (IE, Firefox e Chrome).Esecuzione selenio contro più browser con MSTEST

Quello che non riesco a capire è come i dati guidano il mio test a livello di suite o come rieseguire la suite con parametri diversi.

So di poter aggiungere un'origine dati a tutti i miei test e far eseguire il test individuale su più browser, ma poi dovrei duplicare le 2 righe per l'origine dati per ogni singolo test che non penso sia molto buona soluzione.

Quindi qualcuno sa come posso inizializzare i dati del mio assembly? o se c'è un'altra soluzione.

risposta

0

Questo è quello che ho fatto. Il vantaggio di questo approccio è che funzionerà per qualsiasi framework di test (mstest, nunit, ecc.) E che i test stessi non devono preoccuparsi o sapere nulla dei browser. Devi solo assicurarti che il nome del metodo si presenti solo una volta nella gerarchia dell'ereditarietà. Ho usato questo approccio per centinaia di test e funziona per me.

  1. Tutti i test ereditano da una classe di test di base (ad esempio BaseTest).
  2. BaseTest mantiene tutti gli oggetti del driver (IE, FireFox, Chrome) in un array (MultiDriverList nel mio esempio di seguito).
  3. hanno i seguenti metodi in 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. Usa come segue:

    [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

Per fare questo, abbiamo scritto un wrapper WebDriver e usiamo un'istruzione switch basata su una proprietà per selezionare il tipo di browser.

Ecco uno snippet. Usando le DesiredCapabilities, puoi dire a quale griglia eseguire i browser.

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; 
      } 
Problemi correlati