Как я могу правильно передать webdriver при попытке запустить тесты параллельно?

Моя работа поручила нам написать фреймворк автоматизации, который включает в себя selenium webdriver с C # / nunit. В настоящее время мы используем nunit 3.0. Моя первоначальная идея заключалась в том, чтобы извлечь достаточно материала из фреймворка, чтобы командам, использующим фреймворк, не приходилось беспокоиться о таких вещах, как установка / отключение webdriver.

Мы решили пойти по пути создания тестового вспомогательного класса, у которого есть настройка / разборка, который будет создавать экземпляр драйвера на основе настроек конфигурации (хром, т. Д.), А затем разрывать его после каждого теста. Мы также добавили переменную драйвера защищенного класса, которая устанавливается при каждом вызове программы установки. Таким образом, каждый тестовый класс может расширить TestHelper и получить драйвер бесплатно.

Это отлично работает, когда мы не запускаем тесты параллельно, но как только мы начинаем выполнять параллельные тесты, драйвер каждый раз перезаписывается (что имеет смысл).

Мой вопрос: есть ли лучший способ сделать это, чтобы сохранить исходную идею наличия драйвера в TestHelper и исключить множество манипуляций с драйверами в самих тестах. Я действительно хочу, чтобы в каждом тесте не было объявлений / инициализаций драйверов, а просто оставались наборы тестов для тестирования конкретного кода.

Вот несколько тестовых классов, которые напоминают то, что происходит (на самом деле я не мог опубликовать производственный код, потому что работа по этому поводу забавна):

Вот мой тестовый вспомогательный класс:

using NUnit.Framework;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;

namespace AutomationTest
{
    class TestHelper
    {

        protected IWebDriver driver;

        [SetUp]
        public void startBrowser()
        {
            driver = new ChromeDriver("C:\\Users\\james\\Desktop");
        }

        [TearDown]
        public void closeBrowser()
        {
            driver.Close();
            driver.Quit();
        }
    }
}

А вот и мой тестовый класс (8 тестов только для проверки параллельного тестирования):

using NUnit.Framework;

namespace AutomationTest 
{
    [TestFixture]
    [Parallelizable(ParallelScope.All)]
    class ParallelTest : TestHelper
    {
        [Test]
        public void test1()
        {            
            driver.Navigate().GoToUrl("http://www.google.com");
            Assert.AreEqual(driver.Title, "Google", "Stuff didn't work");
        }

        [Test]
        public void test2()
        {            
            driver.Navigate().GoToUrl("http://www.google.com");
            Assert.AreEqual(driver.Title, "Google", "Stuff didn't work");
        }

        [Test]
        public void test3()
        {            
            driver.Navigate().GoToUrl("http://www.google.com");
            Assert.AreEqual(driver.Title, "Google", "Stuff didn't work");
        }

        [Test]
        public void test4()
        {            
            driver.Navigate().GoToUrl("http://www.google.com");
            Assert.AreEqual(driver.Title, "Google", "Stuff didn't work");
        }

        [Test]
        public void test5()
        {            
            driver.Navigate().GoToUrl("http://www.google.com");
            Assert.AreEqual(driver.Title, "Google", "Stuff didn't work");
        }

        [Test]
        public void test6()
        {           
            driver.Navigate().GoToUrl("http://www.google.com");
            Assert.AreEqual(driver.Title, "Google", "Stuff didn't work");
        } 

        [Test]
        public void test7()
        {            
            driver.Navigate().GoToUrl("http://www.google.com");
            Assert.AreEqual(driver.Title, "Google", "Stuff didn't work");
        }

        [Test]
        public void test8()
        {            
            driver.Navigate().GoToUrl("http://www.google.com");
            Assert.AreEqual(driver.Title, "Google", "Stuff didn't work");   
        }
    }
}

person user1818298    schedule 09.06.2018    source источник


Ответы (1)


using NUnit.Framework;

namespace AutomationTest 
{
class TestHelper
{

    //protected IWebDriver driver;
    protected void Browse(Action<IWebDriver> action)
    {
      var driver = new ChromeDriver("C:\\Users\\james\\Desktop");
      action(driver);
      driver.Close();
      driver.Quit();
    }
    [SetUp]
    public void startBrowser()
    {
        // driver = new ChromeDriver("C:\\Users\\james\\Desktop");
    }

    [TearDown]
    public void closeBrowser()
    {
        // driver.Close();
        // driver.Quit();
    }
}

[TestFixture]
[Parallelizable(ParallelScope.All)]
class ParallelTest : TestHelper
{
    [Test]
    public void test1()
    {   
        Browse( (driver) => {         
          driver.Navigate().GoToUrl("http://www.google.com");
          Assert.AreEqual(driver.Title, "Google", "Stuff didn't work");
        });
    }

    [Test]
    public void test2()
    {   
        Browse( (driver) => {                  
          driver.Navigate().GoToUrl("http://www.google.com");
          Assert.AreEqual(driver.Title, "Google", "Stuff didn't work");
        });
    }

    [Test]
    public void test3()
    {     
        Browse( (driver) => {                
          driver.Navigate().GoToUrl("http://www.google.com");
          Assert.AreEqual(driver.Title, "Google", "Stuff didn't work");
        });
    }

    [Test]
    public void test4()
    {     
        Browse( (driver) => {                
          driver.Navigate().GoToUrl("http://www.google.com");
          Assert.AreEqual(driver.Title, "Google", "Stuff didn't work");
        });
    }

    [Test]
    public void test5()
    {       
        Browse( (driver) => {              
          driver.Navigate().GoToUrl("http://www.google.com");
          Assert.AreEqual(driver.Title, "Google", "Stuff didn't work");
        });
    }

    [Test]
    public void test6()
    {     
        Browse( (driver) => {               
          driver.Navigate().GoToUrl("http://www.google.com");
          Assert.AreEqual(driver.Title, "Google", "Stuff didn't work");
        });
    } 

    [Test]
    public void test7()
    {     
        Browse( (driver) => {                
          driver.Navigate().GoToUrl("http://www.google.com");
          Assert.AreEqual(driver.Title, "Google", "Stuff didn't work");
        });
    }

    [Test]
    public void test8()
    {     
        Browse( (driver) => {                
          driver.Navigate().GoToUrl("http://www.google.com");
          Assert.AreEqual(driver.Title, "Google", "Stuff didn't work");   
        });
    }
}
}

Это создаст экземпляр нового драйвера для каждого теста, что нормально, поскольку вам нужны отдельные драйверы браузера и экземпляры браузера, чтобы ваши тесты выполнялись параллельно и не мешали.

person Cosmin Sontu    schedule 09.06.2018
comment
Спасибо, Космин! Я пытаюсь проверить это, но он кричит, потому что метод Browse ничего не возвращает. Я что-то упускаю? - person user1818298; 09.06.2018
comment
Отлично, спасибо, сэр :) Я отмечу это как ответ, как только выясню, как lol. - person user1818298; 09.06.2018
comment
Вы действительно собираетесь поместить 100 строк тестового кода в один вызов метода? Это будет кошмар для отладки и т. Д. - person JeffC; 09.06.2018
comment
В каком методе 100 строк? У меня он разделен на 2 класса: помощник по тестированию и класс фактического набора тестов. - person user1818298; 09.06.2018
comment
Если вы используете модель Page Object, ваш тестовый код распределяется по объектам вашей страницы, и ваши методы тестирования будут содержать основной поток оркестровки. Вы можете дополнительно абстрагироваться от этого в классы Steps / Scenario и сократить свой код верхнего уровня до нескольких строк, которые просто вызовут конкретный тестовый сценарий. Короче говоря, вам не нужно писать все в этой лямбде действия. - person Cosmin Sontu; 09.06.2018
comment
Я говорю о реальном скрипте для реального тестового примера, а не о однострочном, который просматривает google.com, а затем утверждает. Настоящий тестовый пример, по крайней мере любой из написанных мною, - это более 50 строк кода ... и я действительно использую объектную модель страницы. Я работал над сайтами электронной коммерции и банковскими приложениями, и даже с POM они такие длинные. Я имею в виду вызов метода Browse(). - person JeffC; 09.06.2018