Domanda

Voglio test di integrazione completamente automatizzati per un progetto Maven. I test di integrazione richiedono che un programma esterno (dipendente dalla piattaforma) venga avviato prima di essere eseguito. Idealmente, il programma esterno verrebbe ucciso al termine dei test unitari, ma non è necessario.

Esiste un plugin Maven per raggiungere questo obiettivo? Altre idee?

È stato utile?

Soluzione

È possibile utilizzare il plug-in antrun . Al suo interno useresti exec applica compito.

Qualcosa del genere.

<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>

Il supporto di formiche ovviamente per comandi specifici tramite l'operazione task condizione .

Altri suggerimenti

Attualmente sto lavorando a un plug-in più specifico che potrebbe essere facilmente "degradato" essere un semplice esecutore esterno ma ... ci sono molte altre cose da considerare.

  1. Come sai che il processo è effettivamente iniziato?
  2. Cosa fai con il codice di ritorno?
  3. Come assicurarsi che il plug-in di esecuzione sia eseguito per primo (associarlo alla fase di compilazione del test)?

Sono sicuro che ci sarebbe di più se davvero iniziassi a sviluppare il plugin, ma c'è davvero bisogno di un programma di esecuzione generico?

UPDATE:

Suppongo che ci sia ... c'è un eccellente set di plugin Maven su CodeHaus. Ecco quello che vuoi: http://mojo.codehaus.org/exec-maven-plugin / .

Il plugin cargo maven è una buona strada da percorrere se si sta sviluppando servlet e si desidera distribuire la WAR risultante per i test di integrazione.

Quando lo faccio da solo, spesso organizzo un progetto multi-modulo (anche se non strettamente) e incapsulo tutti i test di integrazione in quell'unico modulo. Quindi abilito il modulo con i profili (o meno) in modo che non blocchi l'immediato " sì, so di averlo rotto " costruisce.

Ecco il pom di quel modulo di test funzionale: rendilo quello che vuoi:

<?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>

Probabilmente si desidera associare i test di integrazione effettivi alla fase di test di integrazione del ciclo di vita di Maven. Se si utilizza un plug-in non sicuro (come il plug-in fail-safe con nome appropriato) per eseguire i test effettivi, è possibile eseguire le fasi in questo modo:

test pre-integrazione : avvia un'applicazione esterna (usando il plugin exec o uno degli altri suggerimenti qui)

test di integrazione : esegui i test di integrazione effettivi utilizzando il plug-in fail-safe

test post-integrazione : chiudi l'applicazione esterna e fai qualsiasi altra pulizia necessaria

verifica : fai in modo che il plug-in fail-safe verifichi i risultati del test e fallisca la compilazione a questo punto

È abbastanza semplice usare il plugin exec, il trucco è avviare la tua applicazione in background . Dovresti fare attenzione a assicurarti che l'app sia completamente attiva prima di iniziare i test nella fase successiva. Sfortunatamente, ottenere l'applicazione e assicurarsi che sia abbastanza in esecuzione durante l'esecuzione in background non è sempre un compito banale e le specifiche di come farlo dipendono dall'applicazione. Spesso comporta codice personalizzato nell'applicazione.

Vuoi avviare un application server? Dai un'occhiata a Cargo e ai suoi plugin Maven .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top