Page Object 패턴을 이용한 웹 CRUD 테스트 with WebTUint
참조
http://code.google.com/p/webdriver/wiki/PageObjects
http://code.google.com/p/webdriver/wiki/PageFactory
화면의 페이지를 나타내는 Page 객체들을 작성합니다. 화면에서 테스트할 주요 엘리먼트들은 WebElement로 표현하고, 각각의 엘리먼트를 애노테이션으로 찾을 수 있게 id나 name 또는 xpath를 사용하여 지정해 줍니다.
protected WebElement name;
protected WebElement email;
protected WebElement password;
@FindBy(how = How.ID, using = "name.errors")
protected WebElement nameError;
@FindBy(how = How.ID, using = "email.errors")
protected WebElement emailError;
@FindBy(how = How.ID, using = "password.errors")
protected WebElement passwordError;
@FindBy(how = How.XPATH, using = "//input[@type='submit']")
protected WebElement submit;
public WebElement getName() {
return name;
}
...
}
원랜 Page 클래스에 있어야 할 속성들인데, 다른 Page에서도 공통으로 사용하는 속성들이라 상위 클래스로 빼냈습니다. 애노테이션을 붙이지 않으면, 자동은 화면에서 클래스의 변수명에 해당하는 id를 가진 엘리먼트를 찾아줍니다.
그 다음으로, 페이지에서 일어나는 사용자 액션을 메서드로 표현합니다.
private WebDriver driver;
public MemberAddPage(WebDriver driver) {
this.driver = driver;
}
public MemberAddPage addFail() {
name.sendKeys("keesun");
submit.submit();
return PageFactory.initElements(driver, MemberAddPage.class);
}
public MemberListPage addSuccess() {
password.sendKeys("123");
email.sendKeys("keesun@whiteship.me");
submit.submit();
return PageFactory.initElements(driver, MemberListPage.class);
}
}
이것을 이용하여 다음과 같은 테스트를 작성할 수 있습니다.
@WarConfiguration(appName="springsprout")
@DataConfiguration(dataType=DataType.XML, location="integration/member/testData.xml")
public class MemberWebTest {
@WebTest
public void memberPages(){
WebDriver driver = new HtmlUnitDriver();
driver.get("http://localhost:8080/springsprout/member/list.do");
MemberListPage listPage = PageFactory.initElements(driver, MemberListPage.class);
assertEquals(2, listPage.getTableRows());
MemberAddPage addPage = listPage.toAddForm();
assertNotNull(addPage);
MemberAddPage failedAddPage = addPage.addFail();
assertNotNull(failedAddPage);
assertEquals("required", failedAddPage.getEmailError().getText());
assertEquals("required", failedAddPage.getPasswordError().getText());
listPage = failedAddPage.addSuccess();
assertNotNull(listPage);
assertEquals(3, listPage.getTableRows());
...
}
물론, WebTUnit이 없다면, 수동으로 서버를 켜고, 데이터 넣고, 저 테스트를 실행하고, 다시 테스트 데이터를 정리하고, 서버를 내리는 작업을 반복해야겠지만.. WebTUnit이 있기 때문에 메이븐 콘솔에서 mvn verify를 실행하기만 하면 위의 작업들을 자동화 할 수 있습니다. 조금더 빠르고 이클립스에서 실행해 보고 싶다면, pom.xml을 약간 수정하여 cargo.wait 속성을 true로 바꾸고 mvn cargo:start로 서버를 실행한 다음, 이클립스에서 JUnit 테스트로 실행하면 됩니다.