2017-06-19 57 views
2

我正在尋找一點幫助理解NUnit與Visual Studio中的C#和Selenium一起使用。Nunit參數化與C#和Selenium

我已經構建了一套測試,其中很多測試都是通過自學習和YouTube視頻拼湊在一起的。

該項目過去只需要進行一系列針對多個瀏覽器中的單個站點運行的迴歸測試。

我已經實現了這一點,我對結果很滿意。

我想現在要做的是擴大我一直在測試對這種遠一點

該產品是reskinned爲不同的客戶,其中的內容99%是同一個網站。

我不想在visual studio中創建多個項目/解決方案,而是希望做一些更有活力的事情來覆蓋對不同皮膚的迴歸。

我想要做的是參數化測試用例/瀏覽器/網址組合,例如

  • TestCase1 /鍍鉻/站點1
  • TestCase1 /鍍鉻/站點2
  • TestCase1/EDGE /站點1
  • TestCase1/EDGE /站點2等

我已經能夠得到Visual Studio測試資源管理器識別參數,但由於某種原因,它似乎產生了意想不到的結果,例如

  • TestCase1 /站點1
  • testcase1 /鉻
  • TestCase1 /站點2
  • TestCase1 /邊緣/等。

我見過論壇,他們討論的是使用NUnit參數做類似於我在說的內容,但一直沒有能夠產生想要的結果。

我認爲這只是簡單地添加另一個NUnit嬰兒車並傳遞它,就像我以前那樣。這裏是一個slimmed down版目前我使用的代碼:

namespace AutomationStuffs.SmokeTests 
{ 
    [TestFixture] 
    public class LoginTests : TestBase 
    { 
     [Test] 
     [TestCaseSource(typeof(TestBase), "BrowserToRunWith")] 
     public void FirstTimeLogin(String BrowserName, String Url) 
     { 
      //Browser Driver Setup For test 
      Setup(BrowserName); 

      //...DO SOME TESTING THINGS 
     } 
    } 
} 

namespace AutomationStuffs.Utilities 
{ 
    public class TestBase 
    { 
     public static IWebDriver driver; 

     public void Setup(String BrowserName) 
     { 
      Driver.Intialize(BrowserName); 
      //... DO SOME SETUP STUFF 
      LoginPage.GoTo(); 
      //..I DO SOME LOGIN SETUP HERE 
     } 


     public static IEnumerable<String> BrowserToRunWith() 
     { 
      String[] browsers = BrowsersList.theBrowserList.Split(','); 
      foreach (String b in browsers) 
      { 
       yield return b; 
      } 
     } 
    } 
} 


namespace AutomationStuffs.Pages 
{ 
    public class LoginPage 
    { 
     public static void GoTo() 
     { 
      Driver.Instance.Navigate().GoToUrl(Driver.baseURL); 
     } 
    } 
} 


namespace AutomationStuffs.Selenium 
{ 
    public class Driver 
    { 
     public static IWebDriver Instance { get; set; } 
     public static string baseURL 
     { 
      get 
      { 
       string url = System.Configuration.ConfigurationManager.AppSettings["BaseUrl"]; 
       return url; 
      } 
     } 

     public static string chromeDriver 
     { 
      get 
      { 
       string driver = System.Configuration.ConfigurationManager.AppSettings["ChromeDriver"]; 
       driver = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, driver); 
       return driver; 
      } 
     } 

     public static string ieDriver 
     { 
      get 
      { 
       string driver = System.Configuration.ConfigurationManager.AppSettings["IEDriver"]; 
       driver = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, driver); 
       return driver; 
      } 
     } 


     public static string edgeDriver 
     { 
      get 
      { 
       string driver = System.Configuration.ConfigurationManager.AppSettings["EdgeDriver"]; 
       driver = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, driver); 
       return driver; 
      } 
     } 

     public static void Intialize(String BrowserName) 
     { 
      String DRIVER_PATH = chromeDriver; 
      String DRIVER_PATH_IEFF = ieDriver; 
      String DRIVER_PATH_EDGE = edgeDriver; 

      var optionsChrome = new ChromeOptions(); 
      optionsChrome.AddArgument("start-maximized"); 
      optionsChrome.AddArgument("no-sandbox"); 

      var optionsIe = new InternetExplorerOptions(); 

      if (BrowserName.Equals("ie")) 
      { 
       Instance = new InternetExplorerDriver(DRIVER_PATH_IEFF); 
       Instance.Manage().Window.Maximize(); 
      } 
      else if (BrowserName.Equals("firefox")) 
      { 
       Instance = new FirefoxDriver(); 
       Instance.Manage().Window.Maximize(); 
      } 
      else if (BrowserName.Equals("edge")) 
      { 
       Instance = new EdgeDriver(DRIVER_PATH_EDGE); 
       Instance.Manage().Window.Maximize(); 
      } 
      else 
      { 
       Instance = new ChromeDriver(DRIVER_PATH, optionsChrome); 
      } 
     } 
    } 
} 

以下是我認爲我必須做的(很顯然只是複製和適應的基本方法,在適當情況下):

namespace AutomationStuffs.SmokeTests 
{ 
    [TestFixture] 
    //[Parallelizable] 
    public class LoginTests : TestBase 
    { 
     [Test] 
     [TestCaseSource(typeof(TestBase), "BrowserToRunWith")] 
     [TestCaseSource(typeof(TestBase), "URLToRunWith")] 
     public void FirstTimeLogin(String BrowserName, String Url) 
     { 
      //Browser Driver Setup For test 
      Setup(BrowserName); 

      Assert.IsTrue(FiveComponentsAndDocStorePage.AssertOnThePage()); 
     } 
    } 
} 

回答

2

NUnit單獨處理每個TestCaseSource,它將創建BrowserToRunWith的測試用例,並且僅在此之後纔會爲URLToRunWith執行測試用例。如果您嘗試運行它,你會得到

結果消息:數量的參數錯誤提供

要爲你需要在一起發送到TestCaseSource兩個參數創建測試用例。你可以這樣做

public static IEnumerable TestData 
{ 
    get 
    { 
     string[] browsers = BrowsersList.theBrowserList.Split(',') 
     string[] urls = UrlsList.theUrlList.Split(',') 

     foreach (string browser in browsers) 
     { 
      foreach (string url in urls) 
      { 
       yield return new TestCaseData(browser, url); 
      } 
     } 
    } 
} 

或者使用LINQ

public static IEnumerable TestData 
{ 
    get 
    { 
     string[] browsers = BrowsersList.theBrowserList.Split(',') 
     string[] urls = UrlsList.theUrlList.Split(',') 

     return from browser in browsers 
       from url in urls 
       select new TestCaseData(browser, url); 
    } 
} 

而且TestCaseSource看起來像

[TestCaseSource(typeof(AAA), "TestData")] 
+0

這是答案!非常感謝。我的印象很不正確,我只能再次通過TestCaseSource值,NUnit做了一些魔術 - 顯然,我錯了哈哈哈。 – saab613

1

@Guy的回答是完全正確 - 我上投它。

爲了完整起見,這裏是另一種編寫測試的方法,當你認爲NUnit會「做一些魔術」時,這可能就是你想到的。

[Test] 
    public void FirstTimeLogin(
     [ValueSource("BrowserToRunWith")] String BrowserName, 
     [ValueSource("UrlToRunWith")] String Url) 
    { 
     //Browser Driver Setup For test 
     Setup(BrowserName); 

     Assert.IsTrue(FiveComponentsAndDocStorePage.AssertOnThePage()); 
    } 

的ValueSource成員將類似於你已經擁有,但將各自返回string而非TestCaseData實例。

請注意,在這種情況下需要[Test]屬性。在原始示例中它是可選的(並且醜陋,IMO!)。 :-)

+0

這對了解情況非常有用。這次真是萬分感謝。 – saab613