Запуск внешнего процесса во время интеграционного тестирования в Maven - PullRequest
4 голосов
/ 06 октября 2008

Я хочу полностью автоматизированное интеграционное тестирование для проекта Maven. Интеграционные тесты требуют, чтобы перед запуском была запущена внешняя (зависящая от платформы) программа. В идеале, внешняя программа будет уничтожена после завершения модульных тестов, но это не обязательно.

Есть ли плагин Maven для этого? Другие идеи?

Ответы [ 5 ]

4 голосов
/ 06 октября 2008

Вы можете использовать плагин antrun . Внутри вы будете использовать муравьи exec apply task.

Примерно так.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-antrun-plugin</artifactId>
    <version>1.2</version>
    <executions>
      <execution>
        <phase> <!-- a lifecycle phase --> </phase>
        <configuration>

          <tasks>
            <apply os="unix" executable="cmd">
              <arg value="/c"/>
              <arg value="ant.bat"/>
              <arg value="-p"/>
            </apply>
            <apply os="windows" executable="cmd.exe">
              <arg value="/c"/>
              <arg value="ant.bat"/>
              <arg value="-p"/>
            </apply>
          </tasks>

        </configuration>
        <goals>
          <goal>run</goal>
        </goals>
      </execution>
    </executions>
  </plugin>

Ant поддерживает определенные команды, конечно же, через условное задание .

2 голосов
/ 07 октября 2008

Плагин Cargo Maven - хороший вариант, если вы занимаетесь разработкой сервлета и хотите развернуть получившийся WAR для интеграционного тестирования.

Когда я делаю это сам, я часто настраиваю многомодульный проект (хотя это не совсем обязательно) и инкапсулирую все интеграционные тесты в этот один модуль. Затем я включаю модуль с профилями (или нет), чтобы он не блокировал немедленную сборку «да, я знаю, что сломал».

Вот пом из этого модуля функционального тестирования - сделайте из него что хотите:

<?xml version="1.0"?><project>
  <parent>
    <artifactId>maven-example</artifactId>
    <groupId>com.jheck</groupId>
    <version>1.5.0.4-SNAPSHOT</version>
  </parent>
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.jheck.example</groupId>
  <artifactId>functional-test</artifactId>
  <name>Example Functional Test</name>
  <packaging>pom</packaging>

  <dependencies>
    <dependency>
      <groupId>com.jheck.example</groupId>
      <artifactId>example-war</artifactId>
      <type>war</type>
      <scope>provided</scope>
      <version>LATEST</version>
    </dependency>
    <dependency>
      <groupId>httpunit</groupId>
      <artifactId>httpunit</artifactId>
      <version>1.6.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <plugins>

      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <executions>
          <execution>
            <goals>
              <goal>testCompile</goal>
            </goals>
          </execution>
        </executions>
      </plugin>

      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <executions>
          <execution>
            <phase>integration-test</phase>
            <goals>
              <goal>test</goal>
            </goals>
          </execution>
        </executions>
      </plugin>

      <plugin>
        <groupId>org.codehaus.cargo</groupId>
        <artifactId>cargo-maven2-plugin</artifactId>
        <version>0.3</version>
        <configuration>
          <wait>false</wait> <!-- don't pause on launching tomcat... -->
          <container>
            <containerId>tomcat5x</containerId>
            <log>${project.build.directory}/cargo.log</log>
            <zipUrlInstaller>
              <!--
              <url>http://www.apache.org/dist/tomcat/tomcat-5/v5.0.30/bin/jakarta-tomcat-5.0.30.zip</url>
               -->
               <!-- better be using Java 1.5... -->
              <url>http://www.apache.org/dist/tomcat/tomcat-5/v5.5.26/bin/apache-tomcat-5.5.26.zip</url>

              <installDir>${installDir}</installDir>
            </zipUrlInstaller>
          </container>
          <configuration>
            <!-- where the running instance will be deployed for testing -->
            <home>${project.build.directory}/tomcat5x/container</home>
          </configuration>
        </configuration>

        <executions>
          <execution>
            <id>start-container</id>
            <phase>pre-integration-test</phase>
            <goals>
              <goal>start</goal>
              <goal>deploy</goal>
            </goals>
            <configuration>
              <deployer>
                <deployables>
                  <deployable>
                    <groupId>com.jheck.example</groupId>
                    <artifactId>example-war</artifactId>
                    <type>war</type>
                    <!-- <properties>
                      <plan>${basedir}/src/deployment/geronima.plan.xml</plan>
                    </properties> -->
                    <pingURL>http://localhost:8080/example-war</pingURL>
                  </deployable>
                </deployables>
              </deployer>
            </configuration>
          </execution>
          <execution>
            <id>stop-container</id>
            <phase>post-integration-test</phase>
            <goals>
              <goal>stop</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

</project>
2 голосов
/ 06 октября 2008

В настоящее время я работаю над более конкретным плагином, который может быть легко «преобразован» в простой внешний исполнитель задач, но ... есть еще несколько вещей, которые следует учитывать.

  1. Откуда вы знаете, что процесс фактически начался?
  2. Что вы делаете с кодом возврата?
  3. Как убедиться, что плагин executor запускается первым (привязать его к фазе test-compile)?

Я уверен, что было бы больше, если бы я действительно начал разработку плагина, но действительно ли нужен универсальный исполнитель?

UPDATE:

Я думаю, что есть ... есть отличный набор плагинов Maven в CodeHaus. Вот тот, который вы хотите: http://mojo.codehaus.org/exec-maven-plugin/.

1 голос
/ 23 августа 2011

Вы, вероятно, хотите связать свои фактические интеграционные тесты с фазой интеграционных тестов жизненного цикла maven. Если вы используете плагин, который является отказоустойчивым (например, метко названный failsafe плагин) для проведения реального тестирования, вы можете запустить свои фазы следующим образом:

тест перед интеграцией : запустить внешнее приложение (используя плагин exec или одно из других предложений здесь)

интеграционный тест : запуск реальных интеграционных тестов с использованием отказоустойчивого плагина

тест после интеграции : завершите работу внешнего приложения и выполните любую другую необходимую очистку

verify : Плагин failsafe проверяет результаты теста и завершает сборку на этом этапе

Использовать плагин exec довольно просто, трюк в том, чтобы запустить ваше приложение в фоновом режиме . Вы должны быть осторожны, чтобы убедиться, что приложение полностью запущено, прежде чем начинать тестирование на следующем этапе. К сожалению, запуск вашего приложения и проверка его работоспособности в фоновом режиме не всегда тривиальная задача, и особенности того, как это сделать, зависят от вашего приложения. Это часто включает в себя пользовательский код в приложении.

0 голосов
/ 07 октября 2008

Хотите запустить сервер приложений? Взгляните на Cargo и его Плагин Maven .

...