Iniciando processo externo durante os testes de integração no maven
-
05-07-2019 - |
Pergunta
Eu quero totalmente automatizado testes de integração para um projeto Maven. Os testes de integração exigem que um programa externo (dependente de plataforma) é iniciado antes de executar. Idealmente, o programa externo seria morto após os testes de unidade terminar, mas não é necessário.
Existe um plugin Maven para alcançar este objetivo? Outras idéias?
Solução
Você pode usar o antrun plugin. Dentro você usaria da formiga exec se candidatar tarefa.
Algo como isso.
<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>
comandos apoio Ant OS específicos do curso através do tarefa condição .
Outras dicas
Atualmente estou trabalhando em um plug-in mais específico que poderia facilmente ser "degradado" para ser um simples executor de tarefas externa, mas ... há algumas outras coisas a considerar.
- Como você sabe que o processo começou realmente?
- O que você faz com o código de retorno?
- Como você certificar-se o executor do plugin é executado primeiro (vinculá-lo a fase de teste-compilação)?
Eu tenho certeza que seria mais se eu realmente começou a desenvolver o plugin, mas há realmente uma necessidade de um executor genérico?
UPDATE:
Eu acho que há ... há um excelente conjunto de plugins Maven no Codehaus. Aqui está o que você quer: http://mojo.codehaus.org/exec-maven-plugin / .
O plugin de carga Maven é um bom caminho a percorrer se você está fazendo o desenvolvimento de servlet e deseja implementar o WAR resultando para testes de integração.
Quando eu faço isso mesmo, muitas vezes eu configurar um projeto multi-módulo (embora isso não seja estritamente nessecarily) e encapsular todos os testes de integração em que um módulo. Eu, então, ativar o módulo com perfis (ou não) para que ele não está bloqueando o imediato "sim, eu sei que eu quebrei" constrói.
Aqui está o pom daquele módulo de teste funcional - Faça dela o que você vai:
<?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>
Você provavelmente deseja ligar os testes de integração reais para a fase de integração-teste do maven ciclo de vida. Se você usar um plugin que não seguro (como o apropriadamente chamado à prova de falhas plugin) para fazer o teste real, você pode então executar suas fases como esta:
pré-integração-test : iniciar a aplicação externa (usando o plugin exec ou uma das outras sugestões aqui)
integração-test : Execute os testes de integração reais usando o plug-in à prova de falhas
pós-integração-test : desligar o aplicativo externo e fazer qualquer outra limpeza necessária
verificar : Ter a prova de falhas plugin de verificar os resultados do teste e falhar a construir neste momento
É bastante simples de usar o plugin exec, o truque é fazer com que a aplicação iniciada up em segundo plano . Você deve ter cuidado para se certificar de que o aplicativo é totalmente antes de iniciar os testes na próxima fase. Infelizmente, ficando o seu aplicativo para cima e certificando-se de que é o suficiente durante a execução em segundo plano nem sempre é uma tarefa trivial, e os detalhes de como fazer isso dependerá de sua aplicação. Muitas vezes envolve código personalizado na aplicação.
Você deseja iniciar um servidor de aplicativos? Ter um olhar para Carga e sua Maven plug-in .