2009-04-21 14 views
54

Me gustaría que mis compilaciones Maven ejecuten la mayoría de las pruebas unitarias. Pero hay pruebas unitarias en un proyecto que son más lentas y me gustaría generalmente excluirlas; y ocasionalmente encenderlos.Saltarse pruebas en algunos módulos en Maven

Pregunta: ¿Cómo puedo hacer esto?

Conozco -Dmaven.test.skip=true, pero eso desactiva todas las pruebas unitarias.

También sé acerca de omitir las pruebas de integración, se describe here. Pero no tengo pruebas de integración, solo pruebas unitarias, y no tengo llamadas explícitas al plugin maven-surefire. (Estoy usando Maven 2 con el plugin Eclipse-Maven).

Respuesta

63

¿Qué sucede si omite las pruebas solo en este módulo?

En el pom.xml de este módulo:

<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> 

Eventualmente, puede crear un perfil que va a desactivar las pruebas (siendo el pom.xml del módulo):

Con la última solución, si ejecuta mvn clean package, ejecutará todas las pruebas. Si ejecuta mvn clean package -DnoTest=true, no ejecutará las pruebas para este módulo.

+1

Gracias que funcionó. El primer fragmento de código omite la prueba; Posteriormente, puedo usar su sugerencia adicional para definir otro perfil. Mi confusión estaba en el hecho de que mi pom invocaba implícitamente infalible. No se mencionó el plugin surefire en mi pom.xml. No obstante, el código para configurar el plugin surefire correctamente lo hizo. –

+0

Para otros, otra opción es omitir todo el módulo hasta que quieras compilarlo y verificarlo: http://stackoverflow.com/a/5542779/543935 – yellavon

+0

Y aquí te mostramos cómo crear un perfil de administrador que ejecute pruebas solo por si acaso está activado: http://stackoverflow.com/questions/34334257/why-maven-runs-profile-plugin-even-if-profile-is-not-activated/41808680#41808680 – Vadzim

27

creo que esto es más fácil, y también tiene el beneficio de trabajar para pruebas no éxito seguro (en mi caso, FlexUnitTests)

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

Esto no omitirá las pruebas aquí, con o sin -DnoTest = true – rwst

+4

Eso es porque debe usar -PnoTest en lugar de -DnoTest = true –

+1

Establecer maven.test.skip en true también tiene el efecto de omitir la compilación de prueba, donde skipTests aún compila las pruebas pero no las ejecuta. – CoverosGene

1

Si usted tiene un proyecto de varios módulos grandes y que le gustaría omitir pruebas sólo en ciertos módulos sin la necesidad de cambiar cada uno de los archivos del módulo pom.xml con configuración personalizada y perfilado, se puede añadir lo siguiente a los padres pom.xml archivo:

<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> 

Gracias a la build-helper-maven-plugin lo haría real Verifique dinámicamente si se encuentra en un determinado módulo o no durante la construcción, a través de la propiedad project.artifactId (señalando cada módulo artifactId durante la construcción), la expresión regular buscará la coincidencia para ciertos valores (los nombres de los módulos para los que desea omitir pruebas) y llenó la propiedad maven.test.skip en consecuencia (configurándola en true).

En este caso, las pruebas se saltearán para module1 y module3 mientras se ejecutan correctamente para module2, es decir, según lo expresado por la expresión regular.

La ventaja de este enfoque es tenerlo dinámico y centralizado (en el elemento principal pom.xml), por lo tanto, mejor para el mantenimiento: puede agregar o eliminar módulos en cualquier momento simplemente cambiando la expresión regular simple anterior.

Obviamente, si este no es el comportamiento predeterminado de la compilación (caso recomendado), siempre puede envolver el fragmento anterior en un maven profile.


También podría ir más allá y tener un comportamiento dinámico basado en su entrada:

<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> 

realidad, nos encontramos reemplazando el valor de expresiones regulares con una propiedad, test.regex, con el valor por defecto a none (o lo que sea no coincidiría con ningún nombre de módulo o, también, los emparejamientos de omisión predeterminados requeridos).

Entonces, desde la línea de comandos que podríamos haber

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) 

Eso es, a continuación, en tiempo de ejecución que decida, sin ninguna necesidad de cambiar el archivo pom.xml o la activación de cualquier perfil.

1

Usando éxito seguro Plugin 2.19 puede simplemente excluir las pruebas que no desea el uso de expresiones regulares:

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

El comando anterior excluir todas las pruebas que contienen excludedString.

NB1 Si comillas dobles (") se utiliza en lugar del apóstrofe (') el comando no se puede interpretar correctamente y producirá resultados inesperados. (Probado utilizando fiesta 3.2.57)

NB2 Se debe prestar especial atención a los proyectos en los que se usa una versión múltiple del complemento surefire. Las versiones de Surefire anteriores a 2.19 no ejecutarán ninguna prueba porque no admiten expresiones regulares.

Administración de versiones (podría ser una buena idea) para agregar esto en el archivo pom padre):

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

ejemplos de comandos de compilación que se saltan las pruebas: https://artbcode.com/how-to-skip-a-subset-of-the-unit-tests/

+0

¿Alguna idea de cómo omitir varios patrones? –

+0

'-Dtests' no funciona bien con surefire parece. A continuación, se omiten TODAS mis pruebas: 'mvn '-Dtest =!% Regex [. * DeviceLogServiceTest. *]' --quiet install -Dsurefire.useFile = false -Dsurefire.printSummary = false -Dmaven.test.skip = falso' –

2

que tenían una necesidad ligeramente diferente a esta pregunta que puede resultar muy útil. Quería excluir de la línea de comandos algunas pruebas diferentes de diferentes paquetes, por lo que un comodín único no lo haría.

que encontré en las reglas de documentación Maven a prueba de fallos para las exclusiones que se pueden especificar una lista separada por comas de cualquiera de expresiones regulares o exclusiones comodín: https://maven.apache.org/surefire/maven-failsafe-plugin/examples/inclusion-exclusion.html

Así que mi pomfile era la siguiente:

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

y mi línea de comandos incluía esto:

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

Para mí, el ingrediente clave era conseguir un montón de tes ts en una propiedad maven en una sola declaración de exclusión.

Cuestiones relacionadas