JUnit 5 — пустой набор тестов в IntelliJ IDEA при использовании движка JUnit Jupiter

Как выполнить тесты All Suite с помощью JUnit 5 в IntelliJ IDEA v2016.2.2?

Я получаю Пустой набор тестов, запускающий этот код:

import org.junit.platform.runner.IncludeEngines;
import org.junit.platform.runner.JUnitPlatform;
import org.junit.platform.runner.SelectPackages;
import org.junit.runner.RunWith;

@RunWith(JUnitPlatform.class)
@IncludeEngines("junit-jupiter")
@SelectPackages("<eu...package>") //I confirm that <eu...package> is ok.
public class AllTests {
}

Я получаю:

INFORMAZIONI: Discovered TestEngines with IDs: [junit-jupiter, junit-vintage]
Empty test suite.
Empty test suite.

[root]
JUnit Jupiter
JUnit Vintage

ИЛИ

import eu.....services.ServiceTest;
import eu.....repository.DAOTest;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;

@RunWith(Suite.class)
@Suite.SuiteClasses({
        ServiceTest.class,
        DAOTest.class
})
public class AllTests {
}

Я получаю:

INFORMAZIONI: Discovered TestEngines with IDs: [junit-jupiter, junit-vintage]
Empty test suite.

[root]
|+--JUnit Vintage
|   +--eu.....AllTests
|+--JUnit Jupiter

Мне удалось запустить пакет с JUnit 4, но он не работает с JUnit 5.


person Davideas    schedule 22.08.2016    source источник
comment
Чтобы правильно оценить, почему ваш тестовый набор пуст, нам нужно увидеть исходный код хотя бы одного из тестовых классов в пакете <eu...package>. Например, нам нужно будет убедиться, что вы используете правильные аннотации и что методы тестирования правильно аннотированы/объявлены.   -  person Sam Brannen    schedule 23.08.2016
comment
@SamBrannen, методы в настоящее время аннотированы org.junit.jupiter.api.Test. Если ставлю org.junit.Test то это Винтаж, работает если ставлю Люкс.класс, но это Винтаж. Я попросил выполнение пакета с JUnit5 (Юпитер). Как подтверждение, набор тестов также пуст в вашей библиотеке, когда вы выполняете тестовый класс SpringExtensionTestSuite.   -  person Davideas    schedule 23.08.2016
comment
Если вы git clone [email protected]:sbrannen/spring-test-junit5.git, cd spring-test-junit5 запустите gradlew eclipse и импортируете проект в Eclipse, я обещаю вам, что SpringExtensionTestSuite будет выполняться нормально и не будет пустым.   -  person Sam Brannen    schedule 23.08.2016
comment
Таким образом, вы, должно быть, делаете что-то неправильно, но я не могу вам больше помочь, не видя, что на самом деле идет не так.   -  person Sam Brannen    schedule 23.08.2016
comment
Короче говоря, проще всего создать простой проект, воспроизводящий проблему, с которой вы столкнулись, и опубликовать ее в своем репозитории GitHub. Тогда мы можем буквально проверить это. ;)   -  person Sam Brannen    schedule 23.08.2016
comment
@SamBrannen, ну, я могу создать пример проекта, но я использую IDEA, а не Eclipse.   -  person Davideas    schedule 24.08.2016
comment
После дальнейшего изучения я предполагаю, что это, возможно, ошибка в IDEA. Я отпишусь здесь с дополнительной информацией позже.   -  person Sam Brannen    schedule 24.08.2016
comment
Не могли бы вы сообщить нам, какую именно версию IDEA вы используете? Это очень важно знать как команде JUnit, так и команде IntelliJ. Итак, спасибо заранее!   -  person Sam Brannen    schedule 24.08.2016
comment
@SamBrannen, IntelliJ IDEA 2016.2.1 — сборка IU-162.1447.26   -  person Davideas    schedule 24.08.2016
comment
Спасибо, что сообщили нам версию IDEA, и если вы примете мой ответ, я буду признателен. ;)   -  person Sam Brannen    schedule 24.08.2016


Ответы (3)


Короткий ответ

Если вы используете IntelliJ IDEA 2016.2, в настоящее время невозможно выполнить тестовый класс с аннотацией @RunWith(JUnitPlatform.class) в среде IDE.

Длинный ответ

Основываясь на поведении, о котором вы сообщили, после кропотливой исследовательской работы, я полагаю, что у меня есть ответ на ваш вопрос...

Если вы используете IntelliJ IDEA 2016.2 со встроенной поддержкой JUnit 5, происходит следующее.

  1. IDEA запускает платформу JUnit через Launcher API, выбирая тестовый класс с аннотацией @RunWith(JUnitPlatform.class) (назовем его TestSuite).
  2. Launcher обнаруживает реализации как junit-jupiter, так и junit-vintage TestEngine.
  3. Движок JUnit Jupiter игнорирует TestSuite, поскольку технически он не является тестовым классом JUnit Jupiter.
  4. Движок JUnit Vintage также игнорирует TestSuite, так как он снабжен аннотацией @RunWith(JUnitPlatform.class).
  5. Конечным результатом является то, что ни один из зарегистрированных тестовых движков не утверждает, что он может запускать класс TestSuite.

Неинтуитивная часть заключается в том, что движок JUnit Vintage игнорирует TestSuite, хотя на самом деле он выглядит как тестовый класс на основе JUnit 4, поскольку он помечен @RunWith(). Причина, по которой он игнорируется, заключается в том, чтобы избежать бесконечной рекурсии, что объясняется в исходном коде для DefensiveAllDefaultPossibilitiesBuilder:

if ("org.junit.platform.runner.JUnitPlatform".equals(runnerClass.getName())) {
    return null;
}

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

Конечно, было бы лучше, если бы пользователь был проинформирован о таких сценариях, например, через оператор журнала. Поэтому я открыл вопросы как для JUnit 5, так и для IntelliJ для повышения удобства использования в таких сценариях.

С положительной стороны, поскольку вы используете IntelliJ IDEA 2016.2, вам не нужно использовать поддержку набора тестов. Вместо этого вы можете просто щелкнуть правой кнопкой мыши src/test/java в представлении проекта в IDEA и выбрать Run 'All Tests', и все ваши тесты будут запущены.

С уважением,

Сэм (основной коммиттер JUnit 5)

person Sam Brannen    schedule 24.08.2016
comment
Хорошо, в конце концов, вы узнали причину. Я не мог представить, что это была IDE. Хорошая работа, Сэм. Тогда я прогоню все тесты из папки. - person Davideas; 25.08.2016
comment
Спасибо. Мой люкс не работал. Щелчок правой кнопкой мыши для запуска всех тестов работал отлично. - person mitch; 05.05.2020

Дополнение к ответу Сэма Браннена. Мне нужен TestSuit для настройки серверной части перед запуском всех тестовых классов в пакете. Это, вероятно, невозможно через Run 'All Tests'.

Но я думаю, что нашел хороший обходной путь для этого. Я придумал это:

import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Nested;
import your.other.package.test.classes.*;

public class TestSuit {
    @BeforeAll
    public static void setup(){}

    @Nested
    public class TestExtender extends MyTestClass {}
}

Вы можете расширить каждый тестовый класс из другого пакета и добавить к нему аннотацию @Nested. Это не лучшее решение, но это обходной путь, пока IDEA или JUnit 5 не найдут другое решение для этих случаев.

person Highchiller    schedule 23.02.2017

Согласно официальному веб-сайту Junit:

Just make sure that the junit-vintage-engine artifact is in your test runtime path. In that case JUnit 3 and JUnit 4 tests will automatically be picked up by the JUnit Platform launcher
person tnas    schedule 22.08.2016
comment
это не работает ваше решение. В методах тестовых классов у меня есть org.junit.jupiter.api.Test, и если выполнять тесты только для этого класса, он работает под движком Jupiter. Также, если я ставлю org.junit.Test, значит Винтаж и действительно Сюитное исполнение выполнено в Винтаже! Но это не то, чего мы все хотим. Прошил JUnit5 так с движком Юпитер, думаю это очевидно, иначе зачем переходить на JUnit5? Я имею в виду [4.4.4. Test Suite] в официальной документации сайта. - person Davideas; 23.08.2016