[Maven+JUnit] Выдаёт ошибку если один из тестов fail

Всем доброго времени суток, господа!
Уже длительное время борюсь с проблемой запуска тестов.
Всё просто, есть проект на Java (Maven+JUnit) в котором 1 класс ForTest и 2 тестовых метода forTsts и forTsts2:

import org.junit.Assert;
import org.junit.Test;

public class ForTest {

    @Test
    public void forTsts(){
        System.out.println("Test runs bad");
        Assert.fail();
    }

    @Test
    public void forTsts2(){
        System.out.println("Test runs good");
    }
}

Также прикладываю файл pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>tcs_web</groupId>
    <artifactId>tcs_web_3</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-server</artifactId>
            <version>3.0.1</version>
        </dependency>
    </dependencies>

</project>

Вроде всё элементарно. Запускаю через командную строку - mvn test.
Но в данном случае (первый тест заведомо fail) выдаёт ошибку.
Если все тесты будут pass то всё проходит отлично.

Текст ошибки:

[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building tcs_web_3 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ tcs_web_3 ---
[WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 0 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ tcs_web_3 ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ tcs_web_3 ---
[WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory D:\popovich\Autotests\TCS Web\src\test\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ tcs_web_3 ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ tcs_web_3 ---
[INFO] Surefire report directory: D:\popovich\Autotests\TCS Web\target\surefire-reports

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running ForTest
Test runs bed
Test runs good
Tests run: 2, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 0.068 sec <<< FAILURE!
forTsts(ForTest)  Time elapsed: 0.008 sec  <<< FAILURE!
java.lang.AssertionError
        at org.junit.Assert.fail(Assert.java:86)
        at org.junit.Assert.fail(Assert.java:95)
        at ForTest.forTsts(ForTest.java:12)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
        at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
        at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
        at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
        at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
        at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
        at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
        at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
        at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
        at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
        at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
        at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
        at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
        at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:252)
        at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:141)
        at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:112)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:189)
        at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:165)
        at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:85)
        at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:115)
        at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:75)


Results :

Failed tests:   forTsts(ForTest)

Tests run: 2, Failures: 1, Errors: 0, Skipped: 0

[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 7.298 s
[INFO] Finished at: 2017-01-11T21:52:51+02:00
[INFO] Final Memory: 11M/173M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.12.4:test (default-test) on project tcs_web_3: There are test failures.
[ERROR]
[ERROR] Please refer to D:\popovich\Autotests\TCS Web\target\surefire-reports for the individual test results.
[ERROR] -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException

В связи с этим прошу помощи. Видимо элементарщина какая-то, но разобраться не удаётся и гугл как-то не особо помогает. Заранее всем большое спасибо!))

Ну это правильное поведение. Если хочешь игнорить файлы укажи в плагине параметр, не фейлить билд.

Ну то, что билд фейлится - это я понимаю что нормально. Но почему вываливает ERROR? И в этом случае не генерируются отчёты (если например подключить Allure).

Попробуй failsafe plugin. Maven Failsafe Plugin – Introduction

PS: Команда запуска будет: mvn verify

Попробовал. Добавил в pom.xml данный плагин, как написано в tutorial. Запустил через mvn verify, выдаёт всё туже ошибку.

Возможно я недостаточно осветил свою проблему…
Вообщем суть такова:
Эта проблема наблюдается в довольно большем проекте, который ежедневно запускается из Jenkins и по итогу генерирует Allure отчёт. Если все тесты проходят успешно - приходит письмо на почту типа - Build Success. Но если хотя бы один из тестов не пройдёт, то отчёт не генерируется и приходит письмо типа - Build Fail без отчёта.
На данный момент используется следующее решение:
В pom.xml игнорируются не прошедшие тесты и даже если несколько тестов упало то билд отмечается как Success и отчёт формируется, и письмо приходит типа - Build Success с отчётом.
Но неудобство заключается в том что если тесты не прошли, то тебе всё-равно придёт письмо типа - Build Success. Т.е. в каждый отчёт нужно постоянно заходить и проверять не упали ли какие-то тесты.
Надеюсь содержательно изложил. Возможно так решение найти будет проще.
Спасибо большое всем за отклик!):+1:

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

2 лайка

Ваша проблема совершенно не связана с указанным summary / description.
Тест падает из-за использованного assert - так и должно быть. Но это никак не связано с генерацией отчета в Jenkins. Как уже сказал @BabyRoot, у вас вероятно джоба настроена таким образом, что отчеты генерируются только в случае success build. Проблема элементарно решается путем изменения стратегии выполнения post steps:

Третья опция не совсем подходит, т.к. в случае , к примеру, ошибок компиляции у вас вообще никаких результатов не будет для формирования репорта, и соответствующей отправки.

1 лайк

Т.е. если я через cmd запущу тесты - mvn test site , то нормально что не будет генерироваться отчёт?
Просто в моём случае отчёт формируется не в Post Steps а непосредственно во время сборки. Т.е. в jenkins просто запускается mvn test site, а в Post Steps только отправка писем.
Попробую добавить генерацию отчёта allure в post steps…

Начнем с того, что пока не совсем очевидно, чем именно вы генерируете репорты - jenkins или maven плагином. Из куска приведенного pom этого не определить. Но исходя из:

mvn test site

Я так понимаю, что мейвеном. Тогда вообще удивительно, как оно у вас в принципе что-либо собирает, т.к. site goal должен выполняться отдельной командой - постфактум, после прогона тестов. По этой же причине и локально отчет не собирается.

1 лайк

Действительно очень странно как это всё сейчас работает!)) :joy:
По всей видимости потому что для плагина выставлено testFailureIgnore.
Попробую убрать testFailureIgnore, в Post Step указать генерацию отчёта Allure, а потом собрать проект с помощью mvn test. Кажется так должно всё заработать))
Спасибо огромное за помощь)

После mvn test надо выполнить mvn site (если речь о локальном билде). В Jenkins сей дополнительный шаг выполняется при помощи invoke top level maven target опции. После этого нужно будет еще и опубликовать репорты при помощи html publisher plugin.

В качестве альтернативы можно использовать allure jenkins plugin. Но там совсем другая специфика, не завязанная на maven.

1 лайк

При локальной сборке всё понятно, получилось, проблема решилась спасибо!))
Но при сборке в Jenkins не совсем понимаю как сделать…
В разделе Build создал две invoke top level maven target опции:

Настроил html publisher plugin.

Однако по прежнему, если тесты упали - отчёт не формирует. По всей видимости я опять что-то не так сделал)

Ага… нашёл похожую темку с таким сообщением. Вот там есть скрин на котором всё понятно. Однако это видимо для старой версии Jenkins. У меня Jenkins 2.9 и там это выглядит иначе. Я не могу в Post Steps указать invoke top level maven target. :disappointed_relieved:

Да ну? На том скрине версия 2+, что должно быть прекрасно видно из интерфейса. Вот вам версия, которая “немного” новее вашей текущей.

Но исходя из того, что у вас в build секции в принципе нет дефолтных maven филдов, смею предположить, что тип джобы у вас совсем не maven?

1 лайк

Прям в точку!!) Вы гений!) Пошёл изучать настройку Maven проектов в Jenkins :footprints:
Спасибо Вам большое!) :+1::+1::+1::+1::+1::+1::+1::+1::+1::+1::+1::+1::+1::+1:

Настроил. Всё работает как часы!) Безмерно Вам благодарен!)

Жаль только что через html publisher plugin отчёты Allure не грузятся в браузере…(

Это уже другая проблема. Ищите на форуме. Только сегодня 2 раза обсуждалось.