5

Sto provando a decidere come creare una serie di test di accettazione per un'applicazione web Java-EE.Come eseguire i test dopo la distribuzione utilizzando Maven?

Ecco la configurazione: Maven viene utilizzato per generare un file WAR e distribuirlo in Glassfish. Alla distribuzione, lo schema del database MySQL viene automaticamente aggiornato dalle classi del modello usando Hibernate (opzione "hbm2ddl = auto").

I test di accettazione devono testare il codice distribuito richiamando vari metodi e verificando che i risultati siano come previsto (*). Abbiamo scritto un set aggiuntivo di pacchetti da collegare a un sistema esistente in modo che i test di accettazione mostrino come questi possono essere integrati nella base di codice esistente.

(*) Questo può sembrare più simile a Unità/Test di integrazione, ma sono test di accettazione nel senso che dovrebbero dimostrare che cosa abbiamo fatto e devono essere eseguiti dopo la distribuzione in modo che sia presente un database.

Da quanto sopra, il mio pensiero corrente è di usare JUnit per controllare i valori attesi, ecc. Il problema con cui sto combattendo è come richiamare questi test dopo la distribuzione. "deploy" è l'ultima fase di Maven, quindi non è sicuro se questo è possibile?

+0

Non sono sicuro che sia davvero necessario eseguire l'implementazione prima del test. Per il test di integrazione, possiamo usare DBUnit e il database sarà disponibile sul posto. –

+0

Grazie, ma è vero anche se il database viene generato dalle classi usando Hibernate? Non ho mai usato DBUnit (ma l'ho incontrato qui alcune volte quando cercavo di trovare delle risposte per questo), quindi avrei dovuto esaminare questo. –

+0

sì, è vero; Attualmente lo uso per i test di integrazione. –

risposta

5

Solo perché quella fase è denominata deploy non significa che è necessario utilizzarlo per distribuire l'applicazione per il test. In realtà, dovrebbe essere utilizzato solo per "distribuire" l'artefatto in un repository di esperti. Leggere la descrizione del Maven lifecycle phases e vedrete che ci sono alcune fasi dedicati al vostro caso d'uso:

pre-integration-test 
integration-test 
post-integration-test 

Date un'occhiata al Cargo Maven plugin. È fatto per distribuire il tuo file WAR in vari contenitori per il test. Mostrano sicuramente demo di casi d'uso come quello che descrivi sul tuo sito. Mi aspetto che in definitiva tu possa utilizzare Cargo per la distribuzione sul tuo contenitore (da una delle fasi precedenti come il test di pre-integrazione)

Nota, Jenkins ha anche un plug-in che è un wrapper attorno al plug-in Cargo. Quindi potresti fare quello che ti serve tramite Jenkins. Inoltre, non è necessario eseguire il lavoro di build Jenkins come distribuito con mvn clean. È possibile avere un processo di compilazione che esegue solo i test di integrazione e genera un altro processo di "distribuzione" solo quando ha esito positivo.

+0

Ciao, grazie per la tua risposta - un buon punto che le fasi possono essere utilizzate in un modo ad hoc. Ma c'è qualcosa di fondamentale che non sto capendo qui. Scrivo il codice Java, lo compilo in un file WAR e poi lo distribuisco al server delle applicazioni (Glassfish). È il server delle applicazioni in cui risiede il database (e viene aggiornato da Hibernate), quindi come potrei essere in grado di testare le comunicazioni con il database ecc. Prima della distribuzione? Sicuramente il database non esisterebbe? È qui che arrivano i contenitori: simulano in qualche modo un server delle applicazioni senza la necessità di una distribuzione completa? –

+1

GlassFish è un contenitore supportato Cargo. Supporta la distribuzione in un contenitore esterno esistente o un contenitore ad hoc sparato e abbattuto, vivendo solo per lo scopo del test. Immagino che quello che sto dicendo è che Cargo è un prodotto di alta qualità fatto per il tuo caso d'uso. Lo controllerei;) – chad

4

Se è davvero necessario eseguire operazioni dopo la distribuzione, è possibile eseguire fail safe e, in base alle implicazioni, JUnit come parte della fase di distribuzione.

Quello che faccio di solito, se avere un modulo separato. Quindi, puoi avere un progetto Maven, che contiene il tuo progetto e un progetto separato "test di implementazione". Quindi, la creazione del progetto padre creerà ed eseguirà la tua guerra e quindi eseguirà i test di distribuzione. Puoi usare junit come al solito.

Il secondo si adatta meglio a jenkins perché avrai ancora un singolo progetto.

+0

Grazie per la risposta! Sono propenso a fare qualcosa di simile. Uno svantaggio è che mi piacerebbe essere in grado di eseguire/debug facilmente i test in Eclipse. Immagino che ciò sia possibile attraverso il debug remoto ma molto più prolisso. –

Problemi correlati