Me gustaría que mi Maven construye para ejecutar la mayoría de las pruebas de unidad. Pero hay pruebas de unidad en uno de los proyectos que son más lentos, y me gustaría que por lo general excluyen a ellos; y, ocasionalmente, enciéndalos.

Pregunta: ¿Cómo puedo hacer esto?

Sé acerca de -Dmaven.test.skip=true, pero que desactiva todas las pruebas de unidad.

También sé acerca de saltarse las pruebas de integración, se describe aquí. Pero no tengo pruebas de integración, sólo de las pruebas unitarias, y no tengo ningún llamadas explícitas a la maven-segura-plugin. (Estoy usando Maven 2 con el Eclipse-plugin de Maven).

InformationsquelleAutor Joshua Fox | 2009-04-21

5 Comentarios

  1. 76

    Lo que acerca de saltarse las pruebas sólo 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, usted puede crear un perfil que se va a deshabilitar las pruebas (que sigue siendo la pom.xml del módulo) :

    <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 segunda solución, si ejecuta mvn clean package, va a ejecutar todas las pruebas. Si ejecuta mvn clean package -DnoTest=true, no va a ejecutar las pruebas para este módulo.

    • Gracias que trabajó. El primer fragmento de código omite la prueba; puedo utilizar el otra sugerencia para definir otro perfil. Mi confusión era en el hecho de que mi pom fue la invocación segura de forma implícita. No hubo ninguna mención de la infalible plugin en mi pom.xml. Sin embargo, el código para configurar el infalible plugin correctamente lo hizo.
    • Para otros, otra opción es abandonar el módulo hasta que se quieren construir y verificar que: stackoverflow.com/a/5542779/543935
    • Y aquí es cómo crear perfil de maven que ejecutará las pruebas sólo en caso de que sea activado: stackoverflow.com/questions/34334257/…
    • ¿Cómo hacer esto para todos, pero un par de módulos en el proyecto?
    • Puede que alguien me explique lo que es el uso de noTest aquí?
  2. 30

    Creo que esto es más fácil, y también tiene el beneficio de trabajar para los no-infalible pruebas (en mi caso, FlexUnitTests)

    <profile>
       <id>noTest</id>
        <properties>
           <maven.test.skip>true</maven.test.skip>
        </properties>
     </profile>
    • Esto no omitir las pruebas aquí, con o sin -DnoTest=true
    • Eso es la causa que debe utilizar -PnoTest en lugar de DnoTest=true
    • Configuración de maven.prueba.saltar a la verdad, también tiene el efecto de omitir la prueba de compilación, donde como skipTests todavía compila las pruebas, pero no las ejecute.
  3. 6

    Si usted tiene un gran multi-módulo de proyecto y te gustaría poder pasar las pruebas sólo en ciertos módulos sin necesidad de cambiar cada uno de los módulo pom.xml archivo con la configuración personalizada y perfiles, se puede añadir lo siguiente a los padres pom.xml de 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 que en realidad dinámicamente comprobar si usted está en un determinado módulo o no durante la construcción, a través de la project.artifactId propiedad (señalando a cada artifactId módulo durante la construcción), la expresión sería entonces buscar la coincidencia de ciertos valores (los nombres de módulo para el que desea omitir pruebas) y rellena el maven.test.skip de la propiedad correspondiente (ajuste true).

    En este caso, las pruebas serán omitidos para module1 y module3 mientras se ejecuta correctamente para module2, que es, como lo expresa el regex.

    La ventaja de este enfoque es dinámico y centralizada (en el padre pom.xml) por lo tanto mejor para el mantenimiento: puede añadir o quitar módulos en cualquier momento, simplemente cambiando la simple expresión regular anterior.

    Obviamente, si este no es el comportamiento predeterminado de la construcción (recomendado caso), siempre se puede envolver el fragmento de código anterior en un perfil de maven.


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

    Aquí estamos, en realidad, la sustitución de la expresión regex valor de una propiedad, test.regex, con el valor predeterminado para none (o lo que no coincide con ningún nombre de módulo o, también, el valor predeterminado saltar matchings necesario).

    A continuación, desde la línea de comandos podemos tener

    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)

    Lo que es, entonces en tiempo de ejecución de decidir, sin necesidad de cambiar el pom.xml archivo o la activación de cualquier perfil.

  4. 2

    Tuve un poco diferente de la necesidad de esta pregunta que puede resultar de gran ayuda. Yo quería excluir de la línea de comandos de un par de pruebas diferentes de distintos paquetes, por lo que un solo comodín no lo haría.

    He encontrado en Maven de Seguridad de la documentación de las reglas para las exclusiones que se puede especificar una lista separada por comas de expresión regular o comodín exclusiones:
    https://maven.apache.org/surefire/maven-failsafe-plugin/examples/inclusion-exclusion.html

    Así que mi pomfile se veía así:

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

    y mi línea de comandos incluida esta:

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

    Para mí el ingrediente clave era conseguir un montón de pruebas en uno de maven de la propiedad en una sola instrucción de exclusión.

  5. 2

    Utilizando Infalible Plugin 2.19 simplemente puede excluir las pruebas que usted no desea utilizar expresiones regulares:

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

    El comando anterior, se excluirán todas las pruebas que contienen excludedString.

    NB1 Si comillas dobles (» » ) se utiliza en lugar de apóstrofo(‘) el comando no será interpretado correctamente y se producen resultados inesperados. (Probado usando bash 3.2.57)

    NB2 debe prestarse Especial atención a los proyectos en los que varias versiones de la infalible plugin se utiliza. Versiones de segura mayores de 2.19 no se ejecutará ninguna prueba porque no admiten expresiones regulares.

    De la gestión de versiones(que podría ser una buena idea añadir esto en el padre pom archivo):

    <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 exámenes: https://artbcode.wordpress.com/2016/11/28/how-to-skip-a-subset-of-the-unit-tests/

    • Alguna idea de cómo saltarse varios patrones?
    • -Dtests no juega muy bien con segura de lo que parece. Las siguientes causas TODAS mis pruebas omitidas: mvn '-Dtest=!%regex[.*DeviceLogServiceTest.*]' --quiet install -Dsurefire.useFile=false -Dsurefire.printSummary=false -Dmaven.test.skip=false

Dejar respuesta

Please enter your comment!
Please enter your name here