Вопрос

Я бы хотел, чтобы мои сборки Maven выполняли большинство модульных тестов.Но в одном проекте есть модульные тесты, которые медленнее, и я бы хотел их вообще исключить;и время от времени включайте их.

Вопрос:Как мне это сделать?

я знаю о -Dmaven.test.skip=true, но это отключает все модульные тесты.

Я также знаю о пропуске интеграционных тестов, описанном здесь.Но у меня нет интеграционных тестов, только модульные тесты, и у меня нет явных вызовов плагина maven-surefire-plugin.(Я использую Maven 2 с плагином Eclipse-Maven).

Это было полезно?

Решение

А как насчет пропуска тестов только в этом модуле?

В pom.xml этого модуля:

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

В конце концов, вы можете создать профиль, который отключит тесты (все еще pom.xml модуля):

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

В последнем решении, если вы запустите mvn clean package, он выполнит все тесты.Если ты бежишь mvn clean package -DnoTest=true, он не будет запускать тесты для этого модуля.

Другие советы

Я думаю, что это проще, а также дает преимущество работы с ненадежными тестами (в моем случае FlexUnitTests).

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

Если у вас большой многомодульный проект и вы хотите пропустить тесты только в определенных модулях без необходимости менять каждый модуль pom.xml файл с пользовательской конфигурацией и профилированием, вы можете добавить следующее в родительский файл 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>

Благодаря build-helper-maven-plugin на самом деле вы бы динамически проверяли, находитесь ли вы в определенном модуле или нет во время сборки, через project.artifactId свойство (указывая на каждое artifactId модуля во время сборки), регулярное выражение затем будет искать совпадения для определенных значений (имен модулей, для которых вы хотите пропустить тесты) и заполнять maven.test.skip соответственно (установив для него значение true).

В этом случае тесты будут пропущены для module1 и module3 при правильной работе для module2, то есть, как выражено регулярным выражением.

Преимущество этого подхода в том, что он динамичен и централизован (в родительском pom.xml), следовательно, лучше для обслуживания:вы можете добавлять или удалять модули в любое время, просто изменив простое регулярное выражение выше.

Очевидно, что если это не поведение сборки по умолчанию (рекомендуемый случай), вы всегда можете обернуть приведенный выше фрагмент в профиль maven.


Вы также можете пойти дальше и иметь динамическое поведение на основе вашего ввода:

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

Здесь мы фактически заменяем значение регулярного выражения свойством, test.regex, со значением по умолчанию none (или что-то еще, что не соответствует ни одному имени модуля или, кроме того, требуемым пропускам совпадений по умолчанию).

Тогда из командной строки мы могли бы иметь

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)

То есть, во время выполнения вы сами решаете, без необходимости менять pom.xml файл или активируя любой профиль.

У меня была немного другая потребность в этом вопросе, которая может оказаться полезной.Я хотел исключить из командной строки несколько разных тестов из разных пакетов, чтобы один подстановочный знак не помог.

В правилах документации Maven Failsafe для исключений я нашел, что вы можете указать разделенный запятыми список исключений по регулярным выражениям или подстановочным знакам:https://maven.apache.org/surefire/maven-failsafe-plugin/examples/inclusion-exclusion.html

Итак, мой помфайл выглядел так:

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

и моя командная строка включала это:

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

Для меня ключевым моментом было получение множества тестов для одного свойства maven в одном операторе исключения.

Используя плагин Surefire 2.19, вы можете просто исключить ненужные тесты, используя регулярные выражения:

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

Приведенная выше команда исключит все тесты, содержащие исключенная строка.

НБ1 Если вместо апострофа (') используется двойная кавычка("), команда не будет интерпретирована должным образом и приведет к неожиданным результатам.(Протестировано с использованием bash 3.2.57)

НБ2 Особое внимание следует уделить проектам, в которых используется несколько версий плагина Surefire.Версии Surefire старше 2.19 не будут выполнять никаких тестов, поскольку они не поддерживают регулярные выражения.

Управление версиями (возможно, было бы неплохо добавить это в родительский файл 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>

Примеры команд сборки, пропускающих тесты: https://artbcode.wordpress.com/2016/11/28/how-to-skip-a-subset-of-the-unit-tests/

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top