Пропуск тестов в некоторых модулях в Maven - PullRequest
63 голосов
/ 21 апреля 2009

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

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

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

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

Ответы [ 5 ]

72 голосов
/ 21 апреля 2009

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

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

30 голосов
/ 11 марта 2010

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

<profile>
   <id>noTest</id>
    <properties>
       <maven.test.skip>true</maven.test.skip>
    </properties>
 </profile>
5 голосов
/ 18 сентября 2016

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

2 голосов
/ 09 декабря 2016

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

В правилах документации 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 в одном исключении.

2 голосов
/ 04 ноября 2016

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

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

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

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

...