반응형
블로그 이미지
개발자로서 현장에서 일하면서 새로 접하는 기술들이나 알게된 정보 등을 정리하기 위한 블로그입니다. 운 좋게 미국에서 큰 회사들의 프로젝트에서 컬설턴트로 일하고 있어서 새로운 기술들을 접할 기회가 많이 있습니다. 미국의 IT 프로젝트에서 사용되는 툴들에 대해 많은 분들과 정보를 공유하고 싶습니다.
솔웅

최근에 받은 트랙백

글 보관함

Page Object Design Pattern

2014. 7. 31. 18:43 | Posted by 솔웅


테스트 케이스를 만들 때 사용되는 Page Object Design Pattern에 대해 알아 보겠습니다.


우선 개념 파악부터 하고 넘어가죠.




이제 예제를 보겠습니다.


public class Login {

        public void testLogin() {
                selenium.type("inputBox", "testUser");
                selenium.type("password", "my supersecret password");
                selenium.click("sign-in");
                selenium.waitForPageToLoad("PageWaitPeriod");
                Assert.assertTrue(selenium.isElementPresent("compose button"),
                                "Login was unsuccessful");
        }
}

이 코드의 두가지 문제점

1. 테스트 메소드와 AUTs locators (이 예제에서는 ID 들) 들 간의 어떤 구분이 없다. 두개가 하나의 메소드에 그냥 얽혀 있다. 만약에 AUT의 UI가 그 identifiers, layout을 바꾸거나 로그인 방법을 바꾼다면 이 테스트 소스코드도 반드시 바뀌어야 한다.
2. id-locator들은 여러 다른 테스트에서도 사용될 것이다. 로그인을 해야 하는 모든 테스에서 사용될 것이다.

이 예제 대신에 Page Object technique을 사용하면 아래와 같이 고칠 수 있다.

public class SignInPage {

        private Selenium selenium;

        public SignInPage(Selenium selenium) {
                this.selenium = selenium;
                if(!selenium.getTitle().equals("Sign in page")) {
                        throw new IllegalStateException("This is not sign in page, current page is: "
                                        +selenium.getLocation());
                }
        }

        public HomePage loginValidUser(String userName, String password) {
                selenium.type("usernamefield", userName);
                selenium.type("passwordfield", password);
                selenium.click("sign-in");
                selenium.waitForPageToLoad("waitPeriod");

                return new HomePage(selenium);
        }
}

그리고 홈페이지에 대한 page object는 아래와 같을 것이다.

public class HomePage {

        private Selenium selenium;

        public HomePage(Selenium selenium) {
                if (!selenium.getTitle().equals("Home Page of logged in user")) {
                        throw new IllegalStateException("This is not Home Page of logged in user, current page" +
                                        "is: " +selenium.getLocation());
                }
        }

        public HomePage manageProfile() {
                // Page encapsulation to manage profile functionality
                return new HomePage(selenium);
        }

        /*More methods offering the services represented by Home Page
        of Logged User. These methods in turn might return more Page Objects
        for example click on Compose mail button could return ComposeMail class object*/

}

이제 로그인 테스트에서는 이 두 page object들을 아래와 같이 사용하면 된다.

public class TestLogin {

        public void testLogin() {
                SignInPage signInPage = new SignInPage(selenium);
                HomePage homePage = signInPage.loginValidUser("userName", "password");
                Assert.assertTrue(selenium.isElementPresent("compose button"),
                                "Login was unsuccessful");
        }
}





이 page object를 디자인 하는 방법은 여러가지가 있을 수 있다. 하지만 지켜야할 기본적인 룰은 지켜야 한다.
page object에는 어떤 verification이나 assertion을 만들면 안된다. 이 부분은 테스트의 한 부분이다. 그러므로 테스트 코드 내에 그런 기능이 있어야 한다. 절대 page object 내에 그것을 만들면 안된다. page object에는 페이지의 representation이 포함될 것이다.

page object에 들어갈 verification이 하나 있는데 그것은 해당 페이지를 verify 하는 부분이다. 혹은 해당 페이지의 아주 중요한 element도 될 수 있는데 그것은 해당 페이지가 제대로 load 됐는지를 확인하기 위한 부분이다. 이 verification은 해당 page object가 초기화 될 때 수행되어야 한다. 위 예제에서는 SignInPage와 HomePage 생성자가 그 기능을 수행한다.

page object는 전체 페이지를 represent할 필요는 없다. Page Object Design Pattern은 페이지안의 components를 represent하기 위해 사용된다. 만약 AUT안의 페이지가 여러 component들을 가지고 있다면 각 component별로 별도의 page object를 가지고 있게 되면 좀 더 유지관리하기 편할 것이다.

테스팅에 사용되는 다른 Design Pattern들도 있다. 어떤 경우에는 page object들을 instant화 하기 위해 Page Factory 패턴을 사용하기도 한다.


Selenium Wiki 에서 정의된 Page Object를 보려면 여기로 가시면 됩니다.

https://code.google.com/p/selenium/wiki/PageObjects



반응형

Comment

  1. 그럭저럭 2015.04.20 18:30

    와우... 대박
    너무 잘봤습니다.