1. Введение
В этом кратком руководстве показано, как создать банку с помощью Maven, игнорируя результаты теста.
По умолчанию Maven автоматически запускает модульные тесты при сборке проекта. Однако бывают редкие случаи, когда тесты можно пропустить и нужно собирать проект вне зависимости от результатов тестов.
2. Создание проекта
Давайте создадим простой проект, в который мы также включим небольшой тестовый пример:
public class TestFail {
@Test
public void whenMessageAssigned_thenItIsNotNull() {
String message = "hello there";
assertNotNull(message);
}
}
Давайте создадим файл jar, выполнив следующую команду Maven:
mvn package
Это приведет к компиляции исходников и созданию файла maven-0.0.1-SNAPSHOT.jar
в каталоге /target.
Теперь давайте немного изменим тест, чтобы он начал давать сбои.
@Test
public void whenMessageAssigned_thenItIsNotNull() {
String message = null;
assertNotNull(message);
}
На этот раз, когда мы снова пытаемся запустить команду mvn package
, происходит сбой сборки и файл maven-0.0.1-SNAPSHOT.jar не создается.
Это означает, что если в нашем приложении есть неудачный тест, мы не можем предоставить исполняемый файл, пока не исправим тест.
Итак, как мы можем решить эту проблему?
3. Аргументы Знатока
У Maven есть свои аргументы для решения этой проблемы:
-Dmaven.test.failure.ignore=true
игнорирует любой сбой, возникающий во время выполнения теста .-Dmaven.test.skip=true
не будет компилировать тесты-fn
,-fae
никогда не приводит к сбою сборки независимо от результатов тестирования
Запустим команду mvn
package -Dmaven.test.skip=true
и посмотрим на результаты:
[INFO] Tests are skipped.
[INFO] BUILD SUCCESS
Это означает, что проект будет собран без компиляции тестов.
Теперь запустим команду mvn
package -Dmaven.test.failure.ignore=true
:
[INFO] Running testfail.TestFail
[ERROR] whenMessageAssigned_thenItIsNotNull java.lang.AssertionError
[INFO] BUILD SUCCESS
Наш модульный тест терпит неудачу при утверждении, но сборка проходит успешно.
Наконец, давайте проверим опции -fn
, -fae
. Обе команды package -fn
и package -fae
создают файл jar и выдают вывод
BUILD
SUCCESS независимо от того , когда тест whenMessageAssigned_thenItIsNotNull() завершается
сбоем.
В случае многомодульного проекта следует использовать опцию -fn .
-fae
продолжает работу с модулем, который не прошел тест, но пропускает все зависимые модули.
4. Плагин Maven Surefire
Еще один удобный способ достичь нашей цели — использовать плагин Maven Surefire.
Расширенный обзор подключаемого модуля Surefire см. в этой статье .
Чтобы игнорировать сбои теста, мы можем просто установить для свойства testFailureIgnore
значение true
:
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>${maven.surefire.version}</version>
<configuration>
<includes>
<include>TestFail.java</include>
</includes>
<testFailureIgnore>true</testFailureIgnore>
</configuration>
</plugin>
Теперь давайте посмотрим на вывод команды package
:
[INFO] T E S T S
[INFO] Running testfail.TestFail
[ERROR] Tests run: 1, Failures: 1, Errors: 0, Skipped: 0, <<< FAILURE! - in testfail.TestFail
Из вывода запущенных тестов мы видим, что класс TestFail дает
сбой. Но глядя дальше, мы видим, что сообщение BUILD SUCCESS тоже есть и файл maven-0.0.1-SNAPSHOT.jar скомпилирован.
В зависимости от нашей потребности, мы можем вообще не запускать тесты. Для этого мы можем заменить строку testFailureIgnore
на:
<skipTests>true</skipTests>
Или задайте аргумент командной строки -DskipTests
. Это скомпилирует тестовые классы, но полностью пропустит выполнение теста.
5. Вывод
В этой статье мы узнали, как собрать свой проект с помощью Maven вне зависимости от результатов тестирования . Мы рассмотрели практические примеры пропуска неудачных тестов или полного исключения компиляции тестов.
Как обычно, полный код для этой статьи доступен в проекте GitHub .