Лучший дизайн для организации HttpUnit + junit в качестве отдельного приложения - PullRequest
1 голос
/ 28 марта 2011

У меня есть задача написать набор http модульных тестов, которые следует развернуть и запустить как однопоточное приложение на внешнем сервере.

После некоторого изучения и прочтения документации я пришел к следующей структуре приложения:

public static void main(String... args) throws Exception {

        Class[] testCases = {
                LoginTest.class,
                Test2.class,
                Test3.class
        };
        TestSuite suite = new TestSuite(testCases);

        TestResult result = new TestResult();
        suite.run(result);

        displayResults(result);
    }

И тестовый пример выглядит так:

public class LoginPageTest extends TestCase {    
    public void testLogin() throws IOException, SAXException {

        WebConversation wc = new WebConversation();
        //Some HttpUnit init code here    

        loginForm.setParameter("j_username", login);
        loginForm.setParameter("j_password", pass);

        loginForm.submit();

        String expected = String.format("/%s/action/logon.do", endpoint); 

        assertEquals(wc.getCurrentPage().getURL().getPath(), expected);    
    }    
}

Кто-нибудь делал подобные задачи? У вас есть несколько советов, которые могут улучшить эту структуру? Как я могу реализовать зависимость между тестовыми сценариями (например, почти все, что нужно, чтобы пользователь прошел аутентификацию -> должен быть вызван loginTestCase)?

Любой совет с благодарностью!

Заранее спасибо.

1 Ответ

0 голосов
/ 07 апреля 2011

В настоящее время я нашел один подходящий способ разработки моего тестового приложения:

Класс 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();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...