Domanda

Vorrei che il mio Maven costruisce per eseguire la maggior parte dei test di unità. Ma ci sono test di unità in un unico progetto, che sono più lento e mi piacerebbe escluderli in generale; e, occasionalmente, accenderli.

Domanda :? Come faccio a fare questo

So di -Dmaven.test.skip=true, ma che spegne tutti i test di unità.

So anche di saltare i test di integrazione, descritto qui . Ma non ho test di integrazione, test di unità solo, e non ho nessuna chiamata esplicita al Maven-infallibile-plugin. (Sto usando Maven 2 con il plugin Eclipse Maven).

È stato utile?

Soluzione

Che dire di saltare i test solo in questo modulo?

Nel pom.xml di questo modulo:

<project>
  [...]
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.4.2</version>
        <configuration>
          <skipTests>true</skipTests>
        </configuration>
      </plugin>
    </plugins>
  </build>
  [...]
</project>

Alla fine, è possibile creare un profilo che consente di disattivare i test (ancora il pom.xml del modulo):

<project>
  [...]
  <profiles>
    <profile>
      <id>noTest</id>
      <activation>
        <property>
          <name>noTest</name>
          <value>true</value>
        </property>
      </activation>
      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.4.2</version>
            <configuration>
              <skipTests>true</skipTests>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </profile>
  </profiles>
  [...]
</project>

Con la seconda soluzione, se si esegue mvn clean package, verrà eseguito tutti i test. Se si esegue mvn clean package -DnoTest=true, non verrà eseguito il test per questo modulo.

Altri suggerimenti

Credo che questo è più facile, e ha anche il vantaggio di lavorare per prove non infallibili (nel mio caso, FlexUnitTests)

<profile>
   <id>noTest</id>
    <properties>
       <maven.test.skip>true</maven.test.skip>
    </properties>
 </profile>

Se si dispone di un grande progetto multi-modulo e volete saltare i test solo in alcuni moduli, senza la necessità di cambiare ciascuno dei file del modulo pom.xml con configurazione personalizzata e profilatura, si potrebbe aggiungere il seguente al file principale pom.xml :

<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>build-helper-maven-plugin</artifactId>
            <version>1.12</version>
            <executions>
                <execution>
                    <id>regex-property</id>
                    <goals>
                        <goal>regex-property</goal>
                    </goals>
                    <configuration>
                        <name>maven.test.skip</name>
                        <value>${project.artifactId}</value>
                        <regex>(module1)|(module3)</regex>
                        <replacement>true</replacement>
                        <failIfNoMatch>false</failIfNoMatch>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
<modules>
    <module>module1</module>
    <module>module2</module>
    <module>module3</module>
</modules>

Grazie alla build-helper-maven-plugin si sarebbe effettivamente controllare dinamicamente se si è in un certo modulo o non durante la compilazione, tramite la proprietà project.artifactId (indicando ogni modulo artifactId durante la compilazione), l'espressione regolare sarebbe poi cercare di corrispondenza per certi valori ( i nomi dei moduli per i quali si desidera saltare i test) e popolato la proprietà maven.test.skip di conseguenza (impostandolo a true).

In questo caso, le prove sono saltati per module1 e module3 mentre funziona correttamente per module2, cioè, come espresso dal regex.

Il vantaggio di questo approccio è di averlo dinamico e centralizzato (nel pom.xml genitore) quindi meglio per la manutenzione: è possibile aggiungere o rimuovere moduli in qualsiasi momento semplicemente cambiando la semplice espressione regolare sopra

.

Ovviamente, se questo non è il comportamento di default della build (caso consigliato), si può sempre avvolgere il frammento di codice in un profilo Maven .


Si potrebbe anche andare oltre e avere un comportamento dinamico sulla base di input:

<properties>
    <test.regex>none</test.regex>
</properties>

<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>build-helper-maven-plugin</artifactId>
            <version>1.12</version>
            <executions>
                <execution>
                    <id>regex-property</id>
                    <goals>
                        <goal>regex-property</goal>
                    </goals>
                    <configuration>
                        <name>maven.test.skip</name>
                        <value>${project.artifactId}</value>
                        <regex>${test.regex}</regex>
                        <replacement>true</replacement>
                        <failIfNoMatch>false</failIfNoMatch>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

Qui in realtà stiamo sostituendo il valore regex con una proprietà, test.regex, con valore di default per none (o qualsiasi altra cosa non avremmo adattarsi a qualsiasi nome del modulo o, anche, il default saltare abbinamenti richiesto).

Poi da linea di comando potremmo avere

mvn clean test -Dtest.regex="(module1)" > will skip tests only for module1
mvn clean test -Dtest.regex="(module1)|(module2)" > will skip tests on module1 and module2
mvn clean test -Dtest.regex="(module1)|(module2)|(module3)" > will skip the three module tests
mvn clean test -Dtest.regex=".+" > will skip all module tests
mvn clean test > would not skip anything (or fall back on default behavior)

Cioè, allora in fase di esecuzione si decide, senza alcun bisogno di modificare il file pom.xml o attivare qualsiasi profilo.

ho avuto un bisogno leggermente diversa da questa domanda che può rivelarsi utile. Ho voluto escludere dalla riga di comando alcuni test differenti da diversi pacchetti, per cui un singolo carattere jolly non lo farei.

Ho trovato nelle norme di documentazione Maven Failsafe per le esclusioni che è possibile specificare un elenco separato da virgole di un'espressione regolare o esclusioni jolly: https://maven.apache.org/surefire/ Maven-fail-safe-plugin / examples / inclusione-exclusion.html

Quindi il mio pomfile si presentava così:

<excludes>
    <exclude>${exclude.slow.tests}</exclude>
</excludes>

e la mia linea di comando incluso in questo modo:

mvn install "-Dexclude.slow.tests=**/SlowTest1.java, **/package/ofslowtests/*.java, **/OtherSlowTest.java"

Per me l'ingrediente chiave stava diventando un po 'di test in una proprietà Maven in una singola istruzione escludere.

Utilizzando infallibile Plugin 2.19 si può semplicemente escludere le prove che non si desidera utilizzare le espressioni regolari:

mvn '-Dtest=!%regex[.*excludedString.*]' test

Il comando sopra escluderà tutti i test che contengono excludedString .

NB1 Se virgolette doppie ( ") viene usato al posto di apostrofo ( ') il comando non verrà interpretato correttamente e produrrà risultati imprevisti. (Testata utilizzando bash 3.2.57)

NB2 Una particolare attenzione dovrebbe essere prestata ai progetti in cui è utilizzata la versione multipla del plugin infallibile. Le versioni di infallibile di età superiore a 2.19 non verranno eseguiti alcun test perché non supportano le espressioni regolari.

Gestione delle versioni (che potrebbe essere una buona idea per aggiungere questo nel file principale pom):

<build>
  <pluginManagement>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.19.1</version>
      </plugin>
    </plugins>
  </pluginManagement>
</build>

Esempi di comandi di compilazione che saltano test: https://artbcode.wordpress.com/2016/11/28/how-to-skip-a-subset-of-the-unit-tests/

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top