Impedisci test unitari ma consenti test di integrazione in Maven


157

Ho una build Maven in cui utilizzo il plug-in SureFire per eseguire alcuni test unitari e il plug-in FailSafe per eseguire alcuni test di integrazione. Vorrei un modo per eseguire solo i test del plugin FailSafe.

Non è una buona soluzione per me aggiungere profili diversi o altro nel pom, perché è una build multimodulo e non voglio modificare il pom di ogni modulo.

Ci sono skip.testse maven.test.skipe skipTestsche si fermano tutti i test, e skipITs, che si ferma solo il fail-safe plugin.

Quindi, esiste un flag da riga di comando per Maven come skipITs, ma invece con la funzionalità di "onlyITs"?


Hai provato maven.test.skipo skipTests?
Thomas

1
@khmarbaise in teoria, sì. Ma nella maggior parte dei progetti in cui ho lavorato, i "test unitari" in cui in realtà test di integrazione con un db in memoria (se sei stato fortunato)
Sean Patrick Floyd,

9
@khmarbaise Molti test unitari. Ci vogliono un paio di minuti per correre e non abbiamo bisogno che corrano in questa circostanza. In particolare, eseguiamo test unitari prima di costruire l'artefatto (ovviamente), ma vogliamo eseguire gli IT in più ambienti. A questo punto non è più necessario rieseguire i test unitari.
Matthew Gilliard,

2
Ciao @khmarbaise, nel mio setup skipTestssalta solo i test infallibili, non il test fail-safe! Forse è una nuova funzionalità?
danidemi,

2
Cordiali saluti: skipTests è ora deprecato nel plug-in Failsafe 3.0.0-M3 ( SUREFIRE-1611 )
Guillaume Husta,

Risposte:


171

Ho trovato il modo più semplice per saltare solo i test infallibili è configurare infallibile ( ma non sicuro ) come segue:

<plugin>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.14</version>
    <configuration>
        <!-- skips surefire tests without skipping failsafe tests.
                 Property value seems to magically default to false -->
        <skipTests>${skip.surefire.tests}</skipTests>
    </configuration>
</plugin>

Ciò consente di eseguire mvn verify -Dskip.surefire.testse solo i test infallibili, non sicuri, verranno saltati; eseguirà anche tutte le altre fasi necessarie, tra cui la pre-integrazione e la post-integrazione, e realizzerà anche l' verifyobiettivo che è necessario per far fallire effettivamente la tua build maven se i test di integrazione falliscono.

Si noti che questo ridefinisce la proprietà utilizzata per specificare che i test devono essere saltati, quindi se si fornisce il canonico -DskipTests=true, infallibile lo ignorerà ma fail-safe lo rispetterà, il che potrebbe essere inaspettato, soprattutto se si hanno build / utenti esistenti che specificano già quel flag. Una semplice soluzione sembra essere l'impostazione predefinita skip.surefire.testsdel valore di skipTestsnella <properties>sezione del pom:

<properties>
    <skip.surefire.tests>${skipTests}</skip.surefire.tests>
</properties>

Se necessario, è possibile fornire un parametro analogo chiamato skip.failsafe.testsper fail-safe, tuttavia non l'ho trovato necessario, poiché i test unitari di solito vengono eseguiti in una fase precedente e se si desidera eseguire test unitari ma non test di integrazione, eseguirei la testfase anziché la verifyfase. Le tue esperienze possono variare!

Queste skip.(surefire|failsafe).testsproprietà dovrebbero probabilmente essere integrate nel codice surefire / fail-safe stesso, ma non sono sicuro di quanto violerebbe l'ethos "sono esattamente lo stesso plugin tranne 1 piccola differenza".


4
Utilizzando questa soluzione sono stato in grado di impostare il mio framework in modo che -DskipUnitTests salti il ​​plug-in surefire, -DskipIntegrationTests salti il ​​plug-in fail-safe e DskipTests salta entrambi. Esattamente quello che serviva!
Alex Jansen,

2
il mio IDE si lamenta di "impossibile risolvere il simbolo 'skipTests'" la soluzione era aggiungere una riga <skipTests>false</skipTests>che funziona ancora con qualsiasi combinazione di -DskipTests o -Dskip.surefire.tests poiché gli argomenti della riga di comando sembrano sovrascrivere le proprietà stackoverflow.com/questions/13708738 / ... potresti aggiungerlo alla tua soluzione
globalworming,

<skipTests>${skip.surefire.tests}</skipTests>non funziona con la maven-surefire-pluginversione 3.0.0-M3. Tutti i test infallibili sono ancora in corso. Qualcun altro l'ha trovato? La soluzione di seguito di Sean Patrick Floyd funziona comunque.
John Meyer,

120

Una soluzione alternativa sarebbe quella di chiamare:

mvn clean test-compile failsafe:integration-test

Certo, questo è brutto, ma potrebbe risolvere il tuo problema.


O (un altro hack):

mvn clean integration-test -Dtest=SomePatternThatDoesntMatchAnything -DfailIfNoTests=false

Riferimento:


1
Il secondo suggerimento ha funzionato per me. il test pre-integrazione è stato chiamato con successo
Lawrence Tierney,

7
E 'questa una buona idea? Questo risultato non avrà esito positivo anche se i test di integrazione falliscono? Questa è la vera essenza di fail-safe, se non si esegue anche l'obiettivo "verifica" . Citazione: "Il plug-in Failsafe non fallirà la compilazione durante la fase di test di integrazione". Devi eseguire l'obiettivo di verifica per dirti effettivamente se i test di integrazione sono riusciti o meno!
bacar,

2
@bacar ha ragione, ma basta usare verifyinvece che integration-testnella seconda soluzione.
Matthew Gilliard,

1
Dovresti effettivamente vedere la risposta di @bacar per una soluzione molto migliore.
FBB

12
Se aggiungi failsafe:verifyalla fine del primo hack ( mvn clean test-compile failsafe:integration-test failsafe:verify), la compilazione fallirà se uno dei test di integrazione fallisce.
Shadow Man,

73

Sto usando il codice del blog di Antonio Goncalves , che funziona perfettamente.

È possibile utilizzare le seguenti proprietà:

-DskipUTs=true per saltare i test infallibili.

-DskipITs=true per saltare i test di sicurezza.

-DskipTests=true per saltare tutti i test.

Il pom.xmlè il seguente:

<properties>
    <skipTests>false</skipTests>
    <skipITs>${skipTests}</skipITs>
    <skipUTs>${skipTests}</skipUTs>
</properties>
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.19.1</version>
            <configuration>
                <skipTests>${skipUTs}</skipTests>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-failsafe-plugin</artifactId>
            <version>2.19.1</version>
            <executions>
                <execution>
                    <id>run-integration-tests</id>
                    <phase>integration-test</phase>
                    <goals>
                        <goal>integration-test</goal>
                        <goal>verify</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <skipTests>${skipTests}</skipTests>
                <skipITs>${skipITs}</skipITs>
            </configuration>
        </plugin>
    </plugins>
</build>

2
grazie, ottimo approccio! è anche utile sovrascrivere l'esecuzione predefinita di surefire (default-test) vedi: stackoverflow.com/questions/11935181/…
pls

1
questo è il motivo per cui a volte devi scorrere verso il basso e cercare una buona soluzione funzionante con tutte le informazioni richieste. Grazie per aver condiviso
Atul Chaudhary il

Davvero una bella soluzione. Tuttavia, la configurazione fail-safe è ridondante come skipITsquella predefinita.
timomeinen,

SkipITs è un'opzione personalizzata in questa configurazione. Hai ragione nell'implementazione predefinita, ma questa non era la domanda dei PO.
Martijn Burger,

Complimenti, sei un guru malvagio! Questo dovrebbe essere nel superpom di Maven.
Adam,

22

Spero che questo ti aiuti!

Prova a eseguire il test solo con FailSafe (plug-in per test di integrazione: ti consentirà di eseguire solo test di integrazione con questo tipo di denominazione, per impostazione predefinita: * / IT .java, ** / IT.java, * /*ITCase.java ;, ma puoi facilmente cambiarlo dal file pom)

mvn failsafe:integration-test

E quando vuoi usare solo SureFire (plugin per unit-test)

mvn surefire:test

o un test alla volta con:

mvn -Dtest=MyUnitlTest

9

Mi piace così ogni fase viene normalmente eseguita:

 mvn -Dtest=foo -DfailIfNoTests=false verify

1
Questa è la soluzione più semplice (e onestamente la più geniale)!
Titulum

non richiede l'aggiunta di nulla nel pom come richiesto dall'OP ed esegue tutte le fasi come indicato. Bella risposta.
jnichols959,

1

Per espandere i commenti di @danidemi e @GuillaumeHusta:

Cordiali saluti: skipTests è ora obsoleto nel plug-in Failsafe 3.0.0-M3 ( SUREFIRE-1611 )

Quindi per saltare i test unitari, ma non i test di integrazione, puoi farlo se stai usando l'ultima versione del plugin Failsafe:

mvn verify -DskipTests

(per favore dai un voto ai commenti citati se questo ti aiuta)


-3

Prova a eseguire l'integrazione o i test unitari in un profilo separato. Quindi puoi semplicemente abilitare / disabilitare il profilo.


Forse aggiungi il genitore in cui definisci il profilo che esegue solo IT? tutti i moduli secondari del progetto possono ereditare da quel pom, quindi non è necessario modificare ogni pom o eseguire i moduli con switch speciali (poiché è possibile attivare il profilo in assenza di proprietà).
Yoosiba,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.