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



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



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



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



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

1122   5  

5 ответов:

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

В пом.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 file:

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

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

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

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

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

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

Comments

    Ничего не найдено.