В бытность мою 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>