Как разработать тесты Selenium 2 с шаблоном Page Object, используя наследование - PullRequest
4 голосов
/ 05 декабря 2011

Сейчас мы пишем новый набор тестов, используя Selenium 2 (Webdriver) и TestNG . В наших тестах используется шаблон Page Object , и мы очень довольны тем, как все выглядит до сих пор. Однако в наших тестах мы столкнулись с проблемой проектирования и, похоже, не смогли найти для нее хорошего решения. Позвольте привести пример. Вот наш LoginTestCase:

public class LoginTestCase extends MyTestCase {
    @BeforeTest
    public void login() {
        HomePage homepage = PageFactory.initElements(getDriver(), HomePage.class);
        LoginPage loginPage = homepage.login();
        DashboardPage dashboardPage = loginPage.loginUser("username", "password");
    }   
}

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

public class DashboardTestCase extends LoginTestCase {
    @Test
    public void testDashboard(DashboardPage dashboardPage) { 
        ...
    }
}

На данный момент пользователь находится на DashboardPage, и единственное, что нужно, - это объект той страницы, который был создан в LoginTestCase.

Я знаю, что очевидным решением является сохранение этого объекта в переменной (в LoginTestCase), к которой затем будут обращаться дочерние тестовые случаи. Однако это выглядит очень уродливо и может привести к неправильному использованию этой переменной.

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

Ответы [ 3 ]

3 голосов
/ 23 декабря 2011

Мы использовали внедрение зависимостей и Guice с Guice-berry для решения этой проблемы.Объекты страницы были введены в методы тестирования, а WebDriver был вставлен в объекты страницы.

В качестве компромисса мы не использовали всю эту небольшую цепочку между объектами страницы.

Но статическое состояние исинглтоны - это боль в заднице, когда дело доходит до параллельного выполнения теста, поэтому их следует избегать.

1 голос
/ 05 декабря 2011

Я не нашел лучшего решения.У меня есть одноэлементный WebDriver в статическом классе, откуда все мои тестовые случаи могут получить доступ к WebDriver.Все мои тестовые классы должны быть запущены на одном и том же WebDriver из-за входа / сеанса.

0 голосов
/ 02 апреля 2013

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

  1. Инкапсулируйте переменную в свой LoginTestCase, чтобы никто не мог испортить ее с этим.получить доступ к нему, и это то, что вы хотели в конце концов.так что это не должно быть проблемой.

Так будет выглядеть ваш код после изменений.Надеюсь, что это имеет смысл:

public class LoginTestCase extends MyTestCase {

    private dashboardPage;

    @BeforeTest
    public void login() {
        HomePage homepage = PageFactory.initElements(getDriver(), HomePage.class);
        LoginPage loginPage = homepage.login();
        dashboardPage = loginPage.loginUser("username", "password");
    }

    protected void getDashBoardPage() {
        return dashboardPage;  
    }

}

public class DashboardTestCase extends LoginTestCase {
    @Test
    public void testDashboard() { 
            DashboardPage dashboardPage = getDashBoardPage();
        ...
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...