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.