2011-01-27 1 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. Это позволяет мне установить всю конфигурацию моего браузера в инъекции «mudule»

Я использую привязки Java и Guice в качестве контейнера IoC, но принципы одинаковы в .Net. Вы хотите получить поле DefaultSelnium в своем классе, которое будет введено. Затем ваши тесты используют этот объект и удаляют его, когда они будут сделаны. Вы можете обнаружить, что можете сразу вставить его, или вам может понадобиться создать объект в методе настройки. Несколько вещей, на которые вы должны обратить внимание, в зависимости от структуры вашего оборудования:

  • Являются ли ваши тестовые классы новыми для каждого теста? JUnit создает новый экземпляр тестового класса для каждого запускаемого теста. TestNG классно справился с этим повторным использованием объектов класса тестов для каждого содержащегося теста. Проблема повторного использования - ваш инъецированный экземпляр DefaultSelenium карился для езды, что может привести к проблемам, если ваши тесты выполняются параллельно или изменить состояние браузера.
  • Lazy Загрузите объект вашего браузера Если ваш инструмент тестирования модулей загружает все классы тестов сразу с места в карьер, он попытается создать объекты браузера впереди, что довольно ресурсоемкое.

Я уверен, что вы можете использовать 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); 
    } 
} 

Вот обычай DataAttribute

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

рекомендую важное изменение на решение Люцифера. Имейте атрибут поставлять фабрику, а не драйвер, методам Fact/Theory. Зачем? Ну, когда вы увидите всплывающие окна всех этих браузеров (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(); 
     } 
    } 
} 

Обновлено DataAttribute ... (Обратите внимание, я исправил подпись метода 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; 
     } 
    } 
} 
Смежные вопросы