Перейти к основному содержимому

Пропуск тестов с помощью Maven

· 4 мин. чтения

1. Введение

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

Только в таких ситуациях мы можем пропустить тесты, чтобы избежать накладных расходов на их компиляцию и запуск. Конечно, учтите, что невыполнение тестов может привести к неправильным методам написания кода.

В этом кратком руководстве мы рассмотрим все возможные команды и параметры для пропуска тестов с помощью Maven .

2. Жизненный цикл Мавена

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

  1. Игнорировать тесты
  2. Компиляция тестов
  3. Запустить тесты

В наших примерах мы будем использовать этап пакета , который включает в себя компиляцию и запуск тестов. Параметры, рассматриваемые в этом руководстве, относятся к подключаемому модулю Maven Surefire .

3. Использование флагов командной строки

3.1. Пропуск тестовой компиляции

Во-первых, давайте рассмотрим пример теста, который не компилируется:

@Test
public void thisDoesntCompile() {
foreach;
}

Когда мы запускаем команду командной строки:

mvn package

Мы получим ошибку:

[INFO] -------------------------------------------------------------
[ERROR] COMPILATION ERROR :
[INFO] -------------------------------------------------------------
[ERROR] /Users/foreach/skip-tests/src/test/java/com/antmordel/skiptests/PowServiceTest.java:[11,9] not a statement
[INFO] 1 error

Поэтому давайте рассмотрим, как пропустить фазу компиляции исходников теста. В Maven мы можем использовать флаг maven.test.skip :

mvn -Dmaven.test.skip package

В результате исходники тестов не компилируются и, следовательно, не выполняются.

3.2. Пропуск выполнения теста

В качестве второго варианта давайте посмотрим, как мы можем скомпилировать тестовую папку, но пропустить процесс запуска . Это полезно для тех случаев, когда мы не меняем сигнатуру методов или классов, но мы изменили бизнес-логику и в результате сломали тесты. Давайте рассмотрим надуманный тестовый пример, подобный приведенному ниже, который всегда будет давать сбой:

@Test
public void thisTestFails() {
fail("This is a failed test case");
}

Поскольку мы включили оператор fail() , если мы запустим фазу пакета , сборка завершится ошибкой:

[ERROR] Failures:
[ERROR] PowServiceTest.thisTestFails:16 This is a failed test case
[INFO]
[ERROR] Tests run: 2, Failures: 1, Errors: 0, Skipped: 0

Давайте представим, что мы хотим пропустить запуск тестов, но все же хотим их скомпилировать. В этом случае мы можем использовать флаг -DskipTests :

mvn -DskipTests package

и этап пакета завершится успешно. Также в Maven есть специальный плагин для запуска интеграционных тестов, который называется maven failsafe plugin . -DskipTests пропустит выполнение как модульных тестов (надежных), так и интеграционных тестов (отказоустойчивых) . Чтобы просто пропустить интеграционные тесты, мы можем передать системное свойство -DskipITs .

Наконец, стоит упомянуть, что устаревший флаг -Dmaven.test.skip.exec также компилирует тестовые классы, но не запускает их.

4. Использование конфигурации Maven

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

4.1. Пропуск тестовой компиляции

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

<properties>
<maven.test.skip>true</maven.test.skip>
</properties>

Имейте в виду, что мы можем переопределить это значение, добавив противоположный флаг в командную строку :

mvn -Dmaven.test.skip=false package

4.2. Пропуск выполнения теста

Опять же, в качестве второго шага, давайте рассмотрим, как мы можем создать тестовую папку, но пропустить выполнение теста, используя конфигурацию Maven. Для этого нам нужно настроить плагин Maven Surefire со свойством:

<properties>
<tests.skip>true</tests.skip>
</properties>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
<configuration>
<skipTests>${tests.skip}</skipTests>
</configuration>
</plugin>

Свойство Maven testings.skip — это пользовательское свойство, которое мы определили ранее. Поэтому мы можем переопределить его, если хотим выполнить тесты:

mvn -Dtests.skip=false package

4. Вывод

В этом кратком руководстве мы рассмотрели все альтернативы, которые предлагает Maven, чтобы пропустить компиляцию и/или запуск тестов.

Мы рассмотрели параметры командной строки Maven и параметры конфигурации Maven.