Pull to refresh

Java: Тестирование страниц ВебПриложений при помощи JWebUnit и Cargo Container

Reading time 4 min
Views 4.4K
В бытность мою j2ee программистом, приходилось разрабатывать сайты с достаточно большим количеством страниц, использующие для визуализации ajax и прочие красивости. Контроллеры можно было протестировать при помощи JUnit и моковых запросов\ответов. Но для огромного количества ftl шаблонов и их JavaScript кода такой вариант не подходил.



Отличной возможностью протестировать страницы по настоящему является JWebUnit. После добавления его в проект вам будет доступен класс WebTestCase являющийся наследником TestCase из классического Junit.

Класс WebTestCase предоставляет высокоуровневое API для работы с вебстраницами, описывать его просто бессмысленно из-за запредельной простоты, поэтому просто приведу пример кода с главной страницы:

public class ExampleWebTestCase extends WebTestCase {
    public void setUp() {
        super.setUp();
        setBaseUrl(«localhost:8080/test»);
    }
 
    public void test1() {
        beginAt("/home");
        clickLink(«login»);
        assertTitleEquals(«Login»);
        setTextField(«username»«test»);
        setTextField(«password»«test123»);
        submit();
        assertTitleEquals(«Welcome, test!»);
    }
}
 


Теперь неплохо бы было научится запускать вебсервер перед выполнением пачки тестов,
а ещё лучше запускать его на сервере в задаче например для Аnt, перед сборкой, и прогонять тесты там, чтобы не сломать продакшн версию, в случае коммита на скорую руку. В этом нам поможет Cargo Conatiner, это Java API помогающее нам руководить ВебСервером из Java кода или прямо из задачи Ant. По традиции приведу оба сценария использования, которые можно найти на сайте разработчика:

Выполняем код руками

Deployable war = new WAR(«path/to/simple.war»);
 
LocalConfiguration configuration =
    new Resin3xStandaloneLocalConfiguration(«target/myresin3x»);
configuration.addDeployable(war);
 
InstalledLocalContainer container =
    new Resin3xInstalledLocalContainer(configuration);
container.setHome(«c:/apps/resin-3.0.18»);
 
container.start();
// Here you are assured the container is started.
 
container.stop();
// Here you are assured the container is stopped.
 


Запускаем в ant таске (Maven 1,Maven 2 )

  • tomcat.home – Домашняя папка томката
  • tomcatlog.dir – Логи
  • tomcatconfig.dir – Папка куда конейтенр сгенерит логи
  • pathtowarfile – Полный путь к war файлу


<property name="cargolib.dir" value="${basedir}/cargolib"/>
<property name="cargo-uberjar" value="${cargolib.dir}/cargo-core-uberjar-0.7.jar"/>
<property name="cargo-antjar" value="${cargolib.dir}/cargo-ant-0.7.jar"/>
 
<taskdef resource="cargo.tasks">
  <classpath>
    <pathelement location="${cargo-uberjar}"/>
    <pathelement location="${cargo-antjar}"/>
  </classpath>
</taskdef>
 
<target name="cargostart" depends="war">
  <delete dir="${tomcatconfig.dir}" />
  <mkdir dir="${tomcatlog.dir}"/>
  <mkdir dir="${tomcatconfig.dir}"/>
  <echo message="Starting Cargo..."/>
  <echo message="Using tomcat.home = ${tomcat.home} "/>
  <echo message="Using war = ${mywarfile} "/>
  <echo message="Jars used = ${cargo-uberjar} , ${cargo-antjar}"/>
 
  <cargo containerId="tomcat5x" home="${tomcat.home}" output="${tomcatlog.dir}/output.log" 
      log="${tomcatlog.dir}/cargo.log" action="start">
    <configuration home="${tomcatconfig.dir}">
      <property name="cargo.servlet.port" value="8080"/>
      <property name="cargo.logging" value="high"/>
      <deployable type="war" file="${mywarfile}"/>
    </configuration>
  </cargo>
 <!-- тут можно делать всякое, например тесты -->
 <!-- тормозить сервер надо тем же способом, только action указать другой -->
</target>
 
Tags:
Hubs:
+10
Comments 9
Comments Comments 9

Articles