2011-01-27 71 views
9

我正在尋找一種方法來重用一個NUnit測試套件,而不需要爲每個瀏覽器重複整個套件。似乎我需要爲每個瀏覽器添加一個新的燈具。我可以從NUnit gui發送某種環境變量或配置設置來切換瀏覽器嗎?見下:如何使用硒和單個NUnit套件測試多個瀏覽器並保持乾燥?

[TestFixture] 
public class User 
{ 
    private ISelenium selenium; 
    private StringBuilder verificationErrors; 

    [SetUp] 
    public void SetupTest() 
    { 
     // TheBrowser = How do I populate this variable from the NUnit gui? 
     selenium = new DefaultSelenium("localhost", 4444, **TheBrowser**, "http://localhost:52251/"); 
     selenium.Start(); 
     verificationErrors = new StringBuilder(); 
    } 

    [TearDown] 
    public void TeardownTest() 
    { 
     ... 
    } 

    [Test] 
    public void SearchUser() 
    { 
     ... 
    } 

} 

回答

4

好問題,很多人遇到這個問題。我是使用IoC容器將我的瀏覽器注入到測試用例中的粉絲。這可以讓我把所有的瀏覽器配置注入一個「模塊」中。我使用Java綁定和Guice作爲我的IoC容器,但是.Net中的主體是相同的。你想在你的類中注入一個DefaultSelnium字段。你的測試然後使用這個對象並在完成後處置它。您可能會發現您可以立即注入它,或者您可能需要使用設置方法來創建對象。根據您的單元測試框架,您應該注意以下幾件事:

  • 您的測試類是否爲每個測試創建了新的? JUnit爲每個要運行的測試創建一個測試類的新實例。 TestNG着名地爲每個包含的測試廢除了這個重用測試類對象。重複使用的問題是,您的注入DefaultSelenium實例被兜了一圈,如果您的測試並行運行或更改瀏覽器狀態,則可能導致問題。
  • 懶惰載入您的瀏覽器對象如果您的單元測試工具立即加載所有測試類,它會嘗試創建瀏覽器對象,這是相當耗費資源的。

我敢肯定,你可以比自己更好的Google,但這些都是我認爲看起來很有前途的DI和NUnit鏈接。

NUnit integration tests and dependency injection

http://buildstarted.com/2010/08/24/dependency-injection-with-ninject-moq-and-unit-testing/

如果你不喜歡DI我聽說過使用工廠方法基於一些外部的設置來生成自己的瀏覽器的人。

5

NUnit 2.5+支持通用測試夾具,它使得在多個瀏覽器中進行測試非常簡單。 http://www.nunit.org/index.php?p=testFixture&r=2.5

構建以下內容將創建兩個「GoogleTest」NUnit測試,一個用於Firefox和一個用於IE。

using NUnit.Framework; 
using OpenQA.Selenium; 
using OpenQA.Selenium.Firefox; 
using OpenQA.Selenium.IE; 
using System.Threading; 

namespace SeleniumTests 
{ 
    [TestFixture(typeof(FirefoxDriver))] 
    [TestFixture(typeof(InternetExplorerDriver))] 
    public class TestWithMultipleBrowsers<TWebDriver> where TWebDriver : IWebDriver, new() 
    { 
     private IWebDriver driver; 

     [SetUp] 
     public void CreateDriver() { 
      this.driver = new TWebDriver(); 
     } 

     [Test] 
     public void GoogleTest() { 
      driver.Navigate().GoToUrl("http://www.google.com/"); 
      IWebElement query = driver.FindElement(By.Name("q")); 
      query.SendKeys("Bread" + Keys.Enter); 

      Thread.Sleep(2000); 

      Assert.AreEqual("bread - Google Search", driver.Title); 
      driver.Quit(); 
     } 
    } 
} 
2

這裏是使用定製的xUnit DataAttribute向駕駛員提供到測試

using OpenQA.Selenium; 
using SeleniumPageObjectsPatternExample.Attributes; 
using SeleniumPageObjectsPatternExample.PageObjects; 
using Xunit; 
using Xunit.Extensions; 

public class HomepageTests 
{ 
    [Theory] 
    [Browser(Type.Firefox)] 
    [Browser(Type.GoogleChrome)] 
    public void HomepageLinksToBlogPage(IWebDriver webDriver) 
    { 
     // arrange 
     var expected = "some expected value"; 

     // act 
     var homepage = new HomePage(webDriver, true); 

     // assert 
     Assert.True(homepage.BlogLink.Displayed); 
     Assert.Equal(expected, homepage.Header.Text); 
    } 
} 

這裏一個例子的單元測試是自定義數據屬性

using System.Reflection; 
using OpenQA.Selenium; 
using SeleniumPageObjectsPatternExample.WebDriver; 
using Xunit.Extensions; 

public class BrowserAttribute : DataAttribute 
{ 
    private IWebDriver WebDriver { get; set; } 

    public BrowserAttribute(Type browser) 
    { 
     this.WebDriver = WebDriverFactory.Create(browser); 
    } 

    public override IEnumerable<object[]> GetData(MethodInfo methodUnderTest, System.Type[] parameterTypes) 
    { 
     return new[] { new[] { this.WebDriver } }; 
    } 
} 

使用這種WebDriverFactory

using OpenQA.Selenium; 
using OpenQA.Selenium.Chrome; 
using OpenQA.Selenium.Firefox; 

using Type = SeleniumPageObjectsPatternExample.Attributes.Type; 

public class WebDriverFactory 
{ 
    public static IWebDriver Create(Type browser) 
    { 
     IWebDriver webDriver; 

     switch (browser) 
     { 
      case Type.Firefox: 
       webDriver = new FirefoxDriver(); 
       break; 
      case Type.GoogleChrome: 
       webDriver = new ChromeDriver(); 
       break; 
      default: 
       webDriver = new ChromeDriver(); 
       break; 
     } 

     webDriver.Manage().Window.Maximize(); 

     return webDriver; 
    } 
} 

和瀏覽器類型枚舉

public enum Type 
{ 
    Firefox, 
    GoogleChrome 
} 

我會建議你從類型改變枚舉的名稱到別的東西......

1

我建議對路西法的解決方案的一個重要變化。事實/理論方法有屬性提供工廠而不是驅動程序。爲什麼?那麼,當你看到所有這些瀏覽器窗口彈出時(n x m,其中n =測試次數,m =每次測試的瀏覽器),那麼您將決定只在測試實際進行時創建它們跑步。

因此與之前的解決方案,其中包括一些名稱的變化更新...

using OpenQA.Selenium; 
using SeleniumPageObjectsPatternExample.Attributes; 
using SeleniumPageObjectsPatternExample.PageObjects; 
using Xunit; 
using Xunit.Extensions; 

namespace SeleniumHelpers 
{  
    public class HomepageTests 
    { 
     [Theory] 
     [WebDriver(DriverType.Firefox)] 
     [WebDriver(DriverType.GoogleChrome)] 
     public void HomepageLinksToBlogPage(WebDriverFactory factory) 
     { 
      // arrange 
      IWebDriver webDriver = factory.Create(); // Browser starts here. 
      var expected = "some expected value"; 

      // act 
      var homepage = new HomePage(webDriver, true); 

      // assert 
      Assert.True(homepage.BlogLink.Displayed); 
      Assert.Equal(expected, homepage.Header.Text); 

      // Optional cleanup (better wrapped in try/finally for entire method). 
      webDriver.Quit(); 
      webDriver.Dispose(); 
     } 
    } 
} 

更新數據屬性...(請注意,我糾正了getData()方法的簽名與最新的xUnit工作。 )

using System.Reflection; 
using OpenQA.Selenium; 
using Xunit.Extensions; 

namespace SeleniumHelpers 
{  
    public class WebDriverAttribute : DataAttribute 
    { 
     private WebDriverFactory WebDriverFactory { get; set; } 

     public WebDriverAttribute(Type browser) 
     { 
      this.WebDriver = WebDriverFactory.Create(browser); 
     } 

     public override IEnumerable<object[]> GetData(MethodInfo methodUnderTest) 
     { 
      return new[] { new[] { this.WebDriverFactory } }; 
     } 
    } 
} 

新WebDriverFactory

using OpenQA.Selenium; 
using OpenQA.Selenium.Chrome; 
using OpenQA.Selenium.Firefox; 

namespace SeleniumHelpers 
{  
    public enum DriverType 
    { 
     Firefox, 
     GoogleChrome 
    } 

    public class WebDriverFactory 
    { 
     private DriverType _driverType; 
     public WebDriverFactory(DriverType driverType) 
     { 
      _driverType = driverType; 
     } 

     public static IWebDriver Create(Type browser) 
     { 
      IWebDriver webDriver; 

      switch (browser) 
      { 
       case Type.Firefox: 
        webDriver = new FirefoxDriver(); 
        break; 
       case Type.GoogleChrome: 
        webDriver = new ChromeDriver(); 
        break; 
       default: 
        webDriver = new ChromeDriver(); 
        break; 
      } 

      webDriver.Manage().Window.Maximize(); 

      return webDriver; 
     } 
    } 
} 
相關問題