Как протестировать несколько браузеров с селеном и один набор NUnit и сохранить его СУХИМ? - PullRequest
9 голосов
/ 28 января 2011

Я ищу способ повторно использовать один набор тестов NUnit без дублирования всего набора для каждого браузера.Кажется, мне нужно новое приспособление для каждого браузера.Могу ли я отправить какую-либо переменную среды или параметр конфигурации из графического интерфейса 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 ]

6 голосов
/ 02 ноября 2011

NUnit 2.5+ поддерживает Generic Test Fixtures, которые делают тестирование в нескольких браузерах очень простым. http://www.nunit.org/index.php?p=testFixture&r=2.5

Построение следующего создаст два NUnit-теста «GoogleTest», один для 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();
        }
    }
}
4 голосов
/ 28 января 2011

Хороший вопрос, многие сталкиваются с этой проблемой.Я фанат внедрения моего браузера в тестовый набор с использованием контейнера IoC.Это позволяет мне поместить все настройки моего браузера в «мулд» для инъекций

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

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

Я уверен, что вы можете Google длялучше, чем я, но это некоторые ссылки DI и NUnit, которые я считал многообещающими.

Интеграционные тесты NUnit и внедрение зависимостей

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

Если вам не нравится DI, я слышал о людях, использующих фабричные методы для создания своего браузера на основе какой-то внешней настройки.

2 голосов
/ 04 декабря 2013

Вот пример модульного теста с использованием пользовательского 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;
    }
}

И браузер типа enum

public enum Type
{
    Firefox,
    GoogleChrome
}

Я бы посоветовал вам изменить имя перечисления с Type на другое ...

1 голос
/ 25 августа 2015

Я рекомендую важный вариант решения Люцифера.Пусть атрибут поставляет фабрику, а не драйвер, для методов 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;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...