Как я могу назвать тест JUnit как настройку для другого? - PullRequest
0 голосов
/ 24 октября 2019

Я пытаюсь создать тест JUnit, который требует, чтобы пользователь вошел в систему с учетной записью администратора. Чтобы сделать так, чтобы мне не нужно было повторять код, я выполнил тест Login JUnit и GoToAdminPage JUnit.

  • Первый доступ к странице входа и входа в систему.
  • Второй пытается получить доступ к меню, доступному только для администраторов, и предназначен для выбора прямо там, где первый отключается . Я хочу, чтобы GoToAdminPage начинался на той же странице и в той же среде, в которой заканчивается Login.

Идея состоит в том, что путем создания автоматического теста Login,Я могу использовать его для любого теста, который я хочу сделать в будущем, для которого требуются права администратора.

Я пытаюсь в первом вызове вызвать setUp() из GoToAdminPage. Однако это означает, что он запускает тестовый браузер для GoToAdminPage, а затем немедленно запускает другой тестовый браузер для Login, который закрывается, поскольку Login.tearDown() содержит инструкцию driver.quit().

Что я хочупредназначен для GoToAdminPage, ожидает, что он будет получен прямо на той же странице, Login заканчивается, у него нет инструкции get, поэтому он никогда не покидает начальную страницу Firefox.

Я уже пробовал пару вещей,Каждый из моих тестов наследует класс BasicTest, который определяет несколько вещей (WebDriver, JS Executor, универсальные служебные функции и т. Д.). В этом классе я создал perform() функцию, которая вызывает setUp() и test().

Таким образом, в GoToAdminPage все, что мне нужно было бы сделать, это вызвать Login.perform() в GoToAdminPage.setUp()и это технически позволило бы достичь того, что я хочу сделать. Тем не менее, это не так, и имеет тот же эффект, что я уже упоминал выше.

Просматривая в Интернете, я увидел, что я мог бы также сделать так, чтобы GoToAdminPage extends Login, но это также имеет тот же результат.

Наконец, я попытался поместить весь процесс Login.test() в отдельную функцию в Login классе, который я мог бы вызвать внутри GoToAdminPage, но это дает тот же результат.

В итоге, чтопохоже, что происходит, когда я вызываю другой тест JUnit внутри GoToLoginPage, он выполняет тест, но делает это как отдельный тест .

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

Возможно ли это?

Вот мой текущий код:

Login.java

public class Login extends BasicTest {

    /**
     * @throws java.lang.Exception
     */
    @Before
    public void setUp() throws Exception {
        super.setUp();
        driver.get(constants.connectionUrl);
    }

    /**
     * @throws java.lang.Exception
     */
    @After
    public void tearDown() throws Exception {
        super.tearDown();
    }

    @Test
    public void test() throws Exception {
        this.login(driver);
    }

    public void login(WebDriver d) throws InterruptedException {
        ...login process using webdriver....
    }
}

GoToAdminPage.java

public class GoToAdminPage extends BasicTest {

    Login Login = new Login();
    /**
     * @throws java.lang.Exception
     */
    @Before
    public void setUp() throws Exception {
        super.setUp();
        Login.login(driver);
    }

    /**
     * @throws java.lang.Exception
     */
    @After
    public void tearDown() throws Exception {
        super.tearDown();
    }

    @Test
    public void test() throws Exception {
        ...post login test process...
    }
}

Тем не менее, это имеет вышеупомянутый эффект.

Ответы [ 3 ]

0 голосов
/ 25 октября 2019

Вам следует применить Шаблон объекта страницы и создать страницу объекта входа.

Одним из самых популярных шаблонов в Web Automation является так называемый шаблон объекта страницы. Чтобы понять основную цель шаблона, сначала нужно подумать о том, что делают ваши тесты веб-автоматизации. Они переходят на разные веб-страницы и нажимают / вводят / в разных элементах. Шаблон объекта страницы объединяет все элементы, действия и проверки, происходящие на странице, в один объект-объект страницы. source

Некоторые из преимуществ шаблона объекта страницы, перечисленные ниже,

  • Уменьшает дублирование кода
  • Выполняет тестыболее читабельный и надежный
  • Улучшает удобство сопровождения тестов

ИМХО не рекомендуется создавать зависимости между тестами.

Пример:

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;

public final class LoginPage {

    @FindBy(id="username")
    private WebElement username;

    @FindBy(id="password")
    private WebElement password;

    @FindBy(id="loginBtn")
    private WebElement submit;

    public LoginPage(WebDriver driver) {
        PageFactory.initElements(driver, this);
    }

    public void submit(String username, String password) {
        this.username.sendKeys(username);
        this.password.sendKeys(password);
        submit.click();
    }
}
0 голосов
/ 25 октября 2019

В итоге я нашел решение:

  • GoToAdminPage extends Login

  • GoToAdminPage.setUp() звонки parent.setUp()

  • GoToAdminPage.test() звонки parent.test()

С помощью этого я смог сделать свой второй тест использовать его родительский в качестве фазы установки.

0 голосов
/ 24 октября 2019

Определите шаги входа в систему как обычный метод (без обозначения @Test). Затем вы можете вызывать этот метод откуда угодно. Из вашего метода проверки входа в систему (добавление необходимых подтверждений после выполнения шагов) и из любых методов setUp без фактического запуска проверки входа в систему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...