Построить банку с Maven и игнорировать результаты теста

Построить банку с Maven и игнорировать результаты теста

1. Вступление

Это краткое руководство показывает, как создать банку с Maven, игнорируя результаты теста.

По умолчанию Maven запускает модульные тесты автоматически при сборке проекта. Однакоthere are rare cases when the tests can be skipped and we need to build the project regardless of the test results.

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 не создается.

Это означает, чтоif we have a failing test in our application, we can’t provide an executable file unless we fix the test.

Итак, как мы можем решить эту проблему?

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 обратитесь кthis article.

To ignore test fails we can simply set the testFailureIgnore property to true:


    maven-surefire-plugin
    ${maven.surefire.version}
    
        
            TestFail.java
        
        true
    

Теперь посмотрим на результат выполнения команды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 на:

true

Или установите аргумент командной строки-DskipTests. Это скомпилирует тестовые классы, но полностью пропустит выполнение теста.

5. Заключение

In this article, we learned how to build our project with Maven regardless of the test results. Мы рассмотрели практические примеры пропуска неудачных тестов или исключения их составления.

Как обычно, доступен полный код этой статьиover on GitHub project.