1. Введение
В этом кратком руководстве показано, как создать банку с помощью Maven, игнорируя результаты теста.
По умолчанию Maven автоматически запускает модульные тесты при сборке проекта. Однако бывают редкие случаи, когда тесты можно пропустить и нужно собирать проект вне зависимости от результатов тестов.
2. Создание проекта
Давайте создадим простой проект, в который мы также включим небольшой тестовый пример:
Давайте создадим файл jar, выполнив следующую команду Maven:
public class TestFail {
@Test
public void whenMessageAssigned_thenItIsNotNull() {
String message = "hello there";
assertNotNull(message);
}
}
Это приведет к компиляции исходников и созданию файла maven-0.0.1-SNAPSHOT.jar в каталоге /target.
mvn package
Теперь давайте немного изменим тест, чтобы он начал давать сбои.
На этот раз, когда мы снова пытаемся запустить команду mvn package, происходит сбой сборки и файл maven-0.0.1-SNAPSHOT.jar не создается.
@Test
public void whenMessageAssigned_thenItIsNotNull() {
String message = null;
assertNotNull(message);
}
Это означает, что если у нас есть неудачный тест в нашем приложении, мы не можем предоставить исполняемый файл, пока не исправим тест.
Итак, как мы можем решить эту проблему?
3. Аргументы Maven
У 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:
Теперь давайте посмотрим на вывод команды package: Класс TestFail не работает. Но глядя дальше, мы видим, что сообщение BUILD SUCCESS тоже есть и файл maven-0.0.1-SNAPSHOT.jar скомпилирован.
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>${maven.surefire.version}</version>
<configuration>
<includes>
<include>TestFail.java</include>
</includes>
<testFailureIgnore>true</testFailureIgnore>
</configuration>
</plugin>
В зависимости от наших потребностей, мы можем вообще не запускать тесты. Для этого мы можем заменить строку testFailureIgnore на:
[INFO] T E S T S
[INFO] Running testfail.TestFail
[ERROR] Tests run: 1, Failures: 1, Errors: 0, Skipped: 0, <<< FAILURE! - in testfail.TestFail
Или установить аргумент командной строки -DskipTests. Это скомпилирует тестовые классы, но полностью пропустит выполнение теста.
5. Заключение
<skipTests>true</skipTests>
В этой статье мы узнали, как собрать наш проект с помощью Maven независимо от результатов тестирования. Мы рассмотрели практические примеры пропуска неудачных тестов или полного исключения компиляции тестов.
Как обычно, полный код для этой статьи доступен в проекте GitHub.
«
As usual, the complete code for this article is available over on GitHub project.