[NUnit + C#] Какой атрибут нужно использовать в фикстуре для того, чтобы браузер открыть один раз для всех тестовых классов

nunit
Теги: #<Tag:0x00007fedb7725b30>

(Артём Кузьменко) #1

Здравствуйте.
Пытаюсь начать писать тесты для нового проекта. Связка NUnit + C# + selenium.
Подскажите, пожалуйста, какой атрибут нужно использовать в фикстуре для того, чтобы браузер открыть один раз для всех тестовых классов и закрыть после всех тестов? Что я только не пробую, но постоянно браузер открывается и закрывается для каждого класса.

    public class BaseTest
    {
        // глобальная переменная драйвера
        private static IWebDriver driver;
  
        [TestFixtureSetUp]
        public static void StartBrowser()
        {
            driver = new ChromeDriver();
        }

        // закрытие браузера
        [TestFixtureTearDown]
        public static void StopBrowser()
        {
            driver.Quit();
        }
    }

Что я только не пробовал, но добиться ,чтобы методы выполнялись до и после всех тестов не получается.
Основные Атрибуты NUnit для написания автотестов на C# - https://software-testing.org/automation-testing/osnovnye-atributy-nunit-dlya-napisaniya-avtotestov-na-c.html


#2

[SetUp]

The SetUp attribute is inherited from any base class. Therefore, if a base class has defined a SetUp method, that method will be called before each test method in the derived class. If you wish to add more SetUp functionality in a derived class you need to mark the method with the appropriate attribute and then call the base class method.


(Alexander) #3

Тут дело не совсем в атрибуте. Сейчас у вас порядок такой:
foreach (testSuite class in testSuites)
run BaseTest one time setup
run class
run BaseTest one time teardown

Создайте дополнительный отдельно стоящий класс, например BaseSetupFixture, от которого ничего не будет наследоваться, и создайте там методы с такими же атрибутами как и в BaseTest. Так как от него не наследуется ни один из сьютов, раниться он будет единожды перед всеми сьютами и единожды после последнего сьюта.


(Артём Кузьменко) #4

Спасибо, Ваше решение мне помогло…
Хотел уточнить… так как у меня браузер 1, то мне надо передать драйвер из BaseSetupFixture в BaseTest, т.к. в BaseTest я инициализирую все Pages, а все тестовые классы наследуются от BaseTest. Такое решение нормальное?

 // фикстура для тестов, запускается один раз до / после всех тестовых классов
    [SetUpFixture]
    public class BaseSetupFixture
    {
        // глобальная переменная драйвера
        private static IWebDriver driver;

        // получить драйвер
        public static IWebDriver GetDriver()
        {
            return driver;
        }

        // открытие браузера
        [OneTimeSetUp]
        public static void StartBrowser()
        {
            //driver = new FirefoxDriver();
            driver = new ChromeDriver();
            //driver.Manage().Window.Maximize(); // не хочет работать
        }

        // закрытие браузера
        [OneTimeTearDown]
        public static void StopBrowser()
        {
            driver.Quit();
        }
    }
public class BaseTest
    {
        // глобальная переменная драйвера
        private static IWebDriver driver;
   
        // объявление Pages
        public BasePage basePage;
        public LoginPage loginPage;
        public LogoutPage logoutPage;
        public MenuPage menuPage;
        public DesktopPage desktopPage;
  
        // перед каждым тестом создаем новые экземпляры Pages
        [SetUp]
        public void SetUp()
        {
            driver = BaseSetupFixture.GetDriver();

            basePage = new BasePage(driver);
            loginPage = new LoginPage(driver);
            logoutPage = new LogoutPage(driver);
            menuPage = new MenuPage(driver);
            desktopPage = new DesktopPage(driver);
        }
    }

Т.е. передать драйвер в BaseTest вот так: driver = BaseSetupFixture.GetDriver() это нормально?


(Alexander) #5

Работать это должно, но устраивать вас такое решение будет ровно до того момента как понадобится распараллеливать тесты. Тогда статический драйвер не пройдет. И еще момент - раз уж у вас драйвер инициализируется единожды за все время, не лишним будет добавить проверку на null: если доайвер null - создать новый инстанс, потому как на продолжительном пути рана тестов он может отвалиться и все последующие тесты будут красными. Но это такое, можно сделать и когда непосредственно столкнетесь, не горит - может и не столкнетесь никогда.


(Артём Кузьменко) #6

Спасибо!