.. _gsauto_ug_junit: Использование в тесте ===================== Для создания UI-тестов, библиотека используется в сочетании с фреймворком JUnit. Доступно несколько способов: 1. :ref:`Самостоятельная инициализация окружения ` 2. :ref:`Использование стандартной инициализации окружения ` :java:type:`DefaultTestEnvironment` 3. :ref:`Расширение JUnit через @ExtendWith ` 4. :ref:`Расширение JUnit наследованием ` Выбор подхода зависит от специфики разрабатываемых тестов. .. _junit-init-manual: Самостоятельная инициализация окружения --------------------------------------- При самостоятельной инициализации окружения необходимо реализовать полный цикл подключения к серверу приложений и получения объекта приложения. Вы должны выполнить эти :ref:`действия`, самостоятельно, написав соответствующий код в методе, аннотированном JUnit-аннотацией ``@BeforeAll``. Также потребуется реализация :ref:`процесса отключения ` от сервера приложений, написав соответствующий код в методе, аннотированном JUnit-аннотацией ``@AfterAll``. Класс тестов должен сохранять объекты клиента и приложения в статических переменных, обеспечивая доступ к ним во время выполнения тестов. Пример теста повторяет логику примера :ref:`Без использования JUnit`. .. code-block:: java :caption: ClientTest.java package ru.bitec.gsautomation.examples.example2; import org.junit.jupiter.api.*; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.remote.RemoteWebDriver; import ru.bitec.gs.automation.client.Client; import ru.bitec.gs.automation.client.ClientBuilder; import ru.bitec.gs.automation.client.login.LoginStrategy; import ru.bitec.gs.automation.client.login.LoginStrategyFactory; import ru.bitec.gs.automation.client.ui.Application; import ru.bitec.gs.automation.security.CredentialsFactory; import ru.bitec.gs.automation.security.UserPassword; import ru.bitec.gs.automation.security.UserPasswordSolution; public class ClientTest { private static Application application; // Объект приложения private static Client client; // Объект клиента gs-automation @BeforeAll public static void beforeAll() throws Exception { UserPasswordSolution userCredential = CredentialsFactory.userPasswordSolution("admin", "admin", "PGTEST"); UserPassword adminCredential = CredentialsFactory.userPassword("admin", "admin"); LoginStrategy loginStrategy = LoginStrategyFactory.urlCredentials(userCredential, "gtk-Gs3_QAApplication", "gtk-ru.bitec.app.btk.Btk_Notification#Head"); RemoteWebDriver remoteWebDriver = new ChromeDriver(); client = ClientBuilder.forWebDriver(remoteWebDriver).setUrl("http://localhost:8080").setLoginStrategy(loginStrategy).setAdminCredentials(adminCredential).build(); application = client.login(); } @AfterAll public static void afterAll() throws Exception { client.logout(); client.close(); } @Test public void loginAndOpenCloseApplication_noExceptions() { application.mainForm().mainMenu().itemByCaption("gs-automation", "Редакторы на карточке").click(); } } Полный пример проекта ``example2`` доступен в :ref:`Коллекции примеров проектов`. .. _junit-init-default: Использование стандартной инициализации окружения ------------------------------------------------- Библиотека предоставляет класс :java:type:`DefaultTestEnvironment`. Класс управляет подключением и отключением клиента от сервера. Для его использования нужно унаследоваться от этого класса и изменить методы, аннотированные JUnit-аннотациями ``@BeforeAll`` и ``@AfterAll``. Пример с использованием класса :java:type:`DefaultTestEnvironment`. .. code-block:: java :caption: ClientTest.java package ru.bitec.gsautomation.examples.example3; import org.junit.jupiter.api.*; import ru.bitec.gs.automation.environment.DefaultTestEnvironment; @TestInstance(Lifecycle.PER_CLASS) public class ClientTest extends DefaultTestEnvironment { @BeforeAll public void beforeAll() throws Exception { super.testClassPrelude(); } @AfterAll public void afterAll() throws Exception { super.testClassEpilogue(); } @Test public void loginAndOpenCloseApplication_noExceptions() { application.mainForm().mainMenu().itemByCaption("gs-automation", "Редакторы на карточке").click(); } } Полный пример проекта ``example3`` доступен в :ref:`Коллекции примеров проектов`. Преимущества использования :java:type:`DefaultTestEnvironment` очевидны: упрощается структура тестового класса и сокращается количество необходимого кода. .. note:: 1. Методы, помеченные аннотациями JUnit (``@BeforeAll`` и ``@AfterAll``), не могут быть объявлены как статические. 2. Параметры подключения клиента к серверу должны задаваться, например, в файле конфигурации (``gs-automation.properties``). Детально это рассмотрено в главе :ref:`gsauto_ug_envprops`. 3. Необходимо использовать аннотацию ``@TestInstance(Lifecycle.PER_CLASS)``. 4. Класс :java:type:`DefaultTestEnvironment` содержится в дополнительной компоненте `gs-automation-environments`. .. seealso:: - Спецификация: :ref:`gsauto_envprops` - Спецификация: :ref:`gsauto_repository` - API: :java:type:`ru.bitec.gs.automation.environment.DefaultTestEnvironment` - Справочник API: :doc:`API окружения выполнения <../../javadoc-environments/packages>` - Руководство пользователя: :ref:`gsauto_ug_artifacts` - Руководство пользователя: :ref:`gsauto_ug_envprops` Расширение JUnit ---------------- Библиотека предоставляет специальный компонент `gs-automation-junit`. В нем содержатся дополнительные классы для интеграции с JUnit. Расширение JUnit может полностью скрыть процессы подключения и отключения от сервера приложений, делая тесты более простыми и понятными. Доступно два варианта расширения JUnit: 1. Расширение тестового класса аннотацией `@ExtendWith` с указанием резолвера. 2. Расширение тестового класса наследованием от расширяющего окружения выполнения. .. note:: В общем случае рекомендуется использовать вариант расширения аннотацией `@ExtendWith`. Применяйте расширение наследованием тогда, когда нужна максимальная гибкость инициализации и использования окружения. Пример проекта ``example5`` доступен в :ref:`Коллекции примеров проектов`. .. _junit-init-resolver: Расширение JUnit через @ExtendWith `````````````````````````````````` При этом варианте расширения, тестовый класс нужно аннотировать JUnit-аннотацией `@ExtendWith`, с указанием резолвера :java:type:`GsAutomationJUnitResolver `. Резолвер выполнит инициализацию окружения выполнения тестов и обеспечит передачу окружения в тестовые методы через аргумент. После выполнения тестов тестового класса резолвер корректно остановит окружение. Пример, эквивалентный предыдущим, но с использованием расширения JUnit с помощью аннотации `@ExtendWith`. .. code-block:: java :caption: ClientResolverTest.java package ru.bitec.gsautomation.examples.example5; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import ru.bitec.gs.automation.client.ui.Application; import ru.bitec.gs.automation.junit.GsAutomationJUnitResolver; @ExtendWith(GsAutomationJUnitResolver.class) public class ClientResolverTest { @Test public void loginAndOpenCloseApplication_noExceptions(GsAutomationJUnitResolver.Environment env) { Application application = env.getApplication(); application.mainForm().mainMenu().itemByCaption("gs-automation", "Редакторы на карточке").click(); } } .. note:: 1. Методы, помеченные аннотациями JUnit (``@BeforeAll`` и ``@AfterAll``), должны быть объявлены как статические. 2. Параметры подключения клиента к серверу должны задаваться в файле конфигурации (``gs-automation.properties``). Детально это рассмотрено в главе :ref:`gsauto_ug_envprops`. 3. Окружение выполнения передается во все методы тестового класса, аннотированые аннотациями JUnit, как аргумент этих методов. 4. При использовании этого варианта расширения не предоставляется возможность переопределять методы окружения. 5. Класс :java:type:`GsAutomationJUnitResolver` содержится в дополнительной компоненте `gs-automation-junit`. 6. Объекты клиента и приложения доступны через аксессоры класса :java:type:`GsAutomationJUnitResolver.Environment ` .. seealso:: - Спецификация: :ref:`gsauto_envprops` - Спецификация: :ref:`gsauto_repository` - API: :java:type:`ru.bitec.gs.automation.junit.GsAutomationJUnitResolver` - Справочник API: :doc:`API интеграции с JUnit <../../javadoc-junit/packages>` - Руководство пользователя: :ref:`gsauto_ug_artifacts` - Руководство пользователя: :ref:`gsauto_ug_envprops` .. _junit-init-extension: Расширение JUnit наследованием `````````````````````````````` При использовании этого варианта расширения JUnit, тестовый класс наследуется от специального типа окружения выполнения тестов. При применении наследования достигается максимальная гибкость конфигурирования окружения выполнения тестов, так как тестовый класс приобретает все свойства окружения и неследует его поведение. Допускается переопределение методов окружения и программное управление инициализацией :java:type:`клиента `. Пример, эквивалентный предыдущим, но использующий расширение JUnit через наследование. .. code-block:: java :caption: ClientExcensionTest.java package ru.bitec.gsautomation.examples.example5; import org.junit.jupiter.api.Test; import ru.bitec.gs.automation.junit.GsAutomationJUnitEnvironment; public class ClientTest extends GsAutomationJUnitEnvironment { @Test public void loginAndOpenCloseApplication_noExceptions() { application.mainForm().mainMenu().itemByCaption("gs-automation", "Редакторы на карточке").click(); } } Класс теста теперь предельно прост: остался только сам тестовый сценарий. .. note:: 1. Методы, помеченные аннотациями JUnit (``@BeforeAll`` и ``@AfterAll``), могут быть объявлены как статическими так и не статическими. 2. Параметры подключения клиента к серверу должны задаваться любым удобным способом. Например, в файле конфигурации (``gs-automation.properties``). Детально это рассмотрено в главе :ref:`gsauto_ug_envprops`. 3. Класс :java:type:`GsAutomationJUnitEnvironment` содержится в дополнительной компоненте `gs-automation-junit`. 4. Не требуется использовать дополнительные аннотации. .. seealso:: - Спецификация: :ref:`gsauto_envprops` - Спецификация: :ref:`gsauto_repository` - API: :java:type:`ru.bitec.gs.automation.junit.GsAutomationJUnitEnvironment` - Справочник API: :doc:`API интеграции с JUnit <../../javadoc-junit/packages>` - Руководство пользователя: :ref:`gsauto_ug_artifacts` - Руководство пользователя: :ref:`gsauto_ug_envprops`