Подтвердить что ты не робот

Пропуск тестов в некоторых модулях в Maven

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

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

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

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

4b9b3361

Ответ 1

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

В 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, он не будет запускать тесты для этого модуля.

Ответ 2

Я думаю, что это проще, а также полезно работать для тестов non-surefire (в моем случае, FlexUnitTests)

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

Ответ 3

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

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

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

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

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

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

Для меня ключевым компонентом было получение кучи тестов в одно свойство maven в одном объявлении exclude.

Ответ 4

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


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

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

Здесь мы фактически заменяем значение regex свойством 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 или активировать любой профиль.

Ответ 5

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

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

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

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

NB2 Особое внимание следует уделять проектам, в которых используется несколько версий плагина 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.com/how-to-skip-a-subset-of-the-unit-tests/