В настоящее время я нашел один подходящий способ разработки моего тестового приложения:
Класс TestCase (расширяющий jUnit):
public class LogoutTest extends TestCase {
public void testLogout() throws IOException, SAXException {
new Config().initApplication()
.doLogin("user", "pass") // returns WelcomePage class
.goToFilterPage() //Returns another page
.doLogout(); //returns LoginPage class
}
}
Через некоторое время я решил, что было бы хорошо создать для каждой страницы определенный класс, который будет иметь свои специфические методы управления, например, «перейти на следующую страницу», «выйти из системы», «нажать какую-нибудь кнопку» и т. д. *
public class WelcomePage extends AbstractPage {
protected WelcomePage(AbstractPage other) {
super(other);
String expected = String.format("/%s/welcome.do", Config.endpoint);
assertEquals(expected, webConversation.getCurrentPage().getURL().getPath());
logger.info(String.format("Current page: %s", webConversation.getCurrentPage().getURL().getPath() ));
}
public FilterPage goToFilterPage() throws SAXException, IOException {
WebLink link = webConversation.getCurrentPage().getLinkWithID("downloadLink");
assertNotNull("Check if link exist on page", link);
link.click();
return new FilterPage(this);
}
}
Класс AbstractPage (реализует некоторую общую логику для всех страниц):
public abstract class AbstractPage {
protected WebConversation webConversation;
protected Logger logger;
protected AbstractPage(AbstractPage other) {
this.webConversation = other.getWebConversation();
this.logger = Logger.getLogger(this.getClass());
}
protected AbstractPage(WebConversation webConversation) {
this.webConversation = webConversation;
this.logger = Logger.getLogger(this.getClass());
}
public WebConversation getWebConversation() {
return webConversation;
}
public void doLogout() throws SAXException, IOException {
WebLink logoutLink = webConversation.getCurrentPage().getLinkWithID("logoutLink");
assertNotNull(logoutLink);
logoutLink.click();
}
}