JUnit 5-пустой набор тестов в IntelliJ IDEA при использовании JUnit Jupiter engine

Как выполнить все тесты 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

я смог запустить suite с JUnit 4, но он не работает с JUnit 5.

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 игнорирует 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 в таких случаях приводит к пустая комната.

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

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

С уважением,

Сэм (JUnit 5 core committer)


по данным официальный сайт junit:

Просто убедитесь, что артефакт junit-vintage-engine находится в пути выполнения теста. В этом случае тесты JUnit 3 и JUnit 4 будут автоматически подобраны программой запуска платформы JUnit

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

но я думаю, что нашел хорошее решение для этого. Я придумал вот что:--6-->

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 не найдут другое решение для этот случай.