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, то происходит следующее.
- IDEA запускает платформу JUnit через
Launcher
API, выбор тестового класса с аннотацией@RunWith(JUnitPlatform.class)
(назовем егоTestSuite
). - на
Launcher
определяет какjunit-jupiter
иjunit-vintage
TestEngine
реализаций. - двигатель Юпитера JUnit игнорирует
TestSuite
поскольку это технически не тестовый класс JUnit Jupiter. - двигатель JUnit Vintage также игнорирует
TestSuite
так как он аннотируется с@RunWith(JUnitPlatform.class)
. - конечный результат заключается в том, что ни один зарегистрированный тестовый движок не утверждает, что он может запустить
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 не найдут другое решение для этот случай.