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.