Test di integrazione con il plug-in Maven Cargo

Una necessità molto comune nel ciclo di vita di un progetto è la creazione di test di integrazione. Fortunatamente, Maven ha il supporto integrato per questo scenario esatto, con le seguenti fasi del ciclo di vita della build predefinito (dalla documentazione di Maven):

  • pre-integration-test : eseguire le azioni richieste prima che vengano eseguiti i test di integrazione. Ciò può comportare cose come l'impostazione dell'ambiente richiesto.
  • test di integrazione : elaborare e distribuire il pacchetto, se necessario, in un ambiente in cui è possibile eseguire i test di integrazione.
  • post-integration-test : esegue le azioni richieste dopo che i test di integrazione sono stati eseguiti. Ciò può includere la pulizia dell'ambiente.

Innanzitutto, il plug-in maven-surefire è configurato in modo che i test di integrazione siano esclusi dal ciclo di vita della build standard:

 org.apache.maven.plugins maven-surefire-plugin 2.17   **/*IntegrationTest.java   

Le esclusioni vengono eseguite tramite espressioni di percorso in stile formica, quindi tutti i test di integrazione devono seguire questo schema e terminare con "IntegrationTest.java ".

Successivamente, viene utilizzato il plug-in cargo-maven2 , poiché Cargo viene fornito con un supporto di prim'ordine per i server web incorporati. Ovviamente, se l'ambiente del server richiede una configurazione specifica, cargo sa anche come costruire il server da un pacchetto archiviato e come distribuirlo su un server esterno.

 org.codehaus.cargo cargo-maven2-plugin 1.4.8   jetty8x embedded    8080    

Viene definito un server web Jetty 8 incorporato, in ascolto sulla porta 8080.

Nella versione più recente di carico (1.1.0 verso l'alto), il valore di default del attesa di bandiera è stato modificato in falso, per il carico: start . Questo obiettivo deve essere utilizzato solo per eseguire test di integrazione ed è vincolato al ciclo di vita di Maven; per lo sviluppo, invece, dovrebbe essere eseguito l'obiettivo cargo: run , che ha wait = true .

Affinché la fase di creazione del pacchetto generi un file war distribuibile , il pacchetto del progetto deve essere: war .

Successivamente, viene creato un nuovo profilo Maven di integrazione per consentire l'esecuzione dei test di integrazione solo quando questo profilo è attivo e non come parte del ciclo di vita della build standard.

  integration   ...    

È questo profilo che conterrà tutta la configurazione rimanente.

Ora, il server Jetty è configurato per iniziare nella fase di pre-integrazione-test e fermarsi nella fase di post-integrazione-test .

 org.codehaus.cargo cargo-maven2-plugin  false    start-server pre-integration-test  start    stop-server post-integration-test  stop    

Ciò garantisce che il carico: obiettivo di avvio e carico: obiettivo di arresto vengano eseguiti prima e dopo la fase di test di integrazione . Nota che poiché ci sono due definizioni di esecuzione individuali , l' elemento id deve essere presente (e diverso) in entrambi, in modo che Maven possa accettare la configurazione.

Successivamente, la configurazione del plug-in maven-surefire deve essere sovrascritta all'interno del profilo di integrazione , in modo che i test di integrazione che sono stati esclusi nel ciclo di vita predefinito vengano ora inclusi ed eseguiti:

  org.apache.maven.plugins maven-surefire-plugin   integration-test  test    none   **/*IntegrationTest.java      

Ci sono alcune cose che vale la pena notare:

1. L' obiettivo del test del plug-in maven-surefire viene eseguito nella fase di test di integrazione ; a questo punto Jetty è già avviato con il progetto distribuito, quindi i test di integrazione dovrebbero essere eseguiti senza problemi.

2. I test di integrazione sono ora inclusi nell'esecuzione. Per ottenere ciò, anche le esclusioni vengono sovrascritte, questo perché il modo in cui Maven gestisce le configurazioni dei plugin sovrascritte all'interno dei profili. La configurazione di base non è completamente sovrascritta, ma piuttosto aumentata con nuovi elementi di configurazione all'interno del profilo. Per questo motivo l'originale configurazione, che ha escluso i test di integrazione in primo luogo, è ancora presente nel profilo e deve essere sovrascritta, altrimenti sarebbe in conflitto con configurazione e i test non sarebbero stati ancora eseguiti.

3. Nota che, poiché c'è solo un file elemento, non è necessario definire un id .

Ora, l'intero processo può essere eseguito:

mvn clean install -Pintegration

Conclusione

La configurazione passo passo di Maven copre l'intero processo di impostazione del processo di integrazione come parte del ciclo di vita del progetto.

Di solito, questo è impostato per essere eseguito in un ambiente di integrazione continua, preferibilmente dopo ogni commit. Se il server CI ha già un server in esecuzione e consuma porte, la configurazione cargo dovrà affrontare quello scenario, che tratterò in un post futuro.

Per una configurazione completamente funzionante di questo meccanismo, controlla il progetto REST GitHub.

Consulta anche questo articolo per le best practice per strutturare un progetto e organizzare i test di unità e integrazione.