Здравствуйте.
Пытаюсь начать писать тесты для нового проекта. Связка 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();
}
}
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.
Тут дело не совсем в атрибуте. Сейчас у вас порядок такой:
foreach (testSuite class in testSuites)
run BaseTest one time setup
run class
run BaseTest one time teardown
Создайте дополнительный отдельно стоящий класс, например BaseSetupFixture, от которого ничего не будет наследоваться, и создайте там методы с такими же атрибутами как и в BaseTest. Так как от него не наследуется ни один из сьютов, раниться он будет единожды перед всеми сьютами и единожды после последнего сьюта.
Спасибо, Ваше решение мне помогло…
Хотел уточнить… так как у меня браузер 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() это нормально?
Работать это должно, но устраивать вас такое решение будет ровно до того момента как понадобится распараллеливать тесты. Тогда статический драйвер не пройдет. И еще момент - раз уж у вас драйвер инициализируется единожды за все время, не лишним будет добавить проверку на null: если доайвер null - создать новый инстанс, потому как на продолжительном пути рана тестов он может отвалиться и все последующие тесты будут красными. Но это такое, можно сделать и когда непосредственно столкнетесь, не горит - может и не столкнетесь никогда.